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

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

Issue 2259713002: Request upgraded WebAPK from WebAPK server if the ShellAPK version changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge branch 'master' into shell_apk_version Created 4 years, 4 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 a4da684a344708f7e4135d4d33545c9d070bc8ee..3f8dfbf7e816e65e1ede8b317901a61c3309b250 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
@@ -7,12 +7,16 @@ package org.chromium.chrome.browser.webapps;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
+import android.os.Bundle;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.chrome.browser.webapps.WebappRegistry.FetchWebappDataStorageCallback;
+import org.chromium.webapk.lib.client.WebApkVersion;
import org.chromium.webapk.lib.common.WebApkConstants;
+import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
import java.util.concurrent.TimeUnit;
@@ -22,13 +26,25 @@ import java.util.concurrent.TimeUnit;
*/
public class WebApkUpdateManager implements ManifestUpgradeDetector.Callback {
/** Number of milliseconds between checks for whether the WebAPK's Web Manifest has changed. */
- static final long FULL_CHECK_UPDATE_INTERVAL = TimeUnit.DAYS.toMillis(3L);
+ private 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.
*/
- static final long RETRY_UPDATE_DURATION = TimeUnit.HOURS.toMillis(12L);
+ private static final long RETRY_UPDATE_DURATION = TimeUnit.HOURS.toMillis(12L);
+
+ /** Version number of //chrome/android/webapk/shell_apk code. */
+ private int mShellApkVersion;
+
+ /** Android version code of WebAPK. */
+ private int mVersionCode;
+
+ /**
+ * Whether a request to upgrade the WebAPK should be sent regardless of whether the Web Manifest
+ * has changed.
+ */
+ private boolean mForceUpgrade;
private ManifestUpgradeDetector mUpgradeDetector;
@@ -39,19 +55,34 @@ public class WebApkUpdateManager implements ManifestUpgradeDetector.Callback {
* @param info The WebappInfo of the WebAPK.
*/
public void updateIfNeeded(Tab tab, WebappInfo info) {
- mUpgradeDetector = new ManifestUpgradeDetector(tab, info, this);
+ PackageInfo packageInfo = readPackageInfoFromAndroidManifest(info.webApkPackageName());
+ if (packageInfo == null) {
+ return;
+ }
+
+ mVersionCode = packageInfo.versionCode;
+ final Bundle metadata = packageInfo.applicationInfo.metaData;
+ mShellApkVersion =
+ IntentUtils.safeGetInt(metadata, WebApkMetaDataKeys.SHELL_APK_VERSION, 0);
+
+ mUpgradeDetector = new ManifestUpgradeDetector(tab, info, metadata, this);
WebappRegistry.FetchWebappDataStorageCallback callback =
new WebappRegistry.FetchWebappDataStorageCallback() {
@Override
public void onWebappDataStorageRetrieved(WebappDataStorage storage) {
+ if (forceUpgrade(storage)) {
+ mForceUpgrade = true;
+ }
+
+ // TODO(pkotwicz|hanxi): Request upgrade if ShellAPK version changes if
+ // ManifestUpgradeDetector cannot fetch the Web Manifest. For instance, the
+ // web developer may have removed the Web Manifest from their site.
+ // (http://crbug.com/639536)
+
long sinceLastCheckDuration = System.currentTimeMillis()
- storage.getLastCheckForWebManifestUpdateTime();
- long sinceLastRequestDuration = System.currentTimeMillis()
- - storage.getLastWebApkUpdateRequestCompletionTime();
- if (sinceLastCheckDuration > FULL_CHECK_UPDATE_INTERVAL
- || (sinceLastRequestDuration > RETRY_UPDATE_DURATION
- && !storage.getDidLastWebApkUpdateRequestSucceed())) {
+ if (sinceLastCheckDuration > FULL_CHECK_UPDATE_INTERVAL || mForceUpgrade) {
if (mUpgradeDetector.start()) {
// crbug.com/636525. The timestamp of the last check for updated
// Web Manifest should be updated after the detector finds the
@@ -67,7 +98,9 @@ public class WebApkUpdateManager implements ManifestUpgradeDetector.Callback {
@Override
public void onUpgradeNeededCheckFinished(boolean needsUpgrade, WebappInfo newInfo) {
- if (needsUpgrade) updateAsync(newInfo);
+ if (needsUpgrade || mForceUpgrade) {
+ updateAsync(newInfo);
+ }
if (mUpgradeDetector != null) {
mUpgradeDetector.destroy();
}
@@ -79,12 +112,11 @@ public class WebApkUpdateManager implements ManifestUpgradeDetector.Callback {
* @param webappInfo The new fetched Web Manifest data of the WebAPK.
*/
public void updateAsync(WebappInfo webappInfo) {
- int webApkVersion = getVersionFromMetaData(webappInfo.webApkPackageName());
nativeUpdateAsync(webappInfo.uri().toString(), webappInfo.scopeUri().toString(),
webappInfo.name(), webappInfo.shortName(), "", webappInfo.icon(),
webappInfo.displayMode(), webappInfo.orientation(), webappInfo.themeColor(),
webappInfo.backgroundColor(), mUpgradeDetector.getManifestUrl(),
- webappInfo.webApkPackageName(), webApkVersion);
+ webappInfo.webApkPackageName(), mVersionCode);
}
public void destroy() {
@@ -94,16 +126,33 @@ public class WebApkUpdateManager implements ManifestUpgradeDetector.Callback {
mUpgradeDetector = null;
}
- private static int getVersionFromMetaData(String webApkPackage) {
+ /**
+ * Reads the WebAPK's PackageInfo from the Android Manifest.
+ */
+ private PackageInfo readPackageInfoFromAndroidManifest(String webApkPackage) {
try {
PackageManager packageManager =
ContextUtils.getApplicationContext().getPackageManager();
- PackageInfo info = packageManager.getPackageInfo(webApkPackage, 0);
- return info.versionCode;
+ return packageManager.getPackageInfo(webApkPackage, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
- return 1;
+ return null;
+ }
+
+ /**
+ * Returns whether an upgrade should be requested regardless of whether the Web Manifest has
+ * changed.
+ */
+ private boolean forceUpgrade(WebappDataStorage storage) {
+ long sinceLastUpdateRequestDuration =
+ System.currentTimeMillis() - storage.getLastWebApkUpdateRequestCompletionTime();
+ if (sinceLastUpdateRequestDuration <= RETRY_UPDATE_DURATION) {
+ return false;
+ }
+
+ return mShellApkVersion < WebApkVersion.CURRENT_SHELL_APK_VERSION
+ || !storage.getDidLastWebApkUpdateRequestSucceed();
}
/**

Powered by Google App Engine
This is Rietveld 408576698