2013-04-24 11:56:06 +00:00
|
|
|
/**
|
|
|
|
* Copyright (C) 2013 The Android Open Source Project
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
|
|
* use this file except in compliance with the License. You may obtain a copy
|
|
|
|
* of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations
|
|
|
|
* under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package com.android.inputmethod.dictionarypack;
|
|
|
|
|
2013-04-24 12:06:16 +00:00
|
|
|
import android.content.ContentValues;
|
2013-04-24 11:56:06 +00:00
|
|
|
import android.content.Context;
|
2013-04-24 12:06:16 +00:00
|
|
|
import android.database.sqlite.SQLiteDatabase;
|
2013-04-24 11:56:06 +00:00
|
|
|
import android.util.AttributeSet;
|
2013-04-24 12:06:16 +00:00
|
|
|
import android.util.Log;
|
|
|
|
import android.view.View;
|
2013-04-24 11:56:06 +00:00
|
|
|
import android.widget.ProgressBar;
|
|
|
|
|
|
|
|
public class DictionaryDownloadProgressBar extends ProgressBar {
|
2013-04-24 12:06:16 +00:00
|
|
|
@SuppressWarnings("unused")
|
|
|
|
private static final String TAG = DictionaryDownloadProgressBar.class.getSimpleName();
|
|
|
|
private static final int NOT_A_DOWNLOADMANAGER_PENDING_ID = 0;
|
|
|
|
|
|
|
|
private String mClientId;
|
|
|
|
private String mWordlistId;
|
|
|
|
private boolean mIsCurrentlyAttachedToWindow = false;
|
|
|
|
private Thread mReporterThread = null;
|
|
|
|
|
2013-04-24 11:56:06 +00:00
|
|
|
public DictionaryDownloadProgressBar(final Context context) {
|
|
|
|
super(context);
|
|
|
|
}
|
|
|
|
|
|
|
|
public DictionaryDownloadProgressBar(final Context context, final AttributeSet attrs) {
|
|
|
|
super(context, attrs);
|
|
|
|
}
|
2013-04-24 12:06:16 +00:00
|
|
|
|
|
|
|
public void setIds(final String clientId, final String wordlistId) {
|
|
|
|
mClientId = clientId;
|
|
|
|
mWordlistId = wordlistId;
|
|
|
|
}
|
|
|
|
|
|
|
|
static private int getDownloadManagerPendingIdFromWordlistId(final Context context,
|
|
|
|
final String clientId, final String wordlistId) {
|
|
|
|
final SQLiteDatabase db = MetadataDbHelper.getDb(context, clientId);
|
|
|
|
final ContentValues wordlistValues =
|
|
|
|
MetadataDbHelper.getContentValuesOfLatestAvailableWordlistById(db, wordlistId);
|
|
|
|
if (null == wordlistValues) {
|
|
|
|
// We don't know anything about a word list with this id. Bug? This should never
|
|
|
|
// happen, but still return to prevent a crash.
|
|
|
|
Log.e(TAG, "Unexpected word list ID: " + wordlistId);
|
|
|
|
return NOT_A_DOWNLOADMANAGER_PENDING_ID;
|
|
|
|
}
|
|
|
|
return wordlistValues.getAsInteger(MetadataDbHelper.PENDINGID_COLUMN);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This method will stop any running updater thread for this progress bar and create and run
|
|
|
|
* a new one only if the progress bar is visible.
|
|
|
|
* Hence, as a result of calling this method, the progress bar will have an updater thread
|
|
|
|
* running if and only if the progress bar is visible.
|
|
|
|
*/
|
|
|
|
private void updateReporterThreadRunningStatusAccordingToVisibility() {
|
|
|
|
if (null != mReporterThread) mReporterThread.interrupt();
|
|
|
|
if (mIsCurrentlyAttachedToWindow && View.VISIBLE == getVisibility()) {
|
|
|
|
final int downloadManagerPendingId =
|
|
|
|
getDownloadManagerPendingIdFromWordlistId(getContext(), mClientId, mWordlistId);
|
|
|
|
if (NOT_A_DOWNLOADMANAGER_PENDING_ID == downloadManagerPendingId) {
|
|
|
|
// Can't get the ID. This is never supposed to happen, but still clear the updater
|
|
|
|
// thread and return to avoid a crash.
|
|
|
|
mReporterThread = null;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
final UpdaterThread updaterThread = new UpdaterThread(downloadManagerPendingId);
|
|
|
|
updaterThread.start();
|
|
|
|
mReporterThread = updaterThread;
|
|
|
|
} else {
|
|
|
|
// We're not going to restart the thread anyway, so we may as well garbage collect it.
|
|
|
|
mReporterThread = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onAttachedToWindow() {
|
|
|
|
mIsCurrentlyAttachedToWindow = true;
|
|
|
|
updateReporterThreadRunningStatusAccordingToVisibility();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onDetachedFromWindow() {
|
|
|
|
mIsCurrentlyAttachedToWindow = false;
|
|
|
|
updateReporterThreadRunningStatusAccordingToVisibility();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static class UpdaterThread extends Thread {
|
|
|
|
private final static int REPORT_PERIOD = 1000; // how often to report progress
|
|
|
|
final int mId;
|
|
|
|
public UpdaterThread(final int id) {
|
|
|
|
super();
|
|
|
|
mId = id;
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
try {
|
|
|
|
// TODO: implement the actual query and reporting
|
|
|
|
while (!isInterrupted()) {
|
|
|
|
Thread.sleep(REPORT_PERIOD);
|
|
|
|
}
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
// Do nothing and terminate normally.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-04-24 11:56:06 +00:00
|
|
|
}
|