diff options
Diffstat (limited to 'src/com/android/settings/Utils.java')
| -rw-r--r-- | src/com/android/settings/Utils.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java new file mode 100644 index 000000000..a23272b81 --- /dev/null +++ b/src/com/android/settings/Utils.java @@ -0,0 +1,91 @@ +/** + * Copyright (C) 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package com.android.settings; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.preference.Preference; +import android.preference.PreferenceGroup; + +import java.util.List; + +public class Utils { + + /** + * Set the preference's title to the matching activity's label. + */ + public static final int UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY = 1; + + /** + * Finds a matching activity for a preference's intent. If a matching + * activity is not found, it will remove the preference. + * + * @param context The context. + * @param parentPreferenceGroup The preference group that contains the + * preference whose intent is being resolved. + * @param preferenceKey The key of the preference whose intent is being + * resolved. + * @param flags 0 or one or more of + * {@link #UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY} + * . + * @return Whether an activity was found. If false, the preference was + * removed. + */ + public static boolean updatePreferenceToSpecificActivityOrRemove(Context context, + PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) { + + Preference preference = parentPreferenceGroup.findPreference(preferenceKey); + if (preference == null) { + return false; + } + + Intent intent = preference.getIntent(); + if (intent != null) { + // Find the activity that is in the system image + PackageManager pm = context.getPackageManager(); + List<ResolveInfo> list = pm.queryIntentActivities(intent, 0); + int listSize = list.size(); + for (int i = 0; i < listSize; i++) { + ResolveInfo resolveInfo = list.get(i); + if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) + != 0) { + + // Replace the intent with this specific activity + preference.setIntent(new Intent().setClassName( + resolveInfo.activityInfo.packageName, + resolveInfo.activityInfo.name)); + + if ((flags & UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY) != 0) { + // Set the preference title to the activity's label + preference.setTitle(resolveInfo.loadLabel(pm)); + } + + return true; + } + } + } + + // Did not find a matching activity, so remove the preference + parentPreferenceGroup.removePreference(preference); + + return true; + } + +} |
