Also fix: 2997438 and a similar bug in Tether Settings Show + menu item for User Dictionary
282 lines
12 KiB
Java
282 lines
12 KiB
Java
/**
|
|
* 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.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.os.SystemProperties;
|
|
import android.preference.Preference;
|
|
import android.preference.PreferenceGroup;
|
|
import android.preference.PreferenceActivity.Header;
|
|
import android.telephony.TelephonyManager;
|
|
import android.text.TextUtils;
|
|
|
|
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;
|
|
|
|
/**
|
|
* 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.
|
|
*
|
|
* @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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
public static boolean updateHeaderToSpecificActivityFromMetaDataOrRemove(Context context,
|
|
List<Header> target, Header header) {
|
|
|
|
Intent intent = header.intent;
|
|
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
|
|
// TODO:
|
|
//header.icon = icon;
|
|
header.title = title;
|
|
header.summary = summary;
|
|
// Replace the intent with this specific activity
|
|
header.intent = new Intent().setClassName(resolveInfo.activityInfo.packageName,
|
|
resolveInfo.activityInfo.name);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Did not find a matching activity, so remove the preference
|
|
if (target.remove(header)) System.err.println("Removed " + header.id);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns true if Monkey is running.
|
|
*/
|
|
public static boolean isMonkeyRunning() {
|
|
return SystemProperties.getBoolean("ro.monkey", false);
|
|
}
|
|
|
|
/**
|
|
* Returns whether the device is voice-capable (meaning, it is also a phone).
|
|
*/
|
|
public static boolean isVoiceCapable(Context context) {
|
|
TelephonyManager telephony =
|
|
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
|
|
return telephony != null && telephony.isVoiceCapable();
|
|
}
|
|
}
|