am 01170ffe: [PB13] Actually update the progress bar

* commit '01170ffebeb4a604667abb84310ed4e910f97bf7':
  [PB13] Actually update the progress bar
main
Jean Chalard 2013-04-30 00:09:52 -07:00 committed by Android Git Automerger
commit 69e1e45c01
1 changed files with 60 additions and 5 deletions

View File

@ -16,9 +16,13 @@
package com.android.inputmethod.dictionarypack; package com.android.inputmethod.dictionarypack;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.os.Handler;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@ -78,7 +82,8 @@ public class DictionaryDownloadProgressBar extends ProgressBar {
mReporterThread = null; mReporterThread = null;
return; return;
} }
final UpdaterThread updaterThread = new UpdaterThread(downloadManagerPendingId); final UpdaterThread updaterThread =
new UpdaterThread(getContext(), downloadManagerPendingId);
updaterThread.start(); updaterThread.start();
mReporterThread = updaterThread; mReporterThread = updaterThread;
} else { } else {
@ -99,23 +104,73 @@ public class DictionaryDownloadProgressBar extends ProgressBar {
updateReporterThreadRunningStatusAccordingToVisibility(); updateReporterThreadRunningStatusAccordingToVisibility();
} }
private static class UpdaterThread extends Thread { private class UpdaterThread extends Thread {
private final static int REPORT_PERIOD = 1000; // how often to report progress private final static int REPORT_PERIOD = 150; // how often to report progress, in ms
final DownloadManager mDownloadManager;
final int mId; final int mId;
public UpdaterThread(final int id) { public UpdaterThread(final Context context, final int id) {
super(); super();
mDownloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
mId = id; mId = id;
} }
@Override @Override
public void run() { public void run() {
try { 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()) { 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); Thread.sleep(REPORT_PERIOD);
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
// Do nothing and terminate normally. // 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);
}
}
}
} }
} }