summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Tate <ctate@google.com>2015-07-01 16:52:43 -0700
committerChristopher Tate <ctate@google.com>2015-07-07 14:09:52 -0700
commita08a225d184fa75bb066fcb2d151d589106986de (patch)
tree3b422430ff8803e50da25a2b1a300ac69967d720
parent2bd619d5ed2cdf5a34c3e3830469edc3b29a6eb0 (diff)
downloadpackages_apps_Settings-a08a225d184fa75bb066fcb2d151d589106986de.tar.gz
packages_apps_Settings-a08a225d184fa75bb066fcb2d151d589106986de.tar.bz2
packages_apps_Settings-a08a225d184fa75bb066fcb2d151d589106986de.zip
App link handling is not just for "official" verified handlers
Allow apps to be enabled as link handlers for their accepted domains even when they are not the "official" apps for those domains. Also clean up a bunch of inconsistent/wrong state reporting in the UI. Bug 22069429 Change-Id: Ic3b2bcc476dfc30085d3df7412b02bdc5d53df6d
-rw-r--r--src/com/android/settings/Utils.java25
-rw-r--r--src/com/android/settings/applications/AppLaunchSettings.java86
-rw-r--r--src/com/android/settings/applications/ManageApplications.java11
3 files changed, 68 insertions, 54 deletions
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 21a5019f0..01f4eb86e 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -33,6 +33,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
+import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -70,6 +71,7 @@ import android.provider.ContactsContract.RawContacts;
import android.service.persistentdata.PersistentDataBlockManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
@@ -1109,6 +1111,29 @@ public final class Utils {
return prefActList.size() > 0;
}
+ public static ArraySet<String> getHandledDomains(PackageManager pm, String packageName) {
+ List<IntentFilterVerificationInfo> iviList = pm.getIntentFilterVerifications(packageName);
+ List<IntentFilter> filters = pm.getAllIntentFilters(packageName);
+
+ ArraySet<String> result = new ArraySet<>();
+ if (iviList.size() > 0) {
+ for (IntentFilterVerificationInfo ivi : iviList) {
+ for (String host : ivi.getDomains()) {
+ result.add(host);
+ }
+ }
+ }
+ if (filters != null && filters.size() > 0) {
+ for (IntentFilter filter : filters) {
+ if (filter.hasDataScheme(IntentFilter.SCHEME_HTTP) ||
+ filter.hasDataScheme(IntentFilter.SCHEME_HTTPS)) {
+ result.addAll(filter.getHostsList());
+ }
+ }
+ }
+ return result;
+ }
+
public static CharSequence getLaunchByDeafaultSummary(ApplicationsState.AppEntry appEntry,
IUsbManager usbManager, PackageManager pm, Context context) {
String packageName = appEntry.info.packageName;
diff --git a/src/com/android/settings/applications/AppLaunchSettings.java b/src/com/android/settings/applications/AppLaunchSettings.java
index 05a1fcae8..a59171f75 100644
--- a/src/com/android/settings/applications/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/AppLaunchSettings.java
@@ -17,32 +17,31 @@
package com.android.settings.applications;
import android.app.AlertDialog;
-import android.content.ComponentName;
-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.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;
import android.view.View.OnClickListener;
import com.android.internal.logging.MetricsLogger;
import com.android.settings.R;
+import com.android.settings.Utils;
-import java.util.List;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
-import static android.content.pm.PackageManager.GET_ACTIVITIES;
-import static android.content.pm.PackageManager.GET_META_DATA;
-import static android.content.pm.PackageManager.GET_RESOLVED_FILTER;
+import java.util.List;
public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListener,
Preference.OnPreferenceChangeListener {
+ private static final String TAG = "AppLaunchSettings";
private static final String KEY_OPEN_DOMAIN_URLS = "app_launch_open_domain_urls";
private static final String KEY_SUPPORTED_DOMAIN_URLS = "app_launch_supported_domain_urls";
@@ -50,6 +49,7 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
private PackageManager mPm;
+ private boolean mHasDomainUrls;
private SwitchPreference mOpenDomainUrls;
private AppDomainsPreference mAppDomainUrls;
private ClearDefaultsPreference mClearDefaultsPreference;
@@ -61,61 +61,50 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
addPreferencesFromResource(R.xml.installed_app_launch_settings);
mPm = getActivity().getPackageManager();
- final int myUserId = UserHandle.myUserId();
mOpenDomainUrls = (SwitchPreference) findPreference(KEY_OPEN_DOMAIN_URLS);
mOpenDomainUrls.setOnPreferenceChangeListener(this);
- boolean hasDomainUrls =
+ mHasDomainUrls =
(mAppEntry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0;
List<IntentFilterVerificationInfo> iviList = mPm.getIntentFilterVerifications(mPackageName);
- boolean enabled = hasDomainUrls && (iviList.size() != 0);
-
- mOpenDomainUrls.setEnabled(enabled);
- if (enabled) {
- final int status = mPm.getIntentVerificationStatus(mPackageName, myUserId);
- boolean checked =
- (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
- mOpenDomainUrls.setChecked(checked);
- }
-
List<IntentFilter> filters = mPm.getAllIntentFilters(mPackageName);
mAppDomainUrls = (AppDomainsPreference) findPreference(KEY_SUPPORTED_DOMAIN_URLS);
- CharSequence[] entries = getEntries(iviList, filters);
+ CharSequence[] entries = getEntries(mPackageName, iviList, filters);
mAppDomainUrls.setTitles(entries);
mAppDomainUrls.setValues(new int[entries.length]);
mClearDefaultsPreference = (ClearDefaultsPreference) findPreference(KEY_CLEAR_DEFAULTS);
+
+ updateDomainUrlPrefState();
}
- private CharSequence[] getEntries(List<IntentFilterVerificationInfo> iviList,
- List<IntentFilter> filters) {
- ArraySet<String> result = new ArraySet<>();
- if (iviList.size() > 0) {
- for (IntentFilterVerificationInfo ivi : iviList) {
- for (String host : ivi.getDomains()) {
- result.add(host);
- }
- }
- }
- if (filters != null && filters.size() > 0) {
- for (IntentFilter filter : filters) {
- if (filter.hasDataScheme(IntentFilter.SCHEME_HTTP) ||
- filter.hasDataScheme(IntentFilter.SCHEME_HTTPS)) {
- result.addAll(filter.getHostsList());
- }
+ private void updateDomainUrlPrefState() {
+ mOpenDomainUrls.setEnabled(mHasDomainUrls);
+
+ boolean checked = false;
+ if (mHasDomainUrls) {
+ final int status = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
+ if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
+ checked = true;
}
}
- return result.toArray(new CharSequence[0]);
+ mOpenDomainUrls.setChecked(checked);
+ }
+
+ private CharSequence[] getEntries(String packageName, List<IntentFilterVerificationInfo> iviList,
+ List<IntentFilter> filters) {
+ ArraySet<String> result = Utils.getHandledDomains(mPm, packageName);
+ return result.toArray(new CharSequence[result.size()]);
}
@Override
protected boolean refreshUi() {
mClearDefaultsPreference.setPackageName(mPackageName);
mClearDefaultsPreference.setAppEntry(mAppEntry);
-
+ updateDomainUrlPrefState();
return true;
}
@@ -125,7 +114,6 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
return null;
}
-
@Override
public void onClick(View v) {
// Nothing to do
@@ -136,11 +124,21 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
boolean ret = false;
final String key = preference.getKey();
if (KEY_OPEN_DOMAIN_URLS.equals(key)) {
- SwitchPreference pref = (SwitchPreference) preference;
- int status = !pref.isChecked() ?
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS :
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
- ret = mPm.updateIntentVerificationStatus(mPackageName, status, UserHandle.myUserId());
+ final SwitchPreference pref = (SwitchPreference) preference;
+ final Boolean switchedOn = (Boolean) newValue;
+ int newState = switchedOn ?
+ INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS :
+ INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
+ final int userId = UserHandle.myUserId();
+ boolean success = mPm.updateIntentVerificationStatus(mPackageName, newState, userId);
+ if (success) {
+ // read back the state to ensure canonicality
+ newState = mPm.getIntentVerificationStatus(mPackageName, userId);
+ ret = (newState == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
+ pref.setChecked(ret);
+ } else {
+ Log.e(TAG, "Couldn't update intent verification status!");
+ }
}
return ret;
}
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index c1566d05d..0a09133ff 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -20,7 +20,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
-import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
@@ -76,7 +75,6 @@ import com.android.settingslib.applications.ApplicationsState.VolumeFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.List;
/**
* Activity to pick an application that will be used to display installation information and
@@ -1047,14 +1045,7 @@ public class ManageApplications extends InstrumentedFragment
}
private CharSequence getDomainsSummary(String packageName) {
- ArraySet<String> result = new ArraySet<>();
- List<IntentFilterVerificationInfo> list =
- mPm.getIntentFilterVerifications(packageName);
- for (IntentFilterVerificationInfo ivi : list) {
- for (String host : ivi.getDomains()) {
- result.add(host);
- }
- }
+ ArraySet<String> result = Utils.getHandledDomains(mPm, packageName);
if (result.size() == 0) {
return mContext.getString(R.string.domain_urls_summary_none);
} else if (result.size() == 1) {