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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.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
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java
index 0231b296db4fd290d25ce0f6a6049c09544757db..35d77ec8344a3cb2e44bb5406369659789cf84e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java
@@ -5,12 +5,17 @@
package org.chromium.chrome.browser;
import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
import org.chromium.chrome.browser.document.DocumentMetricIds;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParams;
import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
+import org.chromium.chrome.browser.webapps.WebappDataStorage;
+import org.chromium.chrome.browser.webapps.WebappRegistry;
+import org.chromium.chrome.browser.webapps.WebappRegistry.FetchWebappDataStorageCallback;
import org.chromium.components.service_tab_launcher.ServiceTabLauncher;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.common.Referrer;
@@ -18,34 +23,74 @@ import org.chromium.ui.base.PageTransition;
/**
* Service Tab Launcher implementation for Chrome. Provides the ability for Android Services
- * running in Chrome to launch tabs, without having access to an activity.
+ * running in Chrome to launch URLs, without having access to an activity.
*
* This class is referred to from the ServiceTabLauncher implementation in Chromium using a
* meta-data value in the Android manifest file. The ServiceTabLauncher class has more
* documentation about why this is necessary.
*
+ * URLs within the scope of a recently launched standalone-capable web app on the Android home
+ * screen are launched in the standalone web app frame.
+ *
* TODO(peter): after upstreaming, merge this with ServiceTabLauncher and remove reflection calls
* in ServiceTabLauncher.
*/
public class ChromeServiceTabLauncher extends ServiceTabLauncher {
@Override
- public void launchTab(Context context, int requestId, boolean incognito, String url,
- int disposition, String referrerUrl, int referrerPolicy,
- String extraHeaders, byte[] postData) {
- // TODO(peter): Determine the intent source based on the |disposition| with which the
- // tab is being launched. Right now this is gated by a check in the native implementation.
- int intentSource = DocumentMetricIds.STARTED_BY_WINDOW_OPEN;
-
- LoadUrlParams loadUrlParams = new LoadUrlParams(url, PageTransition.LINK);
- loadUrlParams.setPostData(postData);
- loadUrlParams.setVerbatimHeaders(extraHeaders);
- loadUrlParams.setReferrer(new Referrer(referrerUrl, referrerPolicy));
-
- AsyncTabCreationParams asyncParams = new AsyncTabCreationParams(loadUrlParams, requestId);
- asyncParams.setDocumentStartedBy(intentSource);
-
- TabDelegate tabDelegate = new TabDelegate(incognito);
- tabDelegate.createNewTab(
- asyncParams, TabLaunchType.FROM_CHROME_UI, Tab.INVALID_TAB_ID);
+ public void launchTab(final Context context, final int requestId, final boolean incognito,
+ final String url, final int disposition, final String referrerUrl,
+ final int referrerPolicy, final String extraHeaders, final byte[] postData) {
+ final TabDelegate tabDelegate = new TabDelegate(incognito);
+
+ // Try and retrieve a WebappDataStorage object with scope corresponding to the URL to be
+ // opened. If one is found, and it has been opened recently, create an intent to launch the
+ // URL in a standalone web app frame. Otherwise, open the URL in a tab.
+ FetchWebappDataStorageCallback callback = new FetchWebappDataStorageCallback() {
+ @Override
+ public void onWebappDataStorageRetrieved(final WebappDataStorage storage) {
+ // If we do not find a WebappDataStorage corresponding to this URL, or if it hasn't
+ // been opened recently enough, open the URL in a tab.
+ if (storage == null || !storage.wasLaunchedRecently()) {
+ // TODO(peter): Determine the intent source based on the |disposition| with
+ // which the tab is being launched. Right now this is gated by a check in the
+ // native implementation.
+ int intentSource = DocumentMetricIds.STARTED_BY_WINDOW_OPEN;
+
+ LoadUrlParams loadUrlParams = new LoadUrlParams(url, PageTransition.LINK);
+ loadUrlParams.setPostData(postData);
+ loadUrlParams.setVerbatimHeaders(extraHeaders);
+ loadUrlParams.setReferrer(new Referrer(referrerUrl, referrerPolicy));
+
+ AsyncTabCreationParams asyncParams = new AsyncTabCreationParams(loadUrlParams,
+ requestId);
+ asyncParams.setDocumentStartedBy(intentSource);
+
+ tabDelegate.createNewTab(asyncParams, TabLaunchType.FROM_CHROME_UI,
+ Tab.INVALID_TAB_ID);
+ } else {
+ // The URL is within the scope of a recently launched standalone-capable web app
+ // on the home screen, so open it a standalone web app frame. An AsyncTask is
+ // used because WebappDataStorage.createWebappLaunchIntent contains a Bitmap
+ // decode operation and should not be run on the UI thread.
+ //
+ // This currently assumes that the only source is notifications; any future use
+ // which adds a different source will need to change this.
+ new AsyncTask<Void, Void, Intent>() {
+ @Override
+ protected final Intent doInBackground(Void... nothing) {
+ return storage.createWebappLaunchIntent();
+ }
+
+ @Override
+ protected final void onPostExecute(Intent intent) {
+ intent.putExtra(ShortcutHelper.EXTRA_SOURCE,
+ ShortcutSource.NOTIFICATION);
+ tabDelegate.createNewStandaloneFrame(intent);
+ }
+ }.execute();
+ }
+ }
+ };
+ WebappRegistry.getWebappDataStorageForUrl(context, url, callback);
}
}
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698