Fix the download progress not updating

Integer roundoff errors...
This commit is contained in:
Bradlee Speice 2014-11-20 23:19:06 -05:00
parent 06ae1c0ed6
commit 90db3e6a1a
4 changed files with 38 additions and 26 deletions

View File

@ -0,0 +1,20 @@
/**
* Created by bspeice on 11/20/14.
*/
import org.junit.Test
import org.bspeice.minimalbible.activity.downloader.manager.DLProgressEvent
import org.crosswire.jsword.book.Book
import org.mockito.Mockito
import org.junit.Assert
class DLProgressEventTest {
val b = Mockito.mock(javaClass<Book>())
Test fun fiftyPercentIsOneEighty() {
val e = DLProgressEvent(50, b)
Assert.assertEquals(180, e.toCircular())
}
}

View File

@ -77,7 +77,7 @@ public class BookItemHolder {
.subscribe(new Action1<DLProgressEvent>() { .subscribe(new Action1<DLProgressEvent>() {
@Override @Override
public void call(DLProgressEvent event) { public void call(DLProgressEvent event) {
BookItemHolder.this.displayProgress((int) event.toCircular()); BookItemHolder.this.displayProgress(event.toCircular());
} }
}); });
} }
@ -104,21 +104,15 @@ public class BookItemHolder {
/** /**
* Display the current progress of this download * Display the current progress of this download
* TODO: Clean up this logic if at all possible...
* @param progress The progress out of 360 (degrees of a circle) * @param progress The progress out of 360 (degrees of a circle)
*/ */
private void displayProgress(int progress) { private void displayProgress(int progress) {
int downloadView;
if (progress == DLProgressEvent.PROGRESS_BEGINNING) { if (progress == DLProgressEvent.PROGRESS_BEGINNING) {
// Download starting // Download starting
RelativeLayout.LayoutParams acronymParams = downloadView = downloadProgress.getId();
(RelativeLayout.LayoutParams)acronym.getLayoutParams();
acronymParams.addRule(RelativeLayout.LEFT_OF, downloadProgress.getId());
RelativeLayout.LayoutParams nameParams =
(RelativeLayout.LayoutParams)itemName.getLayoutParams();
nameParams.addRule(RelativeLayout.LEFT_OF, downloadProgress.getId());
isDownloaded.setVisibility(View.GONE); isDownloaded.setVisibility(View.GONE);
downloadProgress.setVisibility(View.VISIBLE); downloadProgress.setVisibility(View.VISIBLE);
@ -126,13 +120,7 @@ public class BookItemHolder {
downloadProgress.spin(); downloadProgress.spin();
} else if (progress < 360) { } else if (progress < 360) {
// Download in progress // Download in progress
RelativeLayout.LayoutParams acronymParams = downloadView = downloadProgress.getId();
(RelativeLayout.LayoutParams)acronym.getLayoutParams();
acronymParams.addRule(RelativeLayout.LEFT_OF, downloadProgress.getId());
RelativeLayout.LayoutParams nameParams =
(RelativeLayout.LayoutParams)itemName.getLayoutParams();
nameParams.addRule(RelativeLayout.LEFT_OF, downloadProgress.getId());
isDownloaded.setVisibility(View.GONE); isDownloaded.setVisibility(View.GONE);
downloadProgress.setVisibility(View.VISIBLE); downloadProgress.setVisibility(View.VISIBLE);
@ -142,18 +130,20 @@ public class BookItemHolder {
} else { } else {
// Download complete // Download complete
subscription.unsubscribe(); subscription.unsubscribe();
RelativeLayout.LayoutParams acronymParams = downloadView = downloadProgress.getId();
(RelativeLayout.LayoutParams)acronym.getLayoutParams();
acronymParams.addRule(RelativeLayout.LEFT_OF, isDownloaded.getId());
RelativeLayout.LayoutParams nameParams =
(RelativeLayout.LayoutParams)itemName.getLayoutParams();
nameParams.addRule(RelativeLayout.LEFT_OF, isDownloaded.getId());
isDownloaded.setVisibility(View.VISIBLE); isDownloaded.setVisibility(View.VISIBLE);
downloadProgress.setVisibility(View.GONE); downloadProgress.setVisibility(View.GONE);
displayInstalled(); displayInstalled();
} }
RelativeLayout.LayoutParams acronymParams =
(RelativeLayout.LayoutParams) acronym.getLayoutParams();
acronymParams.addRule(RelativeLayout.LEFT_OF, downloadView);
RelativeLayout.LayoutParams nameParams =
(RelativeLayout.LayoutParams) itemName.getLayoutParams();
nameParams.addRule(RelativeLayout.LEFT_OF, downloadView);
} }
public void onScrollOffscreen() { public void onScrollOffscreen() {

View File

@ -114,8 +114,10 @@ class BookManager(private val installedBooks: Books, val rM: RefreshManager) :
val job = ev.getJob() val job = ev.getJob()
bookMappings.filter { it.getKey() == job.getJobID() } bookMappings.filter { it.getKey() == job.getJobID() }
.map { .map {
val event = DLProgressEvent(job.getWorkDone() / job.getTotalWork() * 100, // We multiply by 100 first to avoid integer truncation
it.getValue()) // Also avoids roundoff error. Neat trick, but I'm spending just as much time
// documenting it as implementing the floating point would take
val event = DLProgressEvent(job.getWorkDone() * 100 / job.getTotalWork(), it.getValue())
downloadEvents onNext event downloadEvents onNext event
if (job.getWorkDone() == job.getTotalWork()) { if (job.getWorkDone() == job.getTotalWork()) {

View File

@ -12,5 +12,5 @@ class DLProgressEvent(val progress: Int, val b: Book) {
val PROGRESS_BEGINNING = 0 val PROGRESS_BEGINNING = 0
} }
fun toCircular() = progress.toFloat() * 360 / 100 fun toCircular() = (progress.toFloat() * 360 / 100).toInt()
} }