OSDN Git Service

Disable app-link preferences for browser apps
authorChristopher Tate <ctate@google.com>
Tue, 8 Sep 2015 22:41:08 +0000 (15:41 -0700)
committerChristopher Tate <ctate@google.com>
Fri, 9 Oct 2015 23:02:00 +0000 (16:02 -0700)
Also make sure that the 'Clear defaults' action unsets the app's
standing as the default browser, when applicable.

Bug 23751034

Change-Id: I6131b763bfa76ba38d18cad2abbb35caffe789aa

src/com/android/settings/Utils.java
src/com/android/settings/applications/AppLaunchSettings.java
src/com/android/settings/applications/ClearDefaultsPreference.java

index d25d8c3..d2d04ec 100644 (file)
@@ -1146,9 +1146,9 @@ public final class Utils {
         boolean hasPreferred = hasPreferredActivities(pm, packageName)
                 || hasUsbDefaults(usbManager, packageName);
         int status = pm.getIntentVerificationStatus(packageName, UserHandle.myUserId());
+        // consider a visible current link-handling state to be any explicitly designated behavior
         boolean hasDomainURLsPreference =
-                (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) ||
-                (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+                status != PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
         return context.getString(hasPreferred || hasDomainURLsPreference
                 ? R.string.launch_defaults_some
                 : R.string.launch_defaults_none);
index c885b02..6c2f241 100644 (file)
 package com.android.settings.applications;
 
 import android.app.AlertDialog;
+import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IntentFilterVerificationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.preference.Preference;
-import android.preference.SwitchPreference;
 import android.util.ArraySet;
 import android.util.Log;
 import android.view.View;
@@ -52,8 +54,17 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
     private static final String KEY_SUPPORTED_DOMAIN_URLS = "app_launch_supported_domain_urls";
     private static final String KEY_CLEAR_DEFAULTS = "app_launch_clear_defaults";
 
+    private static final Intent sBrowserIntent;
+    static {
+        sBrowserIntent = new Intent()
+                .setAction(Intent.ACTION_VIEW)
+                .addCategory(Intent.CATEGORY_BROWSABLE)
+                .setData(Uri.parse("http:"));
+    }
+
     private PackageManager mPm;
 
+    private boolean mIsBrowser;
     private boolean mHasDomainUrls;
     private DropDownPreference mAppLinkState;
     private AppDomainsPreference mAppDomainUrls;
@@ -64,62 +75,91 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
         super.onCreate(savedInstanceState);
 
         addPreferencesFromResource(R.xml.installed_app_launch_settings);
+        mAppDomainUrls = (AppDomainsPreference) findPreference(KEY_SUPPORTED_DOMAIN_URLS);
+        mClearDefaultsPreference = (ClearDefaultsPreference) findPreference(KEY_CLEAR_DEFAULTS);
+        mAppLinkState = (DropDownPreference) findPreference(KEY_APP_LINK_STATE);
 
         mPm = getActivity().getPackageManager();
 
+        mIsBrowser = isBrowserApp(mPackageName);
         mHasDomainUrls =
                 (mAppEntry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0;
-        List<IntentFilterVerificationInfo> iviList = mPm.getIntentFilterVerifications(mPackageName);
-
-        List<IntentFilter> filters = mPm.getAllIntentFilters(mPackageName);
-
-        mAppDomainUrls = (AppDomainsPreference) findPreference(KEY_SUPPORTED_DOMAIN_URLS);
-        CharSequence[] entries = getEntries(mPackageName, iviList, filters);
-        mAppDomainUrls.setTitles(entries);
-        mAppDomainUrls.setValues(new int[entries.length]);
-
-        mClearDefaultsPreference = (ClearDefaultsPreference) findPreference(KEY_CLEAR_DEFAULTS);
 
+        if (!mIsBrowser) {
+            List<IntentFilterVerificationInfo> iviList = mPm.getIntentFilterVerifications(mPackageName);
+            List<IntentFilter> filters = mPm.getAllIntentFilters(mPackageName);
+            CharSequence[] entries = getEntries(mPackageName, iviList, filters);
+            mAppDomainUrls.setTitles(entries);
+            mAppDomainUrls.setValues(new int[entries.length]);
+        }
         buildStateDropDown();
     }
 
-    private void buildStateDropDown() {
-        mAppLinkState = (DropDownPreference) findPreference(KEY_APP_LINK_STATE);
+    // An app is a "browser" if it has an activity resolution that wound up
+    // marked with the 'handleAllWebDataURI' flag.
+    private boolean isBrowserApp(String packageName) {
+        sBrowserIntent.setPackage(packageName);
+        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(sBrowserIntent,
+                PackageManager.MATCH_ALL, UserHandle.myUserId());
+        final int count = list.size();
+        for (int i = 0; i < count; i++) {
+            ResolveInfo info = list.get(i);
+            if (info.activityInfo != null && info.handleAllWebDataURI) {
+                return true;
+            }
+        }
+        return false;
+    }
 
-        // Designed order of states in the dropdown:
-        //
-        // * always
-        // * ask
-        // * never
-        mAppLinkState.addItem(R.string.app_link_open_always,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
-        mAppLinkState.addItem(R.string.app_link_open_ask,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
-        mAppLinkState.addItem(R.string.app_link_open_never,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
-
-        mAppLinkState.setEnabled(mHasDomainUrls);
-        if (mHasDomainUrls) {
-            // Present 'undefined' as 'ask' because the OS treats them identically for
-            // purposes of the UI (and does the right thing around pending domain
-            // verifications that might arrive after the user chooses 'ask' in this UI).
-            final int state = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
-            mAppLinkState.setSelectedValue(
-                    (state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
-                        ? INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK
-                        : state);
-
-            // Set the callback only after setting the initial selected item
-            mAppLinkState.setCallback(new Callback() {
-                @Override
-                public boolean onItemSelected(int pos, Object value) {
-                    return updateAppLinkState((Integer) value);
-                }
-            });
+    private void buildStateDropDown() {
+        if (mIsBrowser) {
+            // Browsers don't show the app-link prefs
+            mAppLinkState.setShouldDisableView(true);
+            mAppLinkState.setEnabled(false);
+            mAppDomainUrls.setShouldDisableView(true);
+            mAppDomainUrls.setEnabled(false);
+        } else {
+            // Designed order of states in the dropdown:
+            //
+            // * always
+            // * ask
+            // * never
+            mAppLinkState.addItem(R.string.app_link_open_always,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
+            mAppLinkState.addItem(R.string.app_link_open_ask,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
+            mAppLinkState.addItem(R.string.app_link_open_never,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+
+            mAppLinkState.setEnabled(mHasDomainUrls);
+            if (mHasDomainUrls) {
+                // Present 'undefined' as 'ask' because the OS treats them identically for
+                // purposes of the UI (and does the right thing around pending domain
+                // verifications that might arrive after the user chooses 'ask' in this UI).
+                final int state = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
+                mAppLinkState.setSelectedValue(
+                        (state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
+                            ? INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK
+                            : state);
+
+                // Set the callback only after setting the initial selected item
+                mAppLinkState.setCallback(new Callback() {
+                    @Override
+                    public boolean onItemSelected(int pos, Object value) {
+                        return updateAppLinkState((Integer) value);
+                    }
+                });
+            }
         }
     }
 
     private boolean updateAppLinkState(final int newState) {
+        if (mIsBrowser) {
+            // We shouldn't get into this state, but if we do make sure
+            // not to cause any permanent mayhem.
+            return false;
+        }
+
         final int userId = UserHandle.myUserId();
         final int priorState = mPm.getIntentVerificationStatus(mPackageName, userId);
 
index 8be4be0..bcb6a8a 100644 (file)
@@ -93,9 +93,13 @@ public class ClearDefaultsPreference extends Preference {
             @Override
             public void onClick(View v) {
                 if (mUsbManager != null) {
+                    final int userId = UserHandle.myUserId();
                     mPm.clearPackagePreferredActivities(mPackageName);
+                    if (isDefaultBrowser(mPackageName)) {
+                        mPm.setDefaultBrowserPackageName(null, userId);
+                    }
                     try {
-                        mUsbManager.clearDefaults(mPackageName, UserHandle.myUserId());
+                        mUsbManager.clearDefaults(mPackageName, userId);
                     } catch (RemoteException e) {
                         Log.e(TAG, "mUsbManager.clearDefaults", e);
                     }
@@ -122,6 +126,7 @@ public class ClearDefaultsPreference extends Preference {
 
         TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
         boolean autoLaunchEnabled = Utils.hasPreferredActivities(mPm, mPackageName)
+                || isDefaultBrowser(mPackageName)
                 || Utils.hasUsbDefaults(mUsbManager, mPackageName);
         if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
             resetLaunchDefaultsUi(autoLaunchView);
@@ -165,6 +170,11 @@ public class ClearDefaultsPreference extends Preference {
         return true;
     }
 
+    private boolean isDefaultBrowser(String packageName) {
+        final String defaultBrowser = mPm.getDefaultBrowserPackageName(UserHandle.myUserId());
+        return packageName.equals(defaultBrowser);
+    }
+
     private void resetLaunchDefaultsUi(TextView autoLaunchView) {
         autoLaunchView.setText(R.string.auto_launch_disable_text);
         // Disable clear activities button