// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.chrome.browser.webapps; import android.content.Intent; import android.text.TextUtils; import org.chromium.base.ContextUtils; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid; import org.chromium.chrome.browser.tab.TopControlsVisibilityDelegate; import org.chromium.chrome.browser.util.UrlUtilities; import org.chromium.components.security_state.ConnectionSecurityLevel; /** * A {@link TabDelegateFactory} class to be used in all {@link Tab} instances owned by a * {@link FullScreenActivity}. */ public class WebappDelegateFactory extends FullScreenDelegateFactory { private static class WebappWebContentsDelegateAndroid extends TabWebContentsDelegateAndroid { private final WebappActivity mActivity; public WebappWebContentsDelegateAndroid(WebappActivity activity, Tab tab) { super(tab); mActivity = activity; } @Override public void activateContents() { String startUrl = mActivity.getWebappInfo().uri().toString(); // Create an Intent that will be fired toward the WebappLauncherActivity, which in turn // will fire an Intent to launch the correct WebappActivity. On L+ this could probably // be changed to call AppTask.moveToFront(), but for backwards compatibility we relaunch // it the hard way. Intent intent = new Intent(); intent.setAction(WebappLauncherActivity.ACTION_START_WEBAPP); intent.setPackage(mActivity.getPackageName()); mActivity.getWebappInfo().setWebappIntentExtras(intent); intent.putExtra( ShortcutHelper.EXTRA_MAC, ShortcutHelper.getEncodedMac(mActivity, startUrl)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ContextUtils.getApplicationContext().startActivity(intent); } } @VisibleForTesting static class TopControlsDelegate extends TopControlsVisibilityDelegate { private final WebappActivity mActivity; public TopControlsDelegate(WebappActivity activity, Tab tab) { super(tab); mActivity = activity; } @Override public boolean isShowingTopControlsEnabled() { if (!super.isShowingTopControlsEnabled()) return false; String webappStartUrl = mActivity.getWebappInfo().uri().toString(); return shouldShowTopControls(webappStartUrl, mTab.getUrl(), mTab.getSecurityLevel()); } @Override public boolean isHidingTopControlsEnabled() { return !isShowingTopControlsEnabled(); } /** * Returns whether the top controls should be shown when a webapp is navigated to * {@link url}. * @param webappStartUrl The webapp's URL when it is opened from the home screen. * @param url The webapp's current URL * @param securityLevel The security level for the webapp's current URL. * @return Whether the top controls should be shown for {@link url}. */ public static boolean shouldShowTopControls( String webappStartUrl, String url, int securityLevel) { // Do not show top controls when URL is not ready yet. boolean visible = false; if (TextUtils.isEmpty(url)) return false; boolean isSameWebsite = UrlUtilities.sameDomainOrHost(webappStartUrl, url, true); visible = !isSameWebsite || securityLevel == ConnectionSecurityLevel.DANGEROUS || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING; return visible; } } private final WebappActivity mActivity; public WebappDelegateFactory(WebappActivity activity) { mActivity = activity; } @Override public TabWebContentsDelegateAndroid createWebContentsDelegate(Tab tab) { return new WebappWebContentsDelegateAndroid(mActivity, tab); } @Override public TopControlsVisibilityDelegate createTopControlsVisibilityDelegate(Tab tab) { return new TopControlsDelegate(mActivity, tab); } }