| Index: chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
|
| index 1f3e92d29ee40979c3c4066c8b3e75b407ff8e2e..d6e13f807a97b27f2f8d4fb0672cf4f761f25188 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
|
| @@ -30,6 +30,8 @@ import org.chromium.base.ApplicationStatus;
|
| import org.chromium.base.ContextUtils;
|
| import org.chromium.base.PathUtils;
|
| import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.VisibleForTesting;
|
| +import org.chromium.base.metrics.RecordUserAction;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.ChromeActivity;
|
| import org.chromium.chrome.browser.ChromeFeatureList;
|
| @@ -47,6 +49,7 @@ import org.chromium.ui.base.WindowAndroid;
|
| import org.chromium.ui.base.WindowAndroid.PermissionCallback;
|
| import org.chromium.webapk.lib.client.WebApkValidator;
|
|
|
| +import java.util.ArrayList;
|
| import java.util.List;
|
|
|
| /**
|
| @@ -239,13 +242,15 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
|
|
| @Override
|
| public int countSpecializedHandlers(List<ResolveInfo> infos) {
|
| - return countSpecializedHandlersWithFilter(infos, null);
|
| + return getSpecializedHandlersWithFilter(infos, null).size();
|
| }
|
|
|
| - static int countSpecializedHandlersWithFilter(
|
| + @VisibleForTesting
|
| + static ArrayList<String> getSpecializedHandlersWithFilter(
|
| List<ResolveInfo> infos, String filterPackageName) {
|
| + ArrayList<String> result = new ArrayList<String>();
|
| if (infos == null) {
|
| - return 0;
|
| + return result;
|
| }
|
|
|
| int count = 0;
|
| @@ -266,9 +271,9 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
| continue;
|
| }
|
|
|
| - ++count;
|
| + result.add(info.activityInfo != null ? info.activityInfo.packageName : "");
|
| }
|
| - return count;
|
| + return result;
|
| }
|
|
|
| /**
|
| @@ -285,7 +290,7 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
| try {
|
| List<ResolveInfo> handlers = context.getPackageManager().queryIntentActivities(
|
| intent, PackageManager.GET_RESOLVED_FILTER);
|
| - return countSpecializedHandlersWithFilter(handlers, packageName) > 0;
|
| + return getSpecializedHandlersWithFilter(handlers, packageName).size() > 0;
|
| } catch (RuntimeException e) {
|
| logTransactionTooLargeOrRethrow(e, intent);
|
| }
|
| @@ -312,6 +317,7 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
| Context context = getAvailableContext();
|
| if (!(context instanceof Activity)) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| context.startActivity(intent);
|
| + recordExternalNavigationDispatched(intent);
|
| } catch (RuntimeException e) {
|
| logTransactionTooLargeOrRethrow(e, intent);
|
| }
|
| @@ -319,6 +325,7 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
|
|
| @Override
|
| public boolean startActivityIfNeeded(Intent intent) {
|
| + boolean activityWasLaunched;
|
| // Only touches disk on Kitkat. See http://crbug.com/617725 for more context.
|
| StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
|
| StrictMode.allowThreadDiskReads();
|
| @@ -326,10 +333,12 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
| forcePdfViewerAsIntentHandlerIfNeeded(mApplicationContext, intent);
|
| Context context = getAvailableContext();
|
| if (context instanceof Activity) {
|
| - return ((Activity) context).startActivityIfNeeded(intent, -1);
|
| + activityWasLaunched = ((Activity) context).startActivityIfNeeded(intent, -1);
|
| } else {
|
| - return false;
|
| + activityWasLaunched = false;
|
| }
|
| + if (activityWasLaunched) recordExternalNavigationDispatched(intent);
|
| + return activityWasLaunched;
|
| } catch (RuntimeException e) {
|
| logTransactionTooLargeOrRethrow(e, intent);
|
| return false;
|
| @@ -338,6 +347,14 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
| }
|
| }
|
|
|
| + private void recordExternalNavigationDispatched(Intent intent) {
|
| + ArrayList<String> specializedHandlers = intent.getStringArrayListExtra(
|
| + IntentHandler.EXTRA_EXTERNAL_NAV_PACKAGES);
|
| + if (specializedHandlers != null && specializedHandlers.size() > 0) {
|
| + RecordUserAction.record("MobileExternalNavigationDispatched");
|
| + }
|
| + }
|
| +
|
| @Override
|
| public void startIncognitoIntent(final Intent intent, final String referrerUrl,
|
| final String fallbackUrl, final Tab tab, final boolean needsToCloseTab) {
|
| @@ -522,4 +539,10 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
|
|
|
| return PDF_EXTENSION.equals(fileExtension);
|
| }
|
| +
|
| + @Override
|
| + public void maybeRecordAppHandlersInIntent(Intent intent, List<ResolveInfo> infos) {
|
| + intent.putExtra(IntentHandler.EXTRA_EXTERNAL_NAV_PACKAGES,
|
| + getSpecializedHandlersWithFilter(infos, null));
|
| + }
|
| }
|
|
|