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

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

Issue 1867543002: Enable deep-linking from notifications for recently used web apps on the Android home screen. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bulk-webappdatastorage
Patch Set: Address nits Created 4 years, 8 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 6980e423aa55f5bbe7a7727237edbdd454200045..4af345e71d4a7a9462186f9852d056c740276491 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
@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.content_public.common.ScreenOrientationValues;
import java.util.Map;
+import java.util.concurrent.TimeUnit;
/**
* Stores data about an installed web app. Uses SharedPreferences to persist the data to disk.
@@ -41,6 +42,7 @@ public class WebappDataStorage {
static final String KEY_ACTION = "action";
static final String KEY_IS_ICON_GENERATED = "is_icon_generated";
static final String KEY_VERSION = "version";
+ static final String KEY_LAUNCHED = "launched";
// 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.
@@ -49,6 +51,12 @@ public class WebappDataStorage {
static final String URL_INVALID = "";
static final int VERSION_INVALID = 0;
+ // We use a heuristic to determine whether a web app is still installed on the home screen, as
+ // there is no way to do so directly. Any web app which has been opened in the last ten days
+ // is considered to be still on the home screen.
+ static final long WEBAPP_LAST_OPEN_MAX_TIME = TimeUnit.DAYS.toMillis(10L);
+
+ private static Clock sClock = new Clock();
private static Factory sFactory = new Factory();
private final String mId;
@@ -128,12 +136,12 @@ public class WebappDataStorage {
* @param callback Called when the URL has been retrieved.
*/
@VisibleForTesting
- public static void getURL(final Context context, final String webappId,
+ public static void getUrl(final Context context, final String webappId,
final FetchCallback<String> callback) {
new AsyncTask<Void, Void, String>() {
@Override
protected final String doInBackground(Void... nothing) {
- return new WebappDataStorage(context.getApplicationContext(), webappId).getURL();
+ return new WebappDataStorage(context.getApplicationContext(), webappId).getUrl();
}
@Override
@@ -156,18 +164,31 @@ public class WebappDataStorage {
}
/**
- * Deletes the URL and scope, and sets last used time to 0 in SharedPreferences.
+ * Deletes the launched flag, URL and scope, and sets last used time to 0 in SharedPreferences.
* This does not remove the stored splash screen image (if any) for the app.
* @param context The context to read the SharedPreferences file.
* @param webappId The ID of the web app for which history is being cleared.
*/
static void clearHistory(final Context context, final String webappId) {
+ assert !ThreadUtils.runningOnUiThread();
+ SharedPreferences.Editor editor = openSharedPreferences(context, webappId).edit();
+
// The last used time is set to 0 to ensure that a valid value is always present.
// If the web app is not launched prior to the next cleanup, then its remaining data will be
- // removed. Otherwise, the next launch will update the last used time.
- assert !ThreadUtils.runningOnUiThread();
- openSharedPreferences(context, webappId).edit()
- .putLong(KEY_LAST_USED, LAST_USED_UNSET).remove(KEY_URL).remove(KEY_SCOPE).apply();
+ // removed. Otherwise, the next launch from home screen will update the last used time.
+ editor.putLong(KEY_LAST_USED, LAST_USED_UNSET);
+ editor.remove(KEY_LAUNCHED);
+ editor.remove(KEY_URL);
+ editor.remove(KEY_SCOPE);
+ editor.apply();
+ }
+
+ /**
+ * Sets the clock used to get the current time.
+ */
+ @VisibleForTesting
+ public static void setClockForTests(Clock clock) {
+ sClock = clock;
}
/**
@@ -326,16 +347,15 @@ public class WebappDataStorage {
/**
* Returns the URL stored in this object, or URL_INVALID if it is not stored.
*/
- String getURL() {
+ String getUrl() {
return mPreferences.getString(KEY_URL, URL_INVALID);
}
/**
* Updates the last used time of this object.
- * @param lastUsedTime the new last used time.
*/
void updateLastUsedTime() {
- mPreferences.edit().putLong(KEY_LAST_USED, System.currentTimeMillis()).apply();
+ mPreferences.edit().putLong(KEY_LAST_USED, sClock.currentTimeMillis()).apply();
}
/**
@@ -345,6 +365,32 @@ public class WebappDataStorage {
return mPreferences.getLong(KEY_LAST_USED, LAST_USED_INVALID);
}
+ /**
+ * Returns true if this web app has been launched from home screen recently (within
+ * WEBAPP_LAST_OPEN_MAX_TIME milliseconds).
+ */
+ public boolean wasLaunchedRecently() {
+ // Registering the web app sets the last used time, so we must also ensure that the web app
+ // has actually been launched. Otherwise, launches from home screen are the only occasion
+ // when last used time is updated.
+ return getLaunched()
+ && (sClock.currentTimeMillis() - getLastUsedTime() < WEBAPP_LAST_OPEN_MAX_TIME);
+ }
+
+ /**
+ * Returns true if this web app has been launched from home screen.
+ */
+ boolean getLaunched() {
+ return mPreferences.getBoolean(KEY_LAUNCHED, false);
+ }
+
+ /**
+ * Marks this web app as having been launched from home screen.
+ */
+ void setLaunched() {
+ mPreferences.edit().putBoolean(KEY_LAUNCHED, true).apply();
+ }
+
private Map<String, ?> getAllData() {
return mPreferences.getAll();
}
@@ -370,4 +416,17 @@ public class WebappDataStorage {
return new WebappDataStorage(context, webappId);
}
}
+
+ /**
+ * Clock used to generate the current time in millseconds for updating and setting last used
+ * time.
+ */
+ public static class Clock {
+ /**
+ * Returns the current time in milliseconds.
+ */
+ public long currentTimeMillis() {
+ return System.currentTimeMillis();
+ }
+ }
}

Powered by Google App Engine
This is Rietveld 408576698