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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.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/WebappDataStorage.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java
index cc68e6613d0150ec72614748a25ad2855164633c..bc4d7e1d098bb8925aa9818868a4e12ecce9a993 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java
@@ -51,16 +51,28 @@ public class WebappDataStorage {
"last_check_web_manifest_update_time";
// The last time that the WebAPK update request completed (successfully or unsuccessfully).
- static final String KEY_LAST_WEBAPK_UPDATE_REQUEST_COMPLETE_TIME =
- "last_webapk_update_request_complete_time";
+ static final String KEY_LAST_UPDATE_REQUEST_COMPLETE_TIME = "last_update_request_complete_time";
// Whether the last WebAPK update request succeeded.
- static final String KEY_DID_LAST_WEBAPK_UPDATE_REQUEST_SUCCEED =
- "did_last_webapk_update_request_succeed";
+ static final String KEY_DID_LAST_UPDATE_REQUEST_SUCCEED = "did_last_update_request_succeed";
// The number of times that updating a WebAPK in the background has been requested.
static final String KEY_UPDATE_REQUESTED = "update_requested";
+ // Whether to check updates less frequently.
+ static final String KEY_RELAX_UPDATES = "relax_updates";
+
+ // Number of milliseconds between checks for whether the WebAPK's Web Manifest has changed.
+ public static final long UPDATE_INTERVAL = TimeUnit.DAYS.toMillis(3L);
+
+ // Number of milliseconds between checks of updates for a WebAPK that is expected to check
+ // updates less frequently. crbug.com/680128.
+ public static final long RELAXED_UPDATE_INTERVAL = TimeUnit.DAYS.toMillis(30L);
+
+ // 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);
+
// Unset/invalid constants for last used times and URLs. 0 is used as the null last used time as
// WebappRegistry assumes that this is always a valid timestamp.
static final long LAST_USED_UNSET = 0;
@@ -302,9 +314,10 @@ public class WebappDataStorage {
editor.remove(KEY_URL);
editor.remove(KEY_SCOPE);
editor.remove(KEY_LAST_CHECK_WEB_MANIFEST_UPDATE_TIME);
- editor.remove(KEY_LAST_WEBAPK_UPDATE_REQUEST_COMPLETE_TIME);
- editor.remove(KEY_DID_LAST_WEBAPK_UPDATE_REQUEST_SUCCEED);
+ editor.remove(KEY_LAST_UPDATE_REQUEST_COMPLETE_TIME);
+ editor.remove(KEY_DID_LAST_UPDATE_REQUEST_SUCCEED);
editor.remove(KEY_UPDATE_REQUESTED);
+ editor.remove(KEY_RELAX_UPDATES);
editor.apply();
}
@@ -367,7 +380,7 @@ public class WebappDataStorage {
* Returns the completion time of the last check for whether the WebAPK's Web Manifest was
* updated. This time needs to be set when the WebAPK is registered.
*/
- long getLastCheckForWebManifestUpdateTime() {
+ private long getLastCheckForWebManifestUpdateTime() {
return mPreferences.getLong(KEY_LAST_CHECK_WEB_MANIFEST_UPDATE_TIME, LAST_USED_INVALID);
}
@@ -376,7 +389,7 @@ public class WebappDataStorage {
*/
void updateTimeOfLastWebApkUpdateRequestCompletion() {
mPreferences.edit()
- .putLong(KEY_LAST_WEBAPK_UPDATE_REQUEST_COMPLETE_TIME, sClock.currentTimeMillis())
+ .putLong(KEY_LAST_UPDATE_REQUEST_COMPLETE_TIME, sClock.currentTimeMillis())
.apply();
}
@@ -385,24 +398,21 @@ public class WebappDataStorage {
* This time needs to be set when the WebAPK is registered.
*/
long getLastWebApkUpdateRequestCompletionTime() {
Xi Han 2017/03/08 14:40:50 This function is called by WebApkUpdateManagerTest
pkotwicz 2017/03/08 16:29:10 Fair enough
- return mPreferences.getLong(
- KEY_LAST_WEBAPK_UPDATE_REQUEST_COMPLETE_TIME, LAST_USED_INVALID);
+ return mPreferences.getLong(KEY_LAST_UPDATE_REQUEST_COMPLETE_TIME, LAST_USED_INVALID);
}
/**
- * Updates the result of whether the last update request to WebAPK Server succeeded.
+ * Updates whether the last update request to WebAPK Server succeeded.
*/
void updateDidLastWebApkUpdateRequestSucceed(boolean success) {
- mPreferences.edit()
- .putBoolean(KEY_DID_LAST_WEBAPK_UPDATE_REQUEST_SUCCEED, success)
- .apply();
+ mPreferences.edit().putBoolean(KEY_DID_LAST_UPDATE_REQUEST_SUCCEED, success).apply();
}
/**
* Returns whether the last update request to WebAPK Server succeeded.
*/
boolean getDidLastWebApkUpdateRequestSucceed() {
- return mPreferences.getBoolean(KEY_DID_LAST_WEBAPK_UPDATE_REQUEST_SUCCEED, false);
+ return mPreferences.getBoolean(KEY_DID_LAST_UPDATE_REQUEST_SUCCEED, false);
}
/**
@@ -426,6 +436,42 @@ public class WebappDataStorage {
return mPreferences.getInt(KEY_UPDATE_REQUESTED, 0);
}
+ /**
+ * Returns whether the previous WebAPK update attempt succeeded. Returns true if there has not
+ * been any update attempts.
+ */
+ boolean didPreviousUpdateSucceed() {
+ long lastUpdateCompletionTime = getLastWebApkUpdateRequestCompletionTime();
+ if (lastUpdateCompletionTime == WebappDataStorage.LAST_USED_INVALID
+ || lastUpdateCompletionTime == WebappDataStorage.LAST_USED_UNSET) {
+ return true;
+ }
+ return getDidLastWebApkUpdateRequestSucceed();
+ }
+
+ /** Sets whether we should check for updates less frequently. */
+ void setRelaxedUpdates(boolean relaxUpdates) {
+ mPreferences.edit().putBoolean(KEY_RELAX_UPDATES, relaxUpdates).apply();
+ }
+
+ /** Returns whether we should check for updates less frequently. */
+ private boolean shouldRelaxUpdates() {
+ return mPreferences.getBoolean(KEY_RELAX_UPDATES, false);
+ }
+
+ /** Returns whether we should check for update. */
+ boolean shouldCheckForUpdate() {
+ long checkUpdatesInterval =
+ shouldRelaxUpdates() ? RELAXED_UPDATE_INTERVAL : UPDATE_INTERVAL;
+ long now = sClock.currentTimeMillis();
+ long sinceLastCheckDurationMs = now - getLastCheckForWebManifestUpdateTime();
+ if (sinceLastCheckDurationMs >= checkUpdatesInterval) return true;
+
+ long sinceLastUpdateRequestDurationMs = now - getLastWebApkUpdateRequestCompletionTime();
+ return sinceLastUpdateRequestDurationMs >= WebappDataStorage.RETRY_UPDATE_DURATION
+ && !didPreviousUpdateSucceed();
+ }
+
protected WebappDataStorage(String webappId) {
mId = webappId;
mPreferences = ContextUtils.getApplicationContext().getSharedPreferences(

Powered by Google App Engine
This is Rietveld 408576698