summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorSatish Sampath <satish@android.com>2009-06-02 23:35:54 +0100
committerSatish Sampath <satish@android.com>2009-06-03 07:54:42 +0100
commit8dbe612dc60526d635e57257b58627b33a099678 (patch)
tree2f02924de3a2e890aab2d4a75a1b52d2e2aa1328 /services
parent5f784df5680e07f6cbc5d929560dfadc0e22db3b (diff)
downloadframeworks_base-8dbe612dc60526d635e57257b58627b33a099678.zip
frameworks_base-8dbe612dc60526d635e57257b58627b33a099678.tar.gz
frameworks_base-8dbe612dc60526d635e57257b58627b33a099678.tar.bz2
Adding internal method replacePreferredActivity.
This was required because we need a way to set the preferred activity for a particular intent filter based on user selection (in our case the ACTION_WEB_SEARCH intent filter for selecting the preferred search engine from the list of available search engines providers). The current addPreferredActivity call was not sufficient since it leaves the existing preferred activities in the list and does not remove them, which this call does.
Diffstat (limited to 'services')
-rw-r--r--services/java/com/android/server/PackageManagerService.java37
1 files changed, 37 insertions, 0 deletions
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index c9bdd3c..8da40ac 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -19,6 +19,7 @@ package com.android.server;
import com.android.internal.app.ResolverActivity;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.XmlUtils;
+import com.android.server.PackageManagerService.PreferredActivity;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -4507,6 +4508,42 @@ class PackageManagerService extends IPackageManager.Stub {
}
}
+ public void replacePreferredActivity(IntentFilter filter, int match,
+ ComponentName[] set, ComponentName activity) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
+ if (filter.countActions() != 1) {
+ throw new IllegalArgumentException(
+ "replacePreferredActivity expects filter to have only 1 action.");
+ }
+ if (filter.countCategories() != 1) {
+ throw new IllegalArgumentException(
+ "replacePreferredActivity expects filter to have only 1 category.");
+ }
+ if (filter.countDataAuthorities() != 0
+ || filter.countDataPaths() != 0
+ || filter.countDataSchemes() != 0
+ || filter.countDataTypes() != 0) {
+ throw new IllegalArgumentException(
+ "replacePreferredActivity expects filter to have no data authorities, " +
+ "paths, schemes or types.");
+ }
+ synchronized (mPackages) {
+ Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator();
+ String action = filter.getAction(0);
+ String category = filter.getCategory(0);
+ while (it.hasNext()) {
+ PreferredActivity pa = it.next();
+ if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) {
+ it.remove();
+ Log.i(TAG, "Removed preferred activity " + pa.mActivity + ":");
+ filter.dump(new LogPrinter(Log.INFO, TAG), " ");
+ }
+ }
+ addPreferredActivity(filter, match, set, activity);
+ }
+ }
+
public void clearPackagePreferredActivities(String packageName) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);