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: I3fd9214da50faa4b59d0bd3e775293dd34f07547main
parent
8142a7b637
commit
3f0858eb2b
|
@ -170,7 +170,7 @@ public final class DictionaryService extends Service {
|
|||
checkTimeAndMaybeSetupUpdateAlarm(context);
|
||||
} else if (DictionaryPackConstants.UPDATE_NOW_INTENT_ACTION.equals(intent.getAction())) {
|
||||
// Intent to trigger an update now.
|
||||
UpdateHandler.update(context, false);
|
||||
UpdateHandler.tryUpdate(context, false);
|
||||
} else {
|
||||
UpdateHandler.downloadFinished(context, intent);
|
||||
}
|
||||
|
@ -221,7 +221,7 @@ public final class DictionaryService extends Service {
|
|||
*/
|
||||
public static void updateNowIfNotUpdatedInAVeryLongTime(final Context context) {
|
||||
if (!isLastUpdateAtLeastThisOld(context, VERY_LONG_TIME)) return;
|
||||
UpdateHandler.update(context, false);
|
||||
UpdateHandler.tryUpdate(context, false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -30,6 +30,7 @@ import android.os.Bundle;
|
|||
import android.preference.Preference;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.preference.PreferenceGroup;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.Log;
|
||||
import android.view.animation.AnimationUtils;
|
||||
|
@ -104,10 +105,17 @@ public final class DictionarySettingsFragment extends PreferenceFragment
|
|||
|
||||
@Override
|
||||
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);
|
||||
refreshNetworkState();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
|
@ -353,7 +361,12 @@ public final class DictionarySettingsFragment extends PreferenceFragment
|
|||
new Thread("updateByHand") {
|
||||
@Override
|
||||
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();
|
||||
}
|
||||
|
@ -368,7 +381,9 @@ public final class DictionarySettingsFragment extends PreferenceFragment
|
|||
private void startLoadingAnimation() {
|
||||
mLoadingView.setVisibility(View.VISIBLE);
|
||||
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() {
|
||||
|
|
|
@ -173,14 +173,15 @@ public final class UpdateHandler {
|
|||
* Download latest metadata from the server through DownloadManager for all known clients
|
||||
* @param context The context for retrieving resources
|
||||
* @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.
|
||||
final TreeSet<String> uris = new TreeSet<String>();
|
||||
final Cursor cursor = MetadataDbHelper.queryClientIds(context);
|
||||
if (null == cursor) return;
|
||||
if (null == cursor) return false;
|
||||
try {
|
||||
if (!cursor.moveToFirst()) return;
|
||||
if (!cursor.moveToFirst()) return false;
|
||||
do {
|
||||
final String clientId = cursor.getString(0);
|
||||
final String metadataUri =
|
||||
|
@ -192,6 +193,7 @@ public final class UpdateHandler {
|
|||
} finally {
|
||||
cursor.close();
|
||||
}
|
||||
boolean started = false;
|
||||
for (final String metadataUri : uris) {
|
||||
if (!TextUtils.isEmpty(metadataUri)) {
|
||||
// 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.
|
||||
// For more information, {@see DictionaryProvider#insert(Uri, ContentValues)}.
|
||||
updateClientsWithMetadataUri(context, updateNow, metadataUri);
|
||||
started = true;
|
||||
}
|
||||
}
|
||||
return started;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue