Fix a bug where no URL means refresh never ends

This patch does two things:
- If there is no URL to download new data from, then the
Refresh button is not shown.
- Even if for some reason refresh starts for a client for
which there is no URL, loading correctly finishes.

Bug: 9388602
Change-Id: I3fd9214da50faa4b59d0bd3e775293dd34f07547
main
Jean Chalard 2013-06-28 13:06:59 +09:00
parent 8142a7b637
commit 3f0858eb2b
3 changed files with 29 additions and 10 deletions

View File

@ -170,7 +170,7 @@ public final class DictionaryService extends Service {
checkTimeAndMaybeSetupUpdateAlarm(context); checkTimeAndMaybeSetupUpdateAlarm(context);
} else if (DictionaryPackConstants.UPDATE_NOW_INTENT_ACTION.equals(intent.getAction())) { } else if (DictionaryPackConstants.UPDATE_NOW_INTENT_ACTION.equals(intent.getAction())) {
// Intent to trigger an update now. // Intent to trigger an update now.
UpdateHandler.update(context, false); UpdateHandler.tryUpdate(context, false);
} else { } else {
UpdateHandler.downloadFinished(context, intent); UpdateHandler.downloadFinished(context, intent);
} }
@ -221,7 +221,7 @@ public final class DictionaryService extends Service {
*/ */
public static void updateNowIfNotUpdatedInAVeryLongTime(final Context context) { public static void updateNowIfNotUpdatedInAVeryLongTime(final Context context) {
if (!isLastUpdateAtLeastThisOld(context, VERY_LONG_TIME)) return; if (!isLastUpdateAtLeastThisOld(context, VERY_LONG_TIME)) return;
UpdateHandler.update(context, false); UpdateHandler.tryUpdate(context, false);
} }
/** /**

View File

@ -30,6 +30,7 @@ import android.os.Bundle;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup; import android.preference.PreferenceGroup;
import android.text.TextUtils;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.util.Log; import android.util.Log;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
@ -104,10 +105,17 @@ public final class DictionarySettingsFragment extends PreferenceFragment
@Override @Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
mUpdateNowMenu = menu.add(Menu.NONE, MENU_UPDATE_NOW, 0, R.string.check_for_updates_now); final String metadataUri =
MetadataDbHelper.getMetadataUriAsString(getActivity(), mClientId);
// We only add the "Refresh" button if we have a non-empty URL to refresh from. If the
// URL is empty, of course we can't refresh so it makes no sense to display this.
if (!TextUtils.isEmpty(metadataUri)) {
mUpdateNowMenu =
menu.add(Menu.NONE, MENU_UPDATE_NOW, 0, R.string.check_for_updates_now);
mUpdateNowMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); mUpdateNowMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
refreshNetworkState(); refreshNetworkState();
} }
}
@Override @Override
public void onResume() { public void onResume() {
@ -353,7 +361,12 @@ public final class DictionarySettingsFragment extends PreferenceFragment
new Thread("updateByHand") { new Thread("updateByHand") {
@Override @Override
public void run() { public void run() {
UpdateHandler.update(activity, true); // We call tryUpdate(), which returns whether we could successfully start an update.
// If we couldn't, we'll never receive the end callback, so we stop the loading
// animation and return to the previous screen.
if (!UpdateHandler.tryUpdate(activity, true)) {
stopLoadingAnimation();
}
} }
}.start(); }.start();
} }
@ -368,7 +381,9 @@ public final class DictionarySettingsFragment extends PreferenceFragment
private void startLoadingAnimation() { private void startLoadingAnimation() {
mLoadingView.setVisibility(View.VISIBLE); mLoadingView.setVisibility(View.VISIBLE);
getView().setVisibility(View.GONE); getView().setVisibility(View.GONE);
mUpdateNowMenu.setTitle(R.string.cancel); // We come here when the menu element is pressed so presumably it can't be null. But
// better safe than sorry.
if (null != mUpdateNowMenu) mUpdateNowMenu.setTitle(R.string.cancel);
} }
private void stopLoadingAnimation() { private void stopLoadingAnimation() {

View File

@ -173,14 +173,15 @@ public final class UpdateHandler {
* Download latest metadata from the server through DownloadManager for all known clients * Download latest metadata from the server through DownloadManager for all known clients
* @param context The context for retrieving resources * @param context The context for retrieving resources
* @param updateNow Whether we should update NOW, or respect bandwidth policies * @param updateNow Whether we should update NOW, or respect bandwidth policies
* @return true if an update successfully started, false otherwise.
*/ */
public static void update(final Context context, final boolean updateNow) { public static boolean tryUpdate(final Context context, final boolean updateNow) {
// TODO: loop through all clients instead of only doing the default one. // TODO: loop through all clients instead of only doing the default one.
final TreeSet<String> uris = new TreeSet<String>(); final TreeSet<String> uris = new TreeSet<String>();
final Cursor cursor = MetadataDbHelper.queryClientIds(context); final Cursor cursor = MetadataDbHelper.queryClientIds(context);
if (null == cursor) return; if (null == cursor) return false;
try { try {
if (!cursor.moveToFirst()) return; if (!cursor.moveToFirst()) return false;
do { do {
final String clientId = cursor.getString(0); final String clientId = cursor.getString(0);
final String metadataUri = final String metadataUri =
@ -192,6 +193,7 @@ public final class UpdateHandler {
} finally { } finally {
cursor.close(); cursor.close();
} }
boolean started = false;
for (final String metadataUri : uris) { for (final String metadataUri : uris) {
if (!TextUtils.isEmpty(metadataUri)) { if (!TextUtils.isEmpty(metadataUri)) {
// If the metadata URI is empty, that means we should never update it at all. // If the metadata URI is empty, that means we should never update it at all.
@ -200,8 +202,10 @@ public final class UpdateHandler {
// is a bug and it happens anyway, doing nothing is the right thing to do. // is a bug and it happens anyway, doing nothing is the right thing to do.
// For more information, {@see DictionaryProvider#insert(Uri, ContentValues)}. // For more information, {@see DictionaryProvider#insert(Uri, ContentValues)}.
updateClientsWithMetadataUri(context, updateNow, metadataUri); updateClientsWithMetadataUri(context, updateNow, metadataUri);
started = true;
} }
} }
return started;
} }
/** /**