Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java |
index c25ccaebbc11b28233f726ba673aa941fe847384..61777d059362a5bd6fa71c98329e9c1ab0712881 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java |
@@ -13,14 +13,17 @@ import android.util.Base64; |
import org.chromium.base.ApiCompatibilityUtils; |
import org.chromium.base.ApplicationStatus; |
+import org.chromium.base.CommandLine; |
import org.chromium.base.ContextUtils; |
import org.chromium.base.Log; |
+import org.chromium.chrome.browser.ChromeSwitches; |
import org.chromium.chrome.browser.IntentHandler; |
import org.chromium.chrome.browser.ShortcutHelper; |
import org.chromium.chrome.browser.document.ChromeLauncherActivity; |
import org.chromium.chrome.browser.metrics.LaunchMetrics; |
import org.chromium.chrome.browser.tab.Tab; |
import org.chromium.chrome.browser.util.IntentUtils; |
+import org.chromium.webapk.lib.common.WebApkConstants; |
import java.lang.ref.WeakReference; |
@@ -51,6 +54,7 @@ public class WebappLauncherActivity extends Activity { |
Intent intent = getIntent(); |
String webappId = webappInfo.id(); |
String webappUrl = webappInfo.uri().toString(); |
+ String webApkPackageName = webappInfo.webApkPackageName(); |
int webappSource = webappInfo.source(); |
if (webappId != null && webappUrl != null) { |
@@ -67,26 +71,14 @@ public class WebappLauncherActivity extends Activity { |
ContextUtils.getApplicationContext()); |
boolean isUrlValid = (webappMac != null |
&& WebappAuthenticator.isUrlValid(this, webappUrl, webappMac)); |
+ boolean isValidWebApk = isValidWebApk(webApkPackageName); |
+ if (webApkPackageName != null && !isValidWebApk) { |
+ isUrlValid = false; |
+ } |
if (isTrusted || isUrlValid) { |
LaunchMetrics.recordHomeScreenLaunchIntoStandaloneActivity(webappUrl, webappSource); |
- |
- String activityName = WebappActivity.class.getName(); |
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { |
- // Specifically assign the app to a particular WebappActivity instance. |
- int activityIndex = ActivityAssigner.instance(this).assign(webappId); |
- activityName += String.valueOf(activityIndex); |
- } |
- |
- // Create an intent to launch the Webapp in an unmapped WebappActivity. |
- launchIntent = new Intent(); |
- launchIntent.setClassName(this, activityName); |
- webappInfo.setWebappIntentExtras(launchIntent); |
- |
- // On L+, firing intents with the exact same data should relaunch a particular |
- // Activity. |
- launchIntent.setAction(Intent.ACTION_VIEW); |
- launchIntent.setData(Uri.parse(WebappActivity.WEBAPP_SCHEME + "://" + webappId)); |
+ launchIntent = createWebappLaunchIntent(webappInfo, isValidWebApk); |
} else { |
Log.e(TAG, "Shortcut (%s) opened in Chrome.", webappUrl); |
@@ -96,10 +88,10 @@ public class WebappLauncherActivity extends Activity { |
launchIntent.setClassName(getPackageName(), ChromeLauncherActivity.class.getName()); |
launchIntent.putExtra(ShortcutHelper.REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB, true); |
launchIntent.putExtra(ShortcutHelper.EXTRA_SOURCE, webappSource); |
+ launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
+ | ApiCompatibilityUtils.getActivityNewDocumentFlag()); |
} |
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- | ApiCompatibilityUtils.getActivityNewDocumentFlag()); |
startActivity(launchIntent); |
} |
@@ -107,6 +99,40 @@ public class WebappLauncherActivity extends Activity { |
} |
/** |
+ * Creates an Intent to launch the web app. |
+ * @param info Information about the web app. |
+ * @param isWebApk If true, launch the app as a WebApkActivity. If false, launch the app as |
+ * a WebappActivity. |
+ */ |
+ private Intent createWebappLaunchIntent(WebappInfo info, boolean isWebApk) { |
+ String activityName = isWebApk ? WebApkActivity.class.getName() |
+ : WebappActivity.class.getName(); |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { |
+ // Specifically assign the app to a particular WebappActivity instance. |
+ int activityIndex = ActivityAssigner.instance(info.id()).assign(info.id()); |
+ activityName += String.valueOf(activityIndex); |
+ } |
+ |
+ // Create an intent to launch the Webapp in an unmapped WebappActivity. |
+ Intent launchIntent = new Intent(); |
+ launchIntent.setClassName(this, activityName); |
+ info.setWebappIntentExtras(launchIntent); |
+ |
+ // On L+, firing intents with the exact same data should relaunch a particular |
+ // Activity. |
+ launchIntent.setAction(Intent.ACTION_VIEW); |
+ launchIntent.setData(Uri.parse(WebappActivity.WEBAPP_SCHEME + "://" + info.id())); |
+ |
+ if (!isWebApk) { |
+ // For WebAPK, we don't start a new task for WebApkActivity, it is just on top |
+ // of the WebAPK's main activity and in the same task. |
+ launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
+ | ApiCompatibilityUtils.getActivityNewDocumentFlag()); |
+ } |
+ return launchIntent; |
+ } |
+ |
+ /** |
* Brings a live WebappActivity back to the foreground if one exists for the given tab ID. |
* @param tabId ID of the Tab to bring back to the foreground. |
* @return True if a live WebappActivity was found, false otherwise. |
@@ -129,4 +155,17 @@ public class WebappLauncherActivity extends Activity { |
return false; |
} |
+ |
+ /** |
+ * Checks whether the package being targeted is a valid WebAPK. |
+ * @param webapkPackageName The package name of the requested WebAPK. |
+ * @return true iff all validation criteria are met. |
+ */ |
+ private boolean isValidWebApk(String webapkPackageName) { |
+ // TODO(hanxi): Adds more validation checks. For example, whether the WebAPK is signed |
+ // by the WebAPK Minting Server. |
+ return CommandLine.getInstance().hasSwitch(ChromeSwitches.ENABLE_WEBAPK) |
+ && webapkPackageName != null |
+ && webapkPackageName.startsWith(WebApkConstants.WEBAPK_PACKAGE_PREFIX); |
+ } |
} |