aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2012-12-03 20:25:56 +0900
committerJean Chalard <jchalard@google.com>2013-04-30 15:48:26 +0900
commit01170ffebeb4a604667abb84310ed4e910f97bf7 (patch)
tree480a96d50aec419b150b620b1e4065717192f557 /java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java
parent965329c192ee385c83ccf9b054063f9a68cca34b (diff)
downloadlatinime-01170ffebeb4a604667abb84310ed4e910f97bf7.tar.gz
latinime-01170ffebeb4a604667abb84310ed4e910f97bf7.tar.xz
latinime-01170ffebeb4a604667abb84310ed4e910f97bf7.zip
[PB13] Actually update the progress bar
Bug: 7600384 Change-Id: Iaa8f3a59243a15d2a01aaf6017ed85c52b6482a6
Diffstat (limited to 'java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java')
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java65
1 files changed, 60 insertions, 5 deletions
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java
index a6376a54c..307749121 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java
@@ -16,9 +16,13 @@
package com.android.inputmethod.dictionarypack;
+import android.app.DownloadManager;
+import android.app.DownloadManager.Query;
import android.content.ContentValues;
import android.content.Context;
+import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
+import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
@@ -78,7 +82,8 @@ public class DictionaryDownloadProgressBar extends ProgressBar {
mReporterThread = null;
return;
}
- final UpdaterThread updaterThread = new UpdaterThread(downloadManagerPendingId);
+ final UpdaterThread updaterThread =
+ new UpdaterThread(getContext(), downloadManagerPendingId);
updaterThread.start();
mReporterThread = updaterThread;
} else {
@@ -99,23 +104,73 @@ public class DictionaryDownloadProgressBar extends ProgressBar {
updateReporterThreadRunningStatusAccordingToVisibility();
}
- private static class UpdaterThread extends Thread {
- private final static int REPORT_PERIOD = 1000; // how often to report progress
+ private class UpdaterThread extends Thread {
+ private final static int REPORT_PERIOD = 150; // how often to report progress, in ms
+ final DownloadManager mDownloadManager;
final int mId;
- public UpdaterThread(final int id) {
+ public UpdaterThread(final Context context, final int id) {
super();
+ mDownloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
mId = id;
}
@Override
public void run() {
try {
- // TODO: implement the actual query and reporting
+ // It's almost impossible that mDownloadManager is null (it would mean it has been
+ // disabled between pressing the 'install' button and displaying the progress
+ // bar), but just in case.
+ if (null == mDownloadManager) return;
+ final UpdateHelper updateHelper = new UpdateHelper();
+ final Query query = new Query().setFilterById(mId);
+ int lastProgress = 0;
while (!isInterrupted()) {
+ final Cursor cursor = mDownloadManager.query(query);
+ if (null == cursor) {
+ // Can't contact DownloadManager: this should never happen.
+ return;
+ }
+ try {
+ if (cursor.moveToNext()) {
+ final int columnBytesDownloadedSoFar = cursor.getColumnIndex(
+ DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
+ final int bytesDownloadedSoFar =
+ cursor.getInt(columnBytesDownloadedSoFar);
+ updateHelper.setProgressFromAnotherThread(bytesDownloadedSoFar);
+ } else {
+ // Download has finished and DownloadManager has already been asked to
+ // clean up the db entry.
+ updateHelper.setProgressFromAnotherThread(getMax());
+ return;
+ }
+ } finally {
+ cursor.close();
+ }
Thread.sleep(REPORT_PERIOD);
}
} catch (InterruptedException e) {
// Do nothing and terminate normally.
}
}
+
+ private class UpdateHelper implements Runnable {
+ private int mProgress;
+ @Override
+ public void run() {
+ setProgress(mProgress);
+ }
+ public void setProgressFromAnotherThread(final int progress) {
+ if (mProgress != progress) {
+ mProgress = progress;
+ // For some unknown reason, setProgress just does not work from a separate
+ // thread, although the code in ProgressBar looks like it should. Thus, we
+ // resort to a runnable posted to the handler of the view.
+ final Handler handler = getHandler();
+ // It's possible to come here before this view has been laid out. If so,
+ // just ignore the call - it will be updated again later.
+ if (null == handler) return;
+ handler.post(this);
+ }
+ }
+ }
}
}