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);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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,9 +105,16 @@ 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 =
|
||||||
mUpdateNowMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
MetadataDbHelper.getMetadataUriAsString(getActivity(), mClientId);
|
||||||
refreshNetworkState();
|
// 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
|
@Override
|
||||||
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue