Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(638)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java

Issue 2641973003: Implement server-suggested update check backoff (Closed)
Patch Set: Nits. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
index 305caf08bed33e5fc296dca69e84b3a04571c591..202d6afae19f9c8ba7ac1d8b4131aa460c943759 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -22,7 +22,6 @@ import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.webapk.lib.client.WebApkVersion;
import java.util.Map;
-import java.util.concurrent.TimeUnit;
/**
* WebApkUpdateManager manages when to check for updates to the WebAPK's Web Manifest, and sends
@@ -31,15 +30,6 @@ import java.util.concurrent.TimeUnit;
public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
private static final String TAG = "WebApkUpdateManager";
- /** Number of milliseconds between checks for whether the WebAPK's Web Manifest has changed. */
- public static final long FULL_CHECK_UPDATE_INTERVAL = TimeUnit.DAYS.toMillis(3L);
-
- /**
- * Number of milliseconds to wait before re-requesting an updated WebAPK from the WebAPK
- * server if the previous update attempt failed.
- */
- public static final long RETRY_UPDATE_DURATION = TimeUnit.HOURS.toMillis(12L);
-
/**
* Number of times to wait for updating the WebAPK after it is moved to the background prior
* to doing the update while the WebAPK is in the foreground.
@@ -64,11 +54,6 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
/** The WebappDataStorage with cached data about prior update requests. */
private WebappDataStorage mStorage;
- /**
- * Whether the previous WebAPK update succeeded. True if there has not been any update attempts.
- */
- private boolean mPreviousUpdateSucceeded;
-
private WebApkUpdateDataFetcher mFetcher;
/**
@@ -93,16 +78,15 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
}
/**
- * Checks whether the WebAPK's Web Manifest has changed. Requests an updated WebAPK if the
- * Web Manifest has changed. Skips the check if the check was done recently.
+ * Checks whether the WebAPK's Web Manifest has changed. Requests an updated WebAPK if the Web
+ * Manifest has changed. Skips the check if the check was done recently.
* @param tab The tab of the WebAPK.
* @param info The WebApkInfo of the WebAPK.
*/
public void updateIfNeeded(Tab tab, WebApkInfo info) {
mInfo = info;
- mPreviousUpdateSucceeded = didPreviousUpdateSucceed();
- if (!shouldCheckIfWebManifestUpdated(mInfo, mPreviousUpdateSucceeded)) return;
+ if (!shouldCheckIfWebManifestUpdated(mInfo)) return;
mFetcher = buildFetcher();
mFetcher.start(tab, mInfo, this);
@@ -165,15 +149,15 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
}
if (!needsUpgrade) {
- if (!mPreviousUpdateSucceeded) {
- recordUpdate(mStorage, true);
+ if (!mStorage.didPreviousUpdateSucceed()) {
+ recordUpdate(mStorage, true /* success */, false /* relaxUpdates */);
}
return;
}
// Set WebAPK update as having failed in case that Chrome is killed prior to
// {@link onBuiltWebApk} being called.
- recordUpdate(mStorage, false);
+ recordUpdate(mStorage, false /* success */, false /* relaxUpdates*/);
if (fetchedInfo != null) {
scheduleUpdate(fetchedInfo, bestIconUrl, false /* isManifestStale */);
@@ -183,7 +167,7 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
// Tell the server that the our version of the Web Manifest might be stale and to ignore
// our Web Manifest data if the server's Web Manifest data is newer. This scenario can
// occur if the Web Manifest is temporarily unreachable.
- scheduleUpdate(mInfo, "", true /* isManifestStale */);
+ scheduleUpdate(mInfo, "" /* bestIconUrl */, true /* isManifestStale */);
}
/**
@@ -263,11 +247,6 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
mFetcher = null;
}
- /** Returns the current time. In a separate function for the sake of testing. */
- protected long currentTimeMillis() {
- return System.currentTimeMillis();
- }
-
/**
* Reads the WebAPK's version code. Returns 0 on failure.
*/
@@ -284,19 +263,6 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
}
/**
- * Returns whether the previous WebAPK update attempt succeeded. Returns true if there has not
- * been any update attempts.
- */
- private boolean didPreviousUpdateSucceed() {
- long lastUpdateCompletionTime = mStorage.getLastWebApkUpdateRequestCompletionTime();
- if (lastUpdateCompletionTime == WebappDataStorage.LAST_USED_INVALID
- || lastUpdateCompletionTime == WebappDataStorage.LAST_USED_UNSET) {
- return true;
- }
- return mStorage.getDidLastWebApkUpdateRequestSucceed();
- }
-
- /**
* Whether there is a new version of the //chrome/android/webapk/shell_apk code.
*/
private static boolean isShellApkVersionOutOfDate(WebApkInfo info) {
@@ -307,11 +273,9 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
* Returns whether the Web Manifest should be refetched to check whether it has been updated.
* TODO: Make this method static once there is a static global clock class.
* @param info Meta data from WebAPK's Android Manifest.
- * @param previousUpdateSucceeded Whether the previous update attempt succeeded.
* True if there has not been any update attempts.
*/
- private boolean shouldCheckIfWebManifestUpdated(WebApkInfo info,
- boolean previousUpdateSucceeded) {
+ private boolean shouldCheckIfWebManifestUpdated(WebApkInfo info) {
if (!sUpdatesEnabled) {
return false;
}
@@ -325,25 +289,20 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
if (isShellApkVersionOutOfDate(info)) return true;
- long now = currentTimeMillis();
- long sinceLastCheckDurationMs = now - mStorage.getLastCheckForWebManifestUpdateTime();
- if (sinceLastCheckDurationMs >= FULL_CHECK_UPDATE_INTERVAL) return true;
-
- long sinceLastUpdateRequestDurationMs =
- now - mStorage.getLastWebApkUpdateRequestCompletionTime();
- return sinceLastUpdateRequestDurationMs >= RETRY_UPDATE_DURATION
- && !previousUpdateSucceeded;
+ return mStorage.shouldCheckForUpdate();
}
/**
* Updates {@link WebappDataStorage} with the time of the latest WebAPK update and whether the
* WebAPK update succeeded.
*/
- private static void recordUpdate(WebappDataStorage storage, boolean success) {
+ private static void recordUpdate(
+ WebappDataStorage storage, boolean success, boolean relaxUpdates) {
// Update the request time and result together. It prevents getting a correct request time
// but a result from the previous request.
storage.updateTimeOfLastWebApkUpdateRequestCompletion();
storage.updateDidLastWebApkUpdateRequestSucceed(success);
+ storage.setRelaxedUpdates(relaxUpdates);
}
/**
@@ -400,11 +359,11 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
* fails.
*/
@CalledByNative
- private static void onBuiltWebApk(String id, boolean success) {
+ private static void onBuiltWebApk(String id, boolean success, boolean relaxUpdates) {
WebappDataStorage storage = WebappRegistry.getInstance().getWebappDataStorage(id);
if (storage == null) return;
- recordUpdate(storage, success);
+ recordUpdate(storage, success, relaxUpdates);
}
private static native void nativeUpdateAsync(String id, String startUrl, String scope,

Powered by Google App Engine
This is Rietveld 408576698