| Index: chrome/android/java/src/org/chromium/chrome/browser/InstantAppsHandler.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/InstantAppsHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/InstantAppsHandler.java
|
| deleted file mode 100644
|
| index 3515dc84b7f0f7743c628bdbea66fdeba6a102f9..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/InstantAppsHandler.java
|
| +++ /dev/null
|
| @@ -1,225 +0,0 @@
|
| -// 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;
|
| -
|
| -import android.content.Context;
|
| -import android.content.Intent;
|
| -import android.os.StrictMode;
|
| -import android.os.SystemClock;
|
| -import android.provider.Browser;
|
| -
|
| -import org.chromium.base.CommandLine;
|
| -import org.chromium.base.FieldTrialList;
|
| -import org.chromium.base.Log;
|
| -import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl;
|
| -import org.chromium.chrome.browser.metrics.LaunchMetrics.TimesHistogramSample;
|
| -import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
|
| -import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
|
| -import org.chromium.chrome.browser.util.IntentUtils;
|
| -
|
| -import java.util.concurrent.TimeUnit;
|
| -
|
| -/** A launcher for Instant Apps. */
|
| -public class InstantAppsHandler {
|
| - private static final String TAG = "InstantAppsHandler";
|
| -
|
| - private static final Object INSTANCE_LOCK = new Object();
|
| - private static InstantAppsHandler sInstance;
|
| -
|
| - private static final String DO_NOT_LAUNCH_EXTRA =
|
| - "com.google.android.gms.instantapps.DO_NOT_LAUNCH_INSTANT_APP";
|
| -
|
| - private static final String CUSTOM_APPS_INSTANT_APP_EXTRA =
|
| - "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
|
| -
|
| - private static final String INSTANT_APP_START_TIME_EXTRA =
|
| - "org.chromium.chrome.INSTANT_APP_START_TIME";
|
| -
|
| - /** Finch experiment name. */
|
| - private static final String INSTANT_APPS_EXPERIMENT_NAME = "InstantApps";
|
| -
|
| - /** Finch experiment group which is enabled for instant apps. */
|
| - private static final String INSTANT_APPS_ENABLED_ARM = "InstantAppsEnabled";
|
| -
|
| - /** Finch experiment group which is disabled for instant apps. */
|
| - private static final String INSTANT_APPS_DISABLED_ARM = "InstantAppsDisabled";
|
| -
|
| - /** A histogram to record how long each handleIntent() call took. */
|
| - private static final TimesHistogramSample sHandleIntentDuration = new TimesHistogramSample(
|
| - "Android.InstantApps.HandleIntentDuration", TimeUnit.MILLISECONDS);
|
| -
|
| - /** A histogram to record how long the fallback intent roundtrip was. */
|
| - private static final TimesHistogramSample sFallbackIntentTimes = new TimesHistogramSample(
|
| - "Android.InstantApps.FallbackDuration", TimeUnit.MILLISECONDS);
|
| -
|
| - /** A histogram to record how long the GMS Core API call took. */
|
| - private static final TimesHistogramSample sInstantAppsApiCallTimes = new TimesHistogramSample(
|
| - "Android.InstantApps.ApiCallDuration", TimeUnit.MILLISECONDS);
|
| -
|
| -
|
| - /** @return The singleton instance of {@link InstantAppsHandler}. */
|
| - public static InstantAppsHandler getInstance(ChromeApplication application) {
|
| - synchronized (INSTANCE_LOCK) {
|
| - if (sInstance == null) {
|
| - sInstance = application.createInstantAppsHandler();
|
| - }
|
| - }
|
| - return sInstance;
|
| - }
|
| -
|
| - /**
|
| - * Check the cached value to figure out if the feature is enabled. We have to use the cached
|
| - * value because native library hasn't yet been loaded.
|
| - * @param context The application context.
|
| - * @return Whether the feature is enabled.
|
| - */
|
| - private boolean isEnabled(Context context) {
|
| - // Will go away once the feature is enabled for everyone by default.
|
| - StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
|
| - try {
|
| - return ChromePreferenceManager.getInstance(context).getCachedInstantAppsEnabled();
|
| - } finally {
|
| - StrictMode.setThreadPolicy(oldPolicy);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Record how long the handleIntent() method took.
|
| - * @param startTime The timestamp for handleIntent start time.
|
| - */
|
| - private void recordHandleIntentDuration(long startTime) {
|
| - sHandleIntentDuration.record(SystemClock.elapsedRealtime() - startTime);
|
| - }
|
| -
|
| - /**
|
| - * Record the amount of time spent in the instant apps API call.
|
| - * @param startTime The time at which we started doing computations.
|
| - */
|
| - protected void recordInstantAppsApiCallTime(long startTime) {
|
| - sInstantAppsApiCallTimes.record(SystemClock.elapsedRealtime() - startTime);
|
| - }
|
| -
|
| - /**
|
| - * In the case Chrome is called through the fallback mechanism from Instant Apps, record the
|
| - * amount of time the whole trip took.
|
| - * @param intent The current intent.
|
| - */
|
| - private void maybeRecordFallbackDuration(Intent intent) {
|
| - if (intent.hasExtra(INSTANT_APP_START_TIME_EXTRA)) {
|
| - Long startTime = intent.getLongExtra(INSTANT_APP_START_TIME_EXTRA, 0);
|
| - if (startTime != 0) {
|
| - sFallbackIntentTimes.record(SystemClock.elapsedRealtime() - startTime);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Cache whether the Instant Apps feature is enabled.
|
| - * This should only be called with the native library loaded.
|
| - */
|
| - public void cacheInstantAppsEnabled(Context context) {
|
| - boolean isEnabled = false;
|
| - boolean wasEnabled = isEnabled(context);
|
| - CommandLine instance = CommandLine.getInstance();
|
| - if (instance.hasSwitch(ChromeSwitches.DISABLE_APP_LINK)) {
|
| - isEnabled = false;
|
| - } else if (instance.hasSwitch(ChromeSwitches.ENABLE_APP_LINK)) {
|
| - isEnabled = true;
|
| - } else {
|
| - String experiment = FieldTrialList.findFullName(INSTANT_APPS_EXPERIMENT_NAME);
|
| - if (INSTANT_APPS_DISABLED_ARM.equals(experiment)) {
|
| - isEnabled = false;
|
| - } else if (INSTANT_APPS_ENABLED_ARM.equals(experiment)) {
|
| - isEnabled = true;
|
| - }
|
| - }
|
| -
|
| - if (isEnabled != wasEnabled) {
|
| - ChromePreferenceManager.getInstance(context).setCachedInstantAppsEnabled(isEnabled);
|
| - }
|
| - }
|
| -
|
| - /** Handle incoming intent. */
|
| - public boolean handleIncomingIntent(Context context, Intent intent,
|
| - boolean isCustomTabsIntent) {
|
| - long startTimeStamp = SystemClock.elapsedRealtime();
|
| - boolean result = handleIncomingIntentInternal(context, intent, isCustomTabsIntent,
|
| - startTimeStamp);
|
| - recordHandleIntentDuration(startTimeStamp);
|
| - return result;
|
| - }
|
| -
|
| - private boolean handleIncomingIntentInternal(
|
| - Context context, Intent intent, boolean isCustomTabsIntent, long startTime) {
|
| - if (!isEnabled(context)
|
| - || IntentUtils.safeGetBooleanExtra(intent, DO_NOT_LAUNCH_EXTRA, false)
|
| - || IntentUtils.safeGetBooleanExtra(
|
| - intent, IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, false)
|
| - || (isCustomTabsIntent && !IntentUtils.safeGetBooleanExtra(
|
| - intent, CUSTOM_APPS_INSTANT_APP_EXTRA, false))
|
| - || DataReductionProxySettings.isEnabledBeforeNativeLoad(context)
|
| - || isIntentFromChrome(context, intent)
|
| - || (intent.getAction() != Intent.ACTION_VIEW)) {
|
| - Log.i(TAG, "Not handling with Instant Apps");
|
| - return false;
|
| - }
|
| -
|
| - maybeRecordFallbackDuration(intent);
|
| -
|
| - // Used to search for the intent handlers. Needs null component to return correct results.
|
| - Intent intentCopy = new Intent(intent);
|
| - intentCopy.setComponent(null);
|
| -
|
| - if (!(isCustomTabsIntent || isChromeDefaultHandler(context))
|
| - || ExternalNavigationDelegateImpl.isPackageSpecializedHandler(
|
| - context, null, intentCopy)) {
|
| - // Chrome is not the default browser or a specialized handler exists.
|
| - Log.i(TAG, "Not handling with Instant Apps because Chrome is not default or "
|
| - + "there's a specialized handler");
|
| - return false;
|
| - }
|
| -
|
| - Intent callbackIntent = new Intent(intent);
|
| - callbackIntent.putExtra(DO_NOT_LAUNCH_EXTRA, true);
|
| - callbackIntent.putExtra(INSTANT_APP_START_TIME_EXTRA, startTime);
|
| -
|
| - return tryLaunchingInstantApp(context, intent, isCustomTabsIntent, callbackIntent);
|
| - }
|
| -
|
| - /**
|
| - * Attempts to launch an Instant App, if possible.
|
| - * @param context The activity context.
|
| - * @param intent The incoming intent.
|
| - * @param isCustomTabsIntent Whether the intent is for a CustomTab.
|
| - * @param fallbackIntent The intent that will be launched by Instant Apps in case of failure to
|
| - * load.
|
| - * @return Whether an Instant App was launched.
|
| - */
|
| - protected boolean tryLaunchingInstantApp(
|
| - Context context, Intent intent, boolean isCustomTabsIntent, Intent fallbackIntent) {
|
| - return false;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether the intent was fired from Chrome. This happens when the user gets a
|
| - * disambiguation dialog and chooses to stay in Chrome.
|
| - */
|
| - private boolean isIntentFromChrome(Context context, Intent intent) {
|
| - return context.getPackageName().equals(IntentUtils.safeGetStringExtra(
|
| - intent, Browser.EXTRA_APPLICATION_ID))
|
| - // We shouldn't leak internal intents with authentication tokens
|
| - || IntentHandler.wasIntentSenderChrome(intent, context);
|
| - }
|
| -
|
| - /** @return Whether Chrome is the default browser on the device. */
|
| - private boolean isChromeDefaultHandler(Context context) {
|
| - StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
|
| - try {
|
| - return ChromePreferenceManager.getInstance(context).getCachedChromeDefaultBrowser();
|
| - } finally {
|
| - StrictMode.setThreadPolicy(oldPolicy);
|
| - }
|
| - }
|
| -}
|
|
|