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..298b348a9508b3275feba83dec606fd68e20a194 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,17 @@ 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)); |
+ // Create an intent to launch the Webapp in an unmapped WebappActivity or |
+ // WebApkActivity. |
+ launchIntent = createWebappLaunchIntent(webappInfo, isValidWebApk); |
} else { |
Log.e(TAG, "Shortcut (%s) opened in Chrome.", webappUrl); |
@@ -96,16 +91,44 @@ 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); |
} |
ApiCompatibilityUtils.finishAndRemoveTask(this); |
} |
+ private Intent createWebappLaunchIntent(WebappInfo info, boolean isValidWebApk) { |
+ String activityName = isValidWebApk ? 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(this).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 (!isValidWebApk) { |
+ // 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. |
gone
2016/05/25 21:50:14
nit: Indentation is messed up.
Xi Han
2016/05/26 17:23:36
Updated:)
|
+ 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. |
@@ -129,4 +152,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); |
+ } |
} |