Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheServiceLauncher.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheServiceLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheServiceLauncher.java |
| index f87edd24be64cfdfa4a71958a2b16ce6bd767079..bf3ce07a99b11c8d2c477d5471cdc62f997588a3 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheServiceLauncher.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheServiceLauncher.java |
| @@ -58,11 +58,13 @@ public class PrecacheServiceLauncher extends BroadcastReceiver { |
| * PrecacheService will be stopped, and this receiver will do nothing when it receives an |
| * intent. |
| * |
| - * @param context The Context to use. |
| + * @param context The application context. |
| * @param enabled Whether or not precaching is enabled. |
| */ |
| public static void setIsPrecachingEnabled(Context context, boolean enabled) { |
| Log.v(TAG, "setIsPrecachingEnabled(%s)", enabled); |
| + // |context| needs to be the application context so that the following call gets a |
|
Yaron
2015/08/11 13:59:28
It's also generally preferred in non-ui code to av
|
| + // reference to a consistent SharedPreferences object. |
| Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); |
| editor.putBoolean(PREF_IS_PRECACHING_ENABLED, enabled); |
| editor.apply(); |
| @@ -75,6 +77,35 @@ public class PrecacheServiceLauncher extends BroadcastReceiver { |
| } |
| } |
| + /** |
| + * Handler for when precaching has finished. If precaching had successfully started, sets an |
| + * alarm for a subsequent run, and updates the last precache time. If not (i.e. the precache |
| + * attempt aborted), sets an alarm for another attempt. |
| + * |
| + * @param context The application context. |
| + * @param tryAgainSoon Whether precaching should be attempted again. |
| + */ |
| + public static void precachingFinished(Context context, boolean tryAgainSoon) { |
| + new PrecacheServiceLauncher().precachingFinishedInternal(context, tryAgainSoon); |
| + } |
| + |
| + private void precachingFinishedInternal(Context context, boolean tryAgainSoon) { |
| + Log.v(TAG, "precachingFinished(%s)", tryAgainSoon); |
| + if (tryAgainSoon) { |
| + setAlarm(context, |
| + Math.max(INTERACTIVE_STATE_POLLING_PERIOD_MS, |
| + WAIT_UNTIL_NEXT_PRECACHE_MS - timeSinceLastPrecacheMs(context))); |
| + } else { |
| + // Store a pref indicating that precaching finished just now. |
| + setAlarm(context, |
| + Math.max(INTERACTIVE_STATE_POLLING_PERIOD_MS, WAIT_UNTIL_NEXT_PRECACHE_MS)); |
| + |
| + Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); |
| + editor.putLong(PREF_PRECACHE_LAST_TIME, getElapsedRealtimeOnSystem()); |
| + editor.apply(); |
| + } |
| + } |
| + |
| @VisibleForTesting |
| static boolean isPrecachingEnabled(Context context) { |
| SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); |
| @@ -83,14 +114,6 @@ public class PrecacheServiceLauncher extends BroadcastReceiver { |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); |
| - long lastPrecacheTimeMs = prefs.getLong(PREF_PRECACHE_LAST_TIME, 0L); |
| - if (lastPrecacheTimeMs > getElapsedRealtimeOnSystem()) { |
| - // System.elapsedRealtime() counts milliseconds since boot, so if the device has been |
| - // rebooted since the last time precaching was performed, reset lastPrecacheTimeMs to 0. |
| - lastPrecacheTimeMs = 0L; |
| - } |
| - |
| // Do nothing if precaching is disabled. |
| if (!isPrecachingEnabled(context)) return; |
| @@ -99,9 +122,8 @@ public class PrecacheServiceLauncher extends BroadcastReceiver { |
| boolean isInteractive = mDeviceState.isInteractive(context); |
| boolean areConditionsGoodForPrecaching = |
| isPowerConnected && isWifiAvailable && !isInteractive; |
| - long timeSinceLastPrecacheMs = getElapsedRealtimeOnSystem() - lastPrecacheTimeMs; |
| boolean hasEnoughTimePassedSinceLastPrecache = |
| - timeSinceLastPrecacheMs >= WAIT_UNTIL_NEXT_PRECACHE_MS; |
| + timeSinceLastPrecacheMs(context) >= WAIT_UNTIL_NEXT_PRECACHE_MS; |
| // Only start precaching when an alarm action is received. This is to prevent situations |
| // such as power being connected, precaching starting, then precaching being immediately |
| @@ -109,14 +131,6 @@ public class PrecacheServiceLauncher extends BroadcastReceiver { |
| if (ACTION_ALARM.equals(intent.getAction()) |
| && areConditionsGoodForPrecaching |
| && hasEnoughTimePassedSinceLastPrecache) { |
| - // Store a pref indicating that precaching is starting now. |
| - Editor editor = prefs.edit(); |
| - editor.putLong(PREF_PRECACHE_LAST_TIME, getElapsedRealtimeOnSystem()); |
| - editor.apply(); |
| - |
| - setAlarm(context, Math.max( |
| - INTERACTIVE_STATE_POLLING_PERIOD_MS, WAIT_UNTIL_NEXT_PRECACHE_MS)); |
| - |
| acquireWakeLockAndStartService(context); |
| } else { |
| if (isPowerConnected && isWifiAvailable) { |
| @@ -127,8 +141,9 @@ public class PrecacheServiceLauncher extends BroadcastReceiver { |
| // SCREEN_ON/OFF intents are only delivered to BroadcastReceivers that are |
| // registered dynamically in code, but the PrecacheServiceLauncher is registered in |
| // the Android manifest. |
| - setAlarm(context, Math.max(INTERACTIVE_STATE_POLLING_PERIOD_MS, |
| - WAIT_UNTIL_NEXT_PRECACHE_MS - timeSinceLastPrecacheMs)); |
| + setAlarm(context, |
| + Math.max(INTERACTIVE_STATE_POLLING_PERIOD_MS, |
| + WAIT_UNTIL_NEXT_PRECACHE_MS - timeSinceLastPrecacheMs(context))); |
| } else { |
| // If the device doesn't have connected power or doesn't have Wi-Fi, then there's no |
| // point in setting an alarm. |
| @@ -225,5 +240,17 @@ public class PrecacheServiceLauncher extends BroadcastReceiver { |
| protected long getElapsedRealtimeOnSystem() { |
| return SystemClock.elapsedRealtime(); |
| } |
| + |
| + /** Returns the number of milliseconds since the last precache run completed. */ |
| + private long timeSinceLastPrecacheMs(Context context) { |
| + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); |
| + long lastPrecacheTimeMs = prefs.getLong(PREF_PRECACHE_LAST_TIME, 0L); |
| + if (lastPrecacheTimeMs > getElapsedRealtimeOnSystem()) { |
| + // System.elapsedRealtime() counts milliseconds since boot, so if the device has been |
| + // rebooted since the last time precaching was performed, reset lastPrecacheTimeMs to 0. |
| + lastPrecacheTimeMs = 0L; |
| + } |
| + return getElapsedRealtimeOnSystem() - lastPrecacheTimeMs; |
| + } |
| } |