diff options
author | Jason Monk <jmonk@google.com> | 2015-04-13 20:58:05 -0400 |
---|---|---|
committer | Jason Monk <jmonk@google.com> | 2015-04-14 10:24:46 -0400 |
commit | 73a2496d316cb9a8dc0020c245bc61f766b7f7c2 (patch) | |
tree | 3cd53006c87becb5c9a3aec6da4a5c6d63672658 | |
parent | 6ef272300416b89c1ab4710614eea3d80d8d0f33 (diff) | |
download | packages_apps_Settings-73a2496d316cb9a8dc0020c245bc61f766b7f7c2.zip packages_apps_Settings-73a2496d316cb9a8dc0020c245bc61f766b7f7c2.tar.gz packages_apps_Settings-73a2496d316cb9a8dc0020c245bc61f766b7f7c2.tar.bz2 |
Move default app preferences to one screen
- Move emergency and SMS app preferences to default apps
- Fix search on default apps
- Make all default app prefs use AppListPreference
- Some approximate UI work on AppListPreference
Bug: 20210110
Change-Id: Id04086163c7e87c92a03af421a27018fb380b45d
-rwxr-xr-x | res/layout/app_preference_item.xml | 19 | ||||
-rw-r--r-- | res/values/strings.xml | 9 | ||||
-rw-r--r-- | res/xml/advanced_apps.xml | 5 | ||||
-rw-r--r-- | res/xml/default_apps.xml | 12 | ||||
-rw-r--r-- | res/xml/wireless_settings.xml | 7 | ||||
-rw-r--r-- | src/com/android/settings/AppListPreference.java | 71 | ||||
-rw-r--r-- | src/com/android/settings/WirelessSettings.java | 76 | ||||
-rw-r--r-- | src/com/android/settings/applications/AdvancedAppSettings.java | 38 | ||||
-rw-r--r-- | src/com/android/settings/applications/DefaultBrowserPreference.java | 27 | ||||
-rw-r--r-- | src/com/android/settings/applications/DefaultEmergencyPreference.java | 100 | ||||
-rw-r--r-- | src/com/android/settings/applications/DefaultSmsPreference.java | 75 | ||||
-rw-r--r-- | src/com/android/settings/applications/ManageDefaultApps.java | 56 | ||||
-rw-r--r-- | src/com/android/settings/search/Ranking.java | 2 | ||||
-rw-r--r-- | src/com/android/settings/search/SearchIndexableResources.java | 10 |
14 files changed, 268 insertions, 239 deletions
diff --git a/res/layout/app_preference_item.xml b/res/layout/app_preference_item.xml index 22ee37e..b02f835 100755 --- a/res/layout/app_preference_item.xml +++ b/res/layout/app_preference_item.xml @@ -24,18 +24,29 @@ android:id="@+id/app_image" android:layout_width="wrap_content" android:layout_height="match_parent" + android:adjustViewBounds="true" android:padding="6dip" /> - <CheckedTextView + <TextView android:id="@+id/app_label" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" - android:textAppearance="?android:attr/textAppearanceLarge" + android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?android:attr/textColorAlertDialogListItem" android:gravity="center_vertical" android:paddingEnd="7dip" - android:checkMark="?android:attr/listChoiceIndicatorSingle" android:ellipsize="marquee" /> + <TextView + android:id="@+id/default_label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeight" + android:textAppearance="?android:attr/textAppearanceSmall" + android:gravity="center_vertical" + android:text="@string/default_app" + android:visibility="gone" + android:paddingEnd="7dip" + /> </LinearLayout> diff --git a/res/values/strings.xml b/res/values/strings.xml index f416d89..9eef457 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2658,7 +2658,7 @@ <string name="manage_mobile_plan_title" translatable="true">Mobile plan</string> <!-- SMS Application [CHAR LIMIT=35]--> - <string name="sms_application_title" translatable="true">Default SMS app</string> + <string name="sms_application_title" translatable="true">SMS app</string> <string name="sms_change_default_dialog_title" translatable="true">Change SMS app?</string> <string name="sms_change_default_dialog_text" translatable="true">Use <xliff:g id="new_app">%1$s</xliff:g> instead of <xliff:g id="current_app">%2$s</xliff:g> as your SMS app?</string> <string name="sms_change_default_no_previous_dialog_text" translatable="true">Use <xliff:g id="new_app">%s</xliff:g> as your SMS app?</string> @@ -3019,7 +3019,7 @@ <!-- [CHAR LIMIT=25] Manage applications screen, menu item. Show background cached processes. --> <string name="show_background_processes">Show cached processes</string> <!-- [CHAR LIMIT=NONE] Advanced applications screen, preference title. Choose the emergency application. --> - <string name="default_emergency_app">Default emergency app</string> + <string name="default_emergency_app">Emergency app</string> <!-- [CHAR LIMIT=NONE] Manage applications screen, menu item. Reset all of user's app preferences. --> <string name="reset_app_preferences">Reset app preferences</string> <!-- [CHAR LIMIT=NONE] Manage applications screen, menu item. Title of dialog to confirm resetting user's app preferences. --> @@ -6407,9 +6407,12 @@ <string name="default_apps_title">Default Apps</string> <!-- Title for Default Browser settings [CHAR LIMIT=30] --> - <string name="default_browser_title">Default Browser</string> + <string name="default_browser_title">Browser app</string> <!-- Summary for No Default Browser settings [CHAR LIMIT=45] --> <string name="default_browser_title_none">No default Browser</string> + <!-- Label of default app for current setting [CHAR LIMIT=40] --> + <string name="default_app">(Default)</string> + </resources> diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml index 28324ca..e808210 100644 --- a/res/xml/advanced_apps.xml +++ b/res/xml/advanced_apps.xml @@ -40,9 +40,4 @@ android:value="com.android.settings.Settings$DomainsURLsAppListActivity" /> </PreferenceScreen> - <com.android.settings.applications.DefaultEmergencyPreference - android:key="default_emergency_app" - android:title="@string/default_emergency_app" - settings:keywords="@string/keywords_emergency_app" /> - </PreferenceScreen> diff --git a/res/xml/default_apps.xml b/res/xml/default_apps.xml index 00c2fc0..392dd85 100644 --- a/res/xml/default_apps.xml +++ b/res/xml/default_apps.xml @@ -25,4 +25,16 @@ android:summary="@string/default_browser_title_none" /> + <com.android.settings.applications.DefaultEmergencyPreference + android:key="default_emergency_app" + android:title="@string/default_emergency_app" + settings:keywords="@string/keywords_emergency_app" + /> + + <com.android.settings.applications.DefaultSmsPreference + android:key="default_sms_app" + android:title="@string/sms_application_title" + settings:keywords="@string/keywords_more_default_sms_app" + /> + </PreferenceScreen> diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml index b615c9e..f08de5e 100644 --- a/res/xml/wireless_settings.xml +++ b/res/xml/wireless_settings.xml @@ -24,13 +24,6 @@ android:persistent="false" android:disableDependentsState="true" /> - <com.android.settings.AppListPreference - android:key="sms_application" - android:title="@string/sms_application_title" - settings:keywords="@string/keywords_more_default_sms_app" - android:summary="%s" - android:persistent="false" /> - <SwitchPreference android:key="toggle_nfc" android:title="@string/nfc_quick_toggle_title" diff --git a/src/com/android/settings/AppListPreference.java b/src/com/android/settings/AppListPreference.java index 96897ae..3cc91cd 100644 --- a/src/com/android/settings/AppListPreference.java +++ b/src/com/android/settings/AppListPreference.java @@ -23,15 +23,17 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; import android.preference.ListPreference; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.CheckedTextView; import android.widget.ImageView; import android.widget.ListAdapter; +import android.widget.TextView; /** * Extends ListPreference to allow us to show the icons for a given list of applications. We do this @@ -56,10 +58,10 @@ public class AppListPreference extends ListPreference { public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = ((Activity)getContext()).getLayoutInflater(); View view = inflater.inflate(R.layout.app_preference_item, parent, false); - CheckedTextView checkedTextView = (CheckedTextView)view.findViewById(R.id.app_label); - checkedTextView.setText(getItem(position)); + TextView textView = (TextView) view.findViewById(R.id.app_label); + textView.setText(getItem(position)); if (position == mSelectedIndex) { - checkedTextView.setChecked(true); + view.findViewById(R.id.default_label).setVisibility(View.VISIBLE); } ImageView imageView = (ImageView)view.findViewById(R.id.app_image); imageView.setImageDrawable(mImageDrawables[position]); @@ -76,14 +78,14 @@ public class AppListPreference extends ListPreference { super(context, attrs); } - public void setPackageNames(String[] packageNames, String defaultPackageName) { + public void setPackageNames(CharSequence[] packageNames, CharSequence defaultPackageName) { // Look up all package names in PackageManager. Skip ones we can't find. int foundPackages = 0; PackageManager pm = getContext().getPackageManager(); ApplicationInfo[] appInfos = new ApplicationInfo[packageNames.length]; for (int i = 0; i < packageNames.length; i++) { try { - appInfos[i] = pm.getApplicationInfo(packageNames[i], 0); + appInfos[i] = pm.getApplicationInfo(packageNames[i].toString(), 0); foundPackages++; } catch (NameNotFoundException e) { // Leave appInfos[i] uninitialized; it will be skipped in the list. @@ -123,4 +125,61 @@ public class AppListPreference extends ListPreference { builder.setAdapter(adapter, this); super.onPrepareDialogBuilder(builder); } + + @Override + protected Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + return new SavedState(getEntryValues(), getValue(), superState); + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (state instanceof SavedState) { + SavedState savedState = (SavedState) state; + setPackageNames(savedState.entryValues, savedState.value); + super.onRestoreInstanceState(savedState.superState); + } else { + super.onRestoreInstanceState(state); + } + } + + private static class SavedState implements Parcelable { + + public final CharSequence[] entryValues; + public final CharSequence value; + public final Parcelable superState; + + public SavedState(CharSequence[] entryValues, CharSequence value, Parcelable superState) { + this.entryValues = entryValues; + this.value = value; + this.superState = superState; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeCharSequenceArray(entryValues); + dest.writeCharSequence(value); + dest.writeParcelable(superState, flags); + } + + public static Creator<SavedState> CREATOR = new Creator<SavedState>() { + @Override + public SavedState createFromParcel(Parcel source) { + CharSequence[] entryValues = source.readCharSequenceArray(); + CharSequence value = source.readCharSequence(); + Parcelable superState = source.readParcelable(getClass().getClassLoader()); + return new SavedState(entryValues, value, superState); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } } diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java index 000aa30..e8c3e15 100644 --- a/src/com/android/settings/WirelessSettings.java +++ b/src/com/android/settings/WirelessSettings.java @@ -22,7 +22,6 @@ import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.ActivityNotFoundException; -import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -38,7 +37,6 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceScreen; import android.preference.SwitchPreference; import android.provider.SearchIndexableResource; @@ -49,20 +47,17 @@ import android.util.Log; import com.android.ims.ImsManager; import com.android.internal.logging.MetricsLogger; -import com.android.internal.telephony.SmsApplication; -import com.android.internal.telephony.SmsApplication.SmsApplicationData; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyProperties; import com.android.settings.nfc.NfcEnabler; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; + import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; -public class WirelessSettings extends SettingsPreferenceFragment - implements OnPreferenceChangeListener, Indexable { +public class WirelessSettings extends SettingsPreferenceFragment implements Indexable { private static final String TAG = "WirelessSettings"; private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane"; @@ -74,7 +69,6 @@ public class WirelessSettings extends SettingsPreferenceFragment private static final String KEY_PROXY_SETTINGS = "proxy_settings"; private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings"; private static final String KEY_MANAGE_MOBILE_PLAN = "manage_mobile_plan"; - private static final String KEY_SMS_APPLICATION = "sms_application"; private static final String KEY_TOGGLE_NSD = "toggle_nsd"; //network service discovery private static final String KEY_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings"; private static final String KEY_WFC_SETTINGS = "wifi_calling_settings"; @@ -96,7 +90,6 @@ public class WirelessSettings extends SettingsPreferenceFragment private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1; private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage"; - private AppListPreference mSmsApplicationPreference; private PreferenceScreen mButtonWfc; /** @@ -187,27 +180,6 @@ public class WirelessSettings extends SettingsPreferenceFragment } } - private void initSmsApplicationSetting() { - log("initSmsApplicationSetting:"); - Collection<SmsApplicationData> smsApplications = - SmsApplication.getApplicationCollection(getActivity()); - - // If the list is empty the dialog will be empty, but we will not crash. - int count = smsApplications.size(); - String[] packageNames = new String[count]; - int i = 0; - for (SmsApplicationData smsApplicationData : smsApplications) { - packageNames[i] = smsApplicationData.mPackageName; - i++; - } - String defaultPackageName = null; - ComponentName appName = SmsApplication.getDefaultSmsApplication(getActivity(), true); - if (appName != null) { - defaultPackageName = appName.getPackageName(); - } - mSmsApplicationPreference.setPackageNames(packageNames, defaultPackageName); - } - @Override public Dialog onCreateDialog(int dialogId) { log("onCreateDialog: dialogId=" + dialogId); @@ -233,11 +205,6 @@ public class WirelessSettings extends SettingsPreferenceFragment Log.d(TAG, s); } - private boolean isSmsSupported() { - // Some tablet has sim card but could not do telephony operations. Skip those. - return mTm.isSmsCapable(); - } - @Override protected int getMetricsCategory() { return MetricsLogger.WIRELESS; @@ -260,7 +227,6 @@ public class WirelessSettings extends SettingsPreferenceFragment final int myUserId = UserHandle.myUserId(); final boolean isSecondaryUser = myUserId != UserHandle.USER_OWNER; - final boolean isRestrictedUser = mUm.getUserInfo(myUserId).isRestricted(); final Activity activity = getActivity(); mAirplaneModePreference = (SwitchPreference) findPreference(KEY_TOGGLE_AIRPLANE); @@ -271,15 +237,6 @@ public class WirelessSettings extends SettingsPreferenceFragment mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference); mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam); - mSmsApplicationPreference = (AppListPreference) findPreference(KEY_SMS_APPLICATION); - // Restricted users cannot currently read/write SMS. - if (isRestrictedUser) { - removePreference(KEY_SMS_APPLICATION); - } else { - mSmsApplicationPreference.setOnPreferenceChangeListener(this); - initSmsApplicationSetting(); - } - if (ImsManager.isWfcEnabledByPlatform(activity)) { mButtonWfc = (PreferenceScreen) findPreference(KEY_WFC_SETTINGS); } else { @@ -355,11 +312,6 @@ public class WirelessSettings extends SettingsPreferenceFragment } } - // Remove SMS Application if the device does not support SMS - if (!isSmsSupported()) { - removePreference(KEY_SMS_APPLICATION); - } - // Remove Airplane Mode settings if it's a stationary device such as a TV. if (mPm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)) { removePreference(KEY_TOGGLE_AIRPLANE); @@ -410,13 +362,6 @@ public class WirelessSettings extends SettingsPreferenceFragment } @Override - public void onStart() { - super.onStart(); - - initSmsApplicationSetting(); - } - - @Override public void onResume() { super.onResume(); @@ -473,15 +418,6 @@ public class WirelessSettings extends SettingsPreferenceFragment return R.string.help_url_more_networks; } - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (preference == mSmsApplicationPreference && newValue != null) { - SmsApplication.setDefaultApplication(newValue.toString(), getActivity()); - return true; - } - return false; - } - /** * For Search. */ @@ -504,7 +440,6 @@ public class WirelessSettings extends SettingsPreferenceFragment final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); final int myUserId = UserHandle.myUserId(); final boolean isSecondaryUser = myUserId != UserHandle.USER_OWNER; - final boolean isRestrictedUser = um.getUserInfo(myUserId).isRestricted(); final boolean isWimaxEnabled = !isSecondaryUser && context.getResources().getBoolean( com.android.internal.R.bool.config_wimaxEnabled); @@ -542,13 +477,6 @@ public class WirelessSettings extends SettingsPreferenceFragment result.add(KEY_MANAGE_MOBILE_PLAN); } - // Remove SMS Application if the device does not support SMS - TelephonyManager tm = - (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - if (!tm.isSmsCapable() || isRestrictedUser) { - result.add(KEY_SMS_APPLICATION); - } - final PackageManager pm = context.getPackageManager(); // Remove Airplane Mode settings if it's a stationary device such as a TV. diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java index ee47c68..8c5e65f 100644 --- a/src/com/android/settings/applications/AdvancedAppSettings.java +++ b/src/com/android/settings/applications/AdvancedAppSettings.java @@ -16,35 +16,27 @@ package com.android.settings.applications; import android.app.Activity; -import android.content.Context; import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.preference.Preference; -import android.provider.SearchIndexableResource; import android.util.Log; import com.android.internal.logging.MetricsLogger; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.applications.ApplicationsState.AppEntry; -import com.android.settings.applications.ApplicationsState.Callbacks; import com.android.settings.applications.ApplicationsState.Session; -import com.android.settings.applications.PermissionsInfo.Callback; -import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.search.Indexable; import java.util.ArrayList; -import java.util.List; -public class AdvancedAppSettings extends SettingsPreferenceFragment implements Callbacks, Callback, - Indexable { +public class AdvancedAppSettings extends SettingsPreferenceFragment implements + ApplicationsState.Callbacks, PermissionsInfo.Callback { static final String TAG = "AdvancedAppSettings"; static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final String KEY_APP_PERM = "manage_perms"; private static final String KEY_APP_DOMAIN_URLS = "domain_urls"; - private static final String KEY_DEFAULT_EMERGENCY_APP = "default_emergency_app"; private ApplicationsState mApplicationsState; private Session mSession; @@ -63,10 +55,6 @@ public class AdvancedAppSettings extends SettingsPreferenceFragment implements C mAppPermsPreference = findPreference(KEY_APP_PERM); mAppDomainURLsPreference = findPreference(KEY_APP_DOMAIN_URLS); updateUI(); - - if (!DefaultEmergencyPreference.isAvailable(getActivity())) { - removePreference(KEY_DEFAULT_EMERGENCY_APP); - } } private void updateUI() { @@ -142,26 +130,4 @@ public class AdvancedAppSettings extends SettingsPreferenceFragment implements C mPermissionsInfo.getRuntimePermAppsGrantedCount(), mPermissionsInfo.getRuntimePermAppsCount())); } - - public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider() { - @Override - public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, - boolean enabled) { - ArrayList<SearchIndexableResource> result = new ArrayList<>(1); - SearchIndexableResource sir = new SearchIndexableResource(context); - sir.xmlResId = R.xml.advanced_apps; - result.add(sir); - return result; - } - - @Override - public List<String> getNonIndexableKeys(Context context) { - ArrayList<String> result = new ArrayList<>(1); - if (!DefaultEmergencyPreference.isAvailable(context)) { - result.add(KEY_DEFAULT_EMERGENCY_APP); - } - return result; - } - }; } diff --git a/src/com/android/settings/applications/DefaultBrowserPreference.java b/src/com/android/settings/applications/DefaultBrowserPreference.java index b9ea9c0..da7f112 100644 --- a/src/com/android/settings/applications/DefaultBrowserPreference.java +++ b/src/com/android/settings/applications/DefaultBrowserPreference.java @@ -22,15 +22,14 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.UserHandle; -import android.preference.ListPreference; -import android.util.ArrayMap; import android.util.AttributeSet; -import com.android.settings.R; +import com.android.settings.AppListPreference; +import java.util.ArrayList; import java.util.List; -public class DefaultBrowserPreference extends ListPreference { +public class DefaultBrowserPreference extends AppListPreference { final private PackageManager mPm; @@ -42,14 +41,13 @@ public class DefaultBrowserPreference extends ListPreference { } private void loadBrowserApps() { - ArrayMap<String, CharSequence> browsers = resolveBrowserApps(); + List<String> browsers = resolveBrowserApps(); - setEntries(browsers.values().toArray(new CharSequence[browsers.size()])); - setEntryValues(browsers.keySet().toArray(new String[browsers.size()])); + setPackageNames(browsers.toArray(new String[browsers.size()]), null); } - private ArrayMap<String, CharSequence> resolveBrowserApps() { - ArrayMap<String, CharSequence> result = new ArrayMap<>(); + private List<String> resolveBrowserApps() { + List<String> result = new ArrayList<>(); // Create an Intent that will match ALL Browser Apps Intent intent = new Intent(); @@ -58,22 +56,17 @@ public class DefaultBrowserPreference extends ListPreference { intent.setData(Uri.parse("http:")); // Resolve that intent and check that the handleAllWebDataURI boolean is set - PackageManager packageManager = getContext().getPackageManager(); - List<ResolveInfo> list = packageManager.queryIntentActivitiesAsUser(intent, 0, - UserHandle.myUserId()); + List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(intent, 0, UserHandle.myUserId()); final int count = list.size(); for (int i=0; i<count; i++) { ResolveInfo info = list.get(i); - if (info.activityInfo == null || result.containsKey(info.activityInfo.packageName) + if (info.activityInfo == null || result.contains(info.activityInfo.packageName) || !info.handleAllWebDataURI) { continue; } - String packageName = info.activityInfo.packageName; - CharSequence label = info.activityInfo.applicationInfo.loadLabel(packageManager); - - result.put(packageName, label); + result.add(info.activityInfo.packageName); } return result; diff --git a/src/com/android/settings/applications/DefaultEmergencyPreference.java b/src/com/android/settings/applications/DefaultEmergencyPreference.java index 97418fc..3fc702b 100644 --- a/src/com/android/settings/applications/DefaultEmergencyPreference.java +++ b/src/com/android/settings/applications/DefaultEmergencyPreference.java @@ -24,22 +24,22 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.AsyncTask; -import android.os.Parcel; -import android.os.Parcelable; -import android.preference.ListPreference; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; -import android.util.ArrayMap; +import android.util.ArraySet; import android.util.AttributeSet; +import com.android.settings.AppListPreference; + import java.util.List; import java.util.Objects; +import java.util.Set; /** * A preference for choosing the default emergency app */ -public class DefaultEmergencyPreference extends ListPreference { +public class DefaultEmergencyPreference extends AppListPreference { private final ContentResolver mContentResolver; @@ -53,25 +53,6 @@ public class DefaultEmergencyPreference extends ListPreference { } @Override - protected Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - return new SavedState(getEntries(), getEntryValues(), getSummary(), superState); - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - if (state instanceof SavedState) { - SavedState savedState = (SavedState) state; - setEntries(savedState.entries); - setEntryValues(savedState.entryValues); - setSummary(savedState.summary); - super.onRestoreInstanceState(savedState.superState); - } else { - super.onRestoreInstanceState(state); - } - } - - @Override protected boolean persistString(String value) { String previousValue = Settings.Secure.getString(mContentResolver, Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION); @@ -86,25 +67,23 @@ public class DefaultEmergencyPreference extends ListPreference { } private void load() { - new AsyncTask<Void, Void, ArrayMap<String, CharSequence>>() { + new AsyncTask<Void, Void, Set<String>>() { @Override - protected ArrayMap<String, CharSequence> doInBackground(Void[] params) { + protected Set<String> doInBackground(Void[] params) { return resolveAssistPackageAndQueryApps(); } @Override - protected void onPostExecute(ArrayMap<String, CharSequence> entries) { - setEntries(entries.values().toArray(new CharSequence[entries.size()])); - setEntryValues(entries.keySet().toArray(new String[entries.size()])); - - setValue(Settings.Secure.getString(mContentResolver, - Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION)); + protected void onPostExecute(Set<String> entries) { + String currentPkg = Settings.Secure.getString(mContentResolver, + Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION); + setPackageNames(entries.toArray(new String[entries.size()]), currentPkg); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - private ArrayMap<String, CharSequence> resolveAssistPackageAndQueryApps() { - ArrayMap<String, CharSequence> packages = new ArrayMap<>(); + private Set<String> resolveAssistPackageAndQueryApps() { + Set<String> packages = new ArraySet<>(); Intent queryIntent = new Intent(TelephonyManager.ACTION_EMERGENCY_ASSISTANCE); PackageManager packageManager = getContext().getPackageManager(); @@ -113,15 +92,13 @@ public class DefaultEmergencyPreference extends ListPreference { PackageInfo bestMatch = null; for (int i = 0; i < infos.size(); i++) { if (infos.get(i) == null || infos.get(i).activityInfo == null - || packages.containsKey(infos.get(i).activityInfo.packageName)) { + || packages.contains(infos.get(i).activityInfo.packageName)) { continue; } String packageName = infos.get(i).activityInfo.packageName; - CharSequence label = infos.get(i).activityInfo.applicationInfo - .loadLabel(packageManager); - packages.put(packageName, label); + packages.add(packageName); PackageInfo packageInfo; try { @@ -142,7 +119,7 @@ public class DefaultEmergencyPreference extends ListPreference { String defaultPackage = Settings.Secure.getString(mContentResolver, Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION); boolean defaultMissing = TextUtils.isEmpty(defaultPackage) - || !packages.containsKey(defaultPackage); + || !packages.contains(defaultPackage); if (bestMatch != null && defaultMissing) { Settings.Secure.putString(mContentResolver, Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION, @@ -161,49 +138,4 @@ public class DefaultEmergencyPreference extends ListPreference { return info.applicationInfo != null && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; } - - private static class SavedState implements Parcelable { - - public final CharSequence[] entries; - public final CharSequence[] entryValues; - public final CharSequence summary; - public final Parcelable superState; - - public SavedState(CharSequence[] entries, CharSequence[] entryValues, - CharSequence summary, Parcelable superState) { - this.entries = entries; - this.entryValues = entryValues; - this.summary = summary; - this.superState = superState; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeCharSequenceArray(entries); - dest.writeCharSequenceArray(entryValues); - dest.writeCharSequence(summary); - dest.writeParcelable(superState, flags); - } - - public Creator<SavedState> CREATOR = new Creator<SavedState>() { - @Override - public SavedState createFromParcel(Parcel source) { - CharSequence[] entries = source.readCharSequenceArray(); - CharSequence[] entryValues = source.readCharSequenceArray(); - CharSequence summary = source.readCharSequence(); - Parcelable superState = source.readParcelable(getClass().getClassLoader()); - return new SavedState(entries, entryValues, summary, superState); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } } diff --git a/src/com/android/settings/applications/DefaultSmsPreference.java b/src/com/android/settings/applications/DefaultSmsPreference.java new file mode 100644 index 0000000..bf616c3 --- /dev/null +++ b/src/com/android/settings/applications/DefaultSmsPreference.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * 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.applications; + +import android.content.ComponentName; +import android.content.Context; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.AttributeSet; + +import com.android.internal.telephony.SmsApplication; +import com.android.internal.telephony.SmsApplication.SmsApplicationData; +import com.android.settings.AppListPreference; + +import java.util.Collection; +import java.util.Objects; + +public class DefaultSmsPreference extends AppListPreference { + + public DefaultSmsPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + loadSmsApps(); + } + + private void loadSmsApps() { + Collection<SmsApplicationData> smsApplications = + SmsApplication.getApplicationCollection(getContext()); + + int count = smsApplications.size(); + String[] packageNames = new String[count]; + int i = 0; + for (SmsApplicationData smsApplicationData : smsApplications) { + packageNames[i++] = smsApplicationData.mPackageName; + } + setPackageNames(packageNames, getDefaultPackage()); + } + + private String getDefaultPackage() { + ComponentName appName = SmsApplication.getDefaultSmsApplication(getContext(), true); + if (appName != null) { + return appName.getPackageName(); + } + return null; + } + + @Override + protected boolean persistString(String value) { + if (!TextUtils.isEmpty(value) && !Objects.equals(value, getDefaultPackage())) { + SmsApplication.setDefaultApplication(value, getContext()); + } + setSummary(getEntry()); + return true; + } + + public static boolean isAvailable(Context context) { + TelephonyManager tm = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + return tm.isSmsCapable(); + } + +} diff --git a/src/com/android/settings/applications/ManageDefaultApps.java b/src/com/android/settings/applications/ManageDefaultApps.java index 87fc78e..e2f8c6b 100644 --- a/src/com/android/settings/applications/ManageDefaultApps.java +++ b/src/com/android/settings/applications/ManageDefaultApps.java @@ -17,26 +17,37 @@ package com.android.settings.applications; import android.annotation.Nullable; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.UserHandle; +import android.os.UserManager; import android.preference.Preference; +import android.provider.SearchIndexableResource; import android.text.TextUtils; import android.util.Log; import android.view.View; + import com.android.settings.InstrumentedFragment; +import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; -import com.android.settings.R; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class ManageDefaultApps extends SettingsPreferenceFragment - implements Preference.OnPreferenceClickListener { + implements Preference.OnPreferenceClickListener, Indexable { private static final String TAG = ManageDefaultApps.class.getSimpleName(); private static final String KEY_DEFAULT_BROWSER = "default_browser"; + private static final String KEY_SMS_APPLICATION = "default_sms_app"; + private static final String KEY_DEFAULT_EMERGENCY_APP = "default_emergency_app"; private DefaultBrowserPreference mDefaultBrowserPreference; private PackageManager mPm; @@ -63,6 +74,18 @@ public class ManageDefaultApps extends SettingsPreferenceFragment return mPm.setDefaultBrowserPackageName(packageName.toString(), myUserId); } }); + final boolean isRestrictedUser = UserManager.get(getActivity()) + .getUserInfo(myUserId).isRestricted(); + + // Restricted users cannot currently read/write SMS. + // Remove SMS Application if the device does not support SMS + if (isRestrictedUser || !DefaultSmsPreference.isAvailable(getActivity())) { + removePreference(KEY_SMS_APPLICATION); + } + + if (!DefaultEmergencyPreference.isAvailable(getActivity())) { + removePreference(KEY_DEFAULT_EMERGENCY_APP); + } } @Override @@ -96,4 +119,33 @@ public class ManageDefaultApps extends SettingsPreferenceFragment public boolean onPreferenceClick(Preference preference) { return false; } + + public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List<SearchIndexableResource> getXmlResourcesToIndex( + Context context, boolean enabled) { + SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.default_apps; + return Arrays.asList(sir); + } + + @Override + public List<String> getNonIndexableKeys(Context context) { + final ArrayList<String> result = new ArrayList<String>(); + + // Remove SMS Application if the device does not support SMS + final boolean isRestrictedUser = UserManager.get(context) + .getUserInfo(UserHandle.myUserId()).isRestricted(); + if (!DefaultSmsPreference.isAvailable(context) || isRestrictedUser) { + result.add(KEY_SMS_APPLICATION); + } + + if (!DefaultEmergencyPreference.isAvailable(context)) { + result.add(KEY_DEFAULT_EMERGENCY_APP); + } + + return result; + } + }; } diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java index 2143d0d..e1eec5f 100644 --- a/src/com/android/settings/search/Ranking.java +++ b/src/com/android/settings/search/Ranking.java @@ -31,6 +31,7 @@ import com.android.settings.WifiCallingSettings; import com.android.settings.WirelessSettings; import com.android.settings.accessibility.AccessibilitySettings; import com.android.settings.applications.AdvancedAppSettings; +import com.android.settings.applications.ManageDefaultApps; import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.deviceinfo.StorageSettings; import com.android.settings.deviceinfo.UsbSettings; @@ -138,6 +139,7 @@ public final class Ranking { // Advanced app settings sRankMap.put(AdvancedAppSettings.class.getName(), RANK_APPS); + sRankMap.put(ManageDefaultApps.class.getName(), RANK_APPS); // Users sRankMap.put(UserSettings.class.getName(), RANK_USERS); diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index b7bb062..a3d2ddc 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -33,6 +33,7 @@ import com.android.settings.WifiCallingSettings; import com.android.settings.WirelessSettings; import com.android.settings.accessibility.AccessibilitySettings; import com.android.settings.applications.AdvancedAppSettings; +import com.android.settings.applications.ManageDefaultApps; import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.deviceinfo.StorageSettings; import com.android.settings.deviceinfo.UsbSettings; @@ -201,10 +202,17 @@ public final class SearchIndexableResources { sResMap.put(AdvancedAppSettings.class.getName(), new SearchIndexableResource( Ranking.getRankForClassName(AdvancedAppSettings.class.getName()), - NO_DATA_RES_ID, + R.xml.advanced_apps, AdvancedAppSettings.class.getName(), R.drawable.ic_settings_applications)); + sResMap.put(ManageDefaultApps.class.getName(), + new SearchIndexableResource( + Ranking.getRankForClassName(ManageDefaultApps.class.getName()), + NO_DATA_RES_ID, + ManageDefaultApps.class.getName(), + R.drawable.ic_settings_applications)); + sResMap.put(UserSettings.class.getName(), new SearchIndexableResource( Ranking.getRankForClassName(UserSettings.class.getName()), |