diff options
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/settings/IconPreferenceScreen.java | 23 | ||||
-rw-r--r-- | src/com/android/settings/Settings.java | 8 | ||||
-rw-r--r-- | src/com/android/settings/Utils.java | 113 |
3 files changed, 143 insertions, 1 deletions
diff --git a/src/com/android/settings/IconPreferenceScreen.java b/src/com/android/settings/IconPreferenceScreen.java index c7c5303..31abf0a 100644 --- a/src/com/android/settings/IconPreferenceScreen.java +++ b/src/com/android/settings/IconPreferenceScreen.java @@ -22,6 +22,7 @@ import android.graphics.drawable.Drawable; import android.preference.Preference; import android.util.AttributeSet; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; public class IconPreferenceScreen extends Preference { @@ -48,4 +49,26 @@ public class IconPreferenceScreen extends Preference { imageView.setImageDrawable(mIcon); } } + + /** + * Sets the icon for this Preference with a Drawable. + * + * @param icon The icon for this Preference + */ + public void setIcon(Drawable icon) { + if ((icon == null && mIcon != null) || (icon != null && !icon.equals(mIcon))) { + mIcon = icon; + notifyChanged(); + } + } + + /** + * Returns the icon of this Preference. + * + * @return The icon. + * @see #setIcon(Drawable) + */ + public Drawable getIcon() { + return mIcon; + } } diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 5309cf5..c53c2fa 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -30,6 +30,9 @@ public class Settings extends PreferenceActivity { private static final String KEY_SEARCH_SETTINGS = "search_settings"; private static final String KEY_DOCK_SETTINGS = "dock_settings"; + private static final String KEY_OPERATOR_SETTINGS = "operator_settings"; + private static final String KEY_MANUFACTURER_SETTINGS = "manufacturer_settings"; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -46,6 +49,11 @@ public class Settings extends PreferenceActivity { if (getResources().getBoolean(R.bool.has_dock_settings) == false && dockSettings != null) { parent.removePreference(dockSettings); } + + Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(this, parent, + KEY_OPERATOR_SETTINGS); + Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(this, parent, + KEY_MANUFACTURER_SETTINGS); } @Override diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index d4f1f11..b29ec06 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -22,8 +22,14 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.SystemProperties; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; +import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceGroup; +import android.text.TextUtils; import java.util.List; @@ -35,6 +41,24 @@ public class Utils { public static final int UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY = 1; /** + * Name of the meta-data item that should be set in the AndroidManifest.xml + * to specify the icon that should be displayed for the preference. + */ + private static final String META_DATA_PREFERENCE_ICON = "com.android.settings.icon"; + + /** + * Name of the meta-data item that should be set in the AndroidManifest.xml + * to specify the title that should be displayed for the preference. + */ + private static final String META_DATA_PREFERENCE_TITLE = "com.android.settings.title"; + + /** + * Name of the meta-data item that should be set in the AndroidManifest.xml + * to specify the summary text that should be displayed for the preference. + */ + private static final String META_DATA_PREFERENCE_SUMMARY = "com.android.settings.summary"; + + /** * Finds a matching activity for a preference's intent. If a matching * activity is not found, it will remove the preference. * @@ -90,10 +114,97 @@ public class Utils { } /** + * Finds a matching activity for a preference's intent. If a matching + * activity is not found, it will remove the preference. The icon, title and + * summary of the preference will also be updated with the values retrieved + * from the activity's meta-data elements. If no meta-data elements are + * specified then the preference title will be set to match the label of the + * activity, an icon and summary text will not be displayed. + * + * @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. + * + * @return Whether an activity was found. If false, the preference was + * removed. + * + * @see {@link #META_DATA_PREFERENCE_ICON} + * {@link #META_DATA_PREFERENCE_TITLE} + * {@link #META_DATA_PREFERENCE_SUMMARY} + */ + public static boolean updatePreferenceToSpecificActivityFromMetaDataOrRemove(Context context, + PreferenceGroup parentPreferenceGroup, String preferenceKey) { + + IconPreferenceScreen preference = (IconPreferenceScreen)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, PackageManager.GET_META_DATA); + 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) { + Drawable icon = null; + String title = null; + String summary = null; + + // Get the activity's meta-data + try { + Resources res = pm + .getResourcesForApplication(resolveInfo.activityInfo.packageName); + Bundle metaData = resolveInfo.activityInfo.metaData; + + if (res != null && metaData != null) { + icon = res.getDrawable(metaData.getInt(META_DATA_PREFERENCE_ICON)); + title = res.getString(metaData.getInt(META_DATA_PREFERENCE_TITLE)); + summary = res.getString(metaData.getInt(META_DATA_PREFERENCE_SUMMARY)); + } + } catch (NameNotFoundException e) { + // Ignore + } catch (NotFoundException e) { + // Ignore + } + + // Set the preference title to the activity's label if no + // meta-data is found + if (TextUtils.isEmpty(title)) { + title = resolveInfo.loadLabel(pm).toString(); + } + + // Set icon, title and summary for the preference + preference.setIcon(icon); + preference.setTitle(title); + preference.setSummary(summary); + + // Replace the intent with this specific activity + preference.setIntent(new Intent().setClassName( + resolveInfo.activityInfo.packageName, + resolveInfo.activityInfo.name)); + + return true; + } + } + } + + // Did not find a matching activity, so remove the preference + parentPreferenceGroup.removePreference(preference); + + return false; + } + + /** * Returns true if Monkey is running. */ public static boolean isMonkeyRunning() { return SystemProperties.getBoolean("ro.monkey", false); } - } |