Chromium Code Reviews| 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); |
| + } |
| } |