Settings: Add a hook for operator or vendor specific settings.
The Settings application now provides a hook that can be used by an operator or a vendor specific application to add an activity of choice in the settings menu. Change-Id: Id55da9fd4262bbfc6a5abf863799c747b0d75b24
This commit is contained in:
committed by
Johan Redestig
parent
3514cdc3b0
commit
b2dd90383b
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user