Loading res/xml/settings.xml +14 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,20 @@ android:title="@string/settings_label" android:key="parent"> <!-- Operator hook --> <com.android.settings.IconPreferenceScreen android:key="operator_settings"> <intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" /> </com.android.settings.IconPreferenceScreen> <!-- Manufacturer hook --> <com.android.settings.IconPreferenceScreen android:key="manufacturer_settings"> <intent android:action="com.android.settings.MANUFACTURER_APPLICATION_SETTING" /> </com.android.settings.IconPreferenceScreen> <com.android.settings.IconPreferenceScreen android:title="@string/radio_controls_title" settings:icon="@drawable/ic_settings_wireless"> Loading src/com/android/settings/IconPreferenceScreen.java +23 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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; } } src/com/android/settings/Settings.java +8 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading src/com/android/settings/Utils.java +112 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -34,6 +40,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. Loading Loading @@ -89,11 +113,98 @@ public class Utils { return true; } /** * 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); } } tests/AndroidManifest.xml +21 −0 Original line number Diff line number Diff line Loading @@ -30,8 +30,29 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="Operator" android:label="Operator Hook Test" > <intent-filter> <action android:name="com.android.settings.OPERATOR_APPLICATION_SETTING" /> </intent-filter> <meta-data android:name="com.android.settings.title" android:resource="@string/operator_settings_title" /> <meta-data android:name="com.android.settings.summary" android:resource="@string/operator_settings_summary" /> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" /> </activity> <activity android:name="Manufacturer" android:label="Manufacturer Hook Test" > <intent-filter> <action android:name="com.android.settings.MANUFACTURER_APPLICATION_SETTING" /> </intent-filter> <meta-data android:name="com.android.settings.title" android:resource="@string/manufacturer_settings_title" /> <meta-data android:name="com.android.settings.summary" android:resource="@string/manufacturer_settings_summary" /> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" /> </activity> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.android.settings" android:label="Settings App Tests"> </instrumentation> <instrumentation android:name="SettingsLaunchPerformance" android:targetPackage="com.android.settings" android:label="Settings Launch Performance"> Loading Loading
res/xml/settings.xml +14 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,20 @@ android:title="@string/settings_label" android:key="parent"> <!-- Operator hook --> <com.android.settings.IconPreferenceScreen android:key="operator_settings"> <intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" /> </com.android.settings.IconPreferenceScreen> <!-- Manufacturer hook --> <com.android.settings.IconPreferenceScreen android:key="manufacturer_settings"> <intent android:action="com.android.settings.MANUFACTURER_APPLICATION_SETTING" /> </com.android.settings.IconPreferenceScreen> <com.android.settings.IconPreferenceScreen android:title="@string/radio_controls_title" settings:icon="@drawable/ic_settings_wireless"> Loading
src/com/android/settings/IconPreferenceScreen.java +23 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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; } }
src/com/android/settings/Settings.java +8 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading
src/com/android/settings/Utils.java +112 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -34,6 +40,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. Loading Loading @@ -89,11 +113,98 @@ public class Utils { return true; } /** * 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); } }
tests/AndroidManifest.xml +21 −0 Original line number Diff line number Diff line Loading @@ -30,8 +30,29 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="Operator" android:label="Operator Hook Test" > <intent-filter> <action android:name="com.android.settings.OPERATOR_APPLICATION_SETTING" /> </intent-filter> <meta-data android:name="com.android.settings.title" android:resource="@string/operator_settings_title" /> <meta-data android:name="com.android.settings.summary" android:resource="@string/operator_settings_summary" /> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" /> </activity> <activity android:name="Manufacturer" android:label="Manufacturer Hook Test" > <intent-filter> <action android:name="com.android.settings.MANUFACTURER_APPLICATION_SETTING" /> </intent-filter> <meta-data android:name="com.android.settings.title" android:resource="@string/manufacturer_settings_title" /> <meta-data android:name="com.android.settings.summary" android:resource="@string/manufacturer_settings_summary" /> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" /> </activity> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.android.settings" android:label="Settings App Tests"> </instrumentation> <instrumentation android:name="SettingsLaunchPerformance" android:targetPackage="com.android.settings" android:label="Settings Launch Performance"> Loading