Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java |
index 115f9f8ffab3330a57811ac6498f2de2881fc4da..32ad44cdb8759514636a2e4f3440e8ef1f6ff6a4 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java |
@@ -6,8 +6,11 @@ package org.chromium.chrome.browser.webapps; |
import android.content.Context; |
import android.content.SharedPreferences; |
+import android.content.pm.PackageManager; |
+import android.content.pm.PackageManager.NameNotFoundException; |
import android.os.AsyncTask; |
+import org.chromium.base.ThreadUtils; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
@@ -173,9 +176,10 @@ public class WebappRegistry { |
} |
/** |
- * Deletes the data for all "old" web apps. |
+ * 1. Deletes the data for all "old" web apps. |
* "Old" web apps have not been opened by the user in the last 3 months, or have had their last |
* used time set to 0 by the user clearing their history. Cleanup is run, at most, once a month. |
+ * 2. Deletes the data for all WebAPKs that have been uninstalled in the last month. |
* |
* @param context Context to open the registry with. |
* @param currentTime The current time which will be checked to decide if the task should be run |
@@ -191,10 +195,16 @@ public class WebappRegistry { |
Set<String> currentWebapps = getRegisteredWebappIds(preferences); |
Set<String> retainedWebapps = new HashSet<String>(currentWebapps); |
+ PackageManager pm = context.getPackageManager(); |
for (String id : currentWebapps) { |
- long lastUsed = new WebappDataStorage(context, id).getLastUsedTime(); |
- if ((currentTime - lastUsed) < WEBAPP_UNOPENED_CLEANUP_DURATION) continue; |
- |
+ WebappDataStorage storage = new WebappDataStorage(context, id); |
+ String webApkPackage = storage.getWebApkPackageName(); |
+ if (webApkPackage != null) { |
+ if (isWebApkInstalled(pm, webApkPackage)) continue; |
+ } else { |
+ long lastUsed = storage.getLastUsedTime(); |
+ if ((currentTime - lastUsed) < WEBAPP_UNOPENED_CLEANUP_DURATION) continue; |
+ } |
WebappDataStorage.deleteDataForWebapp(context, id); |
retainedWebapps.remove(id); |
} |
@@ -209,6 +219,19 @@ public class WebappRegistry { |
} |
/** |
+ * Returns whether the given WebAPK is still installed. |
+ */ |
+ private static boolean isWebApkInstalled(PackageManager pm, String webApkPackage) { |
+ assert !ThreadUtils.runningOnUiThread(); |
+ try { |
+ pm.getPackageInfo(webApkPackage, PackageManager.GET_ACTIVITIES); |
+ } catch (NameNotFoundException e) { |
+ return false; |
+ } |
+ return true; |
+ } |
+ |
+ /** |
* Deletes the data of all web apps, as well as the registry tracking the web apps. |
*/ |
@VisibleForTesting |