From a7a93784d1f9798d37cb618def1a558f8d626f0f Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 25 Apr 2013 21:35:54 -0700 Subject: [PATCH] Always include default system IMEs for restricted profiles Add default IMEs to an exclusion set so that we don't include them in the list of toggleable system apps that we show the user. Bug: 8724246 Unrevert the change to include disabled apps, as the above change fixes the reason for the revert. Bug: 8713202 Change-Id: Ifced841ad3bfbde33d2403356216dd1749b7fa9a --- .../users/AppRestrictionsFragment.java | 75 +++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java index 9f64b71d9ae..4237f22aa6a 100644 --- a/src/com/android/settings/users/AppRestrictionsFragment.java +++ b/src/com/android/settings/users/AppRestrictionsFragment.java @@ -34,6 +34,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; +import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -63,6 +64,9 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; +import android.view.inputmethod.InputMethod; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; @@ -102,6 +106,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen private static final int DIALOG_ID_EDIT_USER_INFO = 1; + private PackageManager mPackageManager; private UserManager mUserManager; private UserHandle mUser; @@ -262,6 +267,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen } mNewUser = args.getBoolean(EXTRA_NEW_USER, false); } + mPackageManager = getActivity().getPackageManager(); mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); addPreferencesFromResource(R.xml.app_restrictions); mAppList = getPreferenceScreen(); @@ -347,22 +353,74 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen } } - private void addSystemApps(List visibleApps, Intent intent) { + private boolean isSystemPackage(String packageName) { + try { + final PackageInfo pi = mPackageManager.getPackageInfo(packageName, 0); + if (pi.applicationInfo == null) return false; + final int flags = pi.applicationInfo.flags; + if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0 + || (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { + return true; + } + } catch (NameNotFoundException nnfe) { + // Missing package? + } + return false; + } + + /** + * Find all pre-installed input methods that are marked as default + * and add them to an exclusion list so that they aren't + * presented to the user for toggling. + * Don't add non-default ones, as they may include other stuff that we + * don't need to auto-include. + * @param excludePackages the set of package names to append to + */ + private void addSystemImes(Set excludePackages) { + final Context context = getActivity(); + if (context == null) return; + InputMethodManager imm = (InputMethodManager) + context.getSystemService(Context.INPUT_METHOD_SERVICE); + List imis = imm.getInputMethodList(); + for (InputMethodInfo imi : imis) { + try { + if (imi.isDefault(context) && isSystemPackage(imi.getPackageName())) { + excludePackages.add(imi.getPackageName()); + } + } catch (Resources.NotFoundException rnfe) { + // Not default + } + } + } + + /** + * Add system apps that match an intent to the list, excluding any packages in the exclude list. + * @param visibleApps list of apps to append the new list to + * @param intent the intent to match + * @param excludePackages the set of package names to be excluded, since they're required + */ + private void addSystemApps(List visibleApps, Intent intent, + Set excludePackages) { if (getActivity() == null) return; - final PackageManager pm = getActivity().getPackageManager(); - List launchableApps = pm.queryIntentActivities(intent, 0); + final PackageManager pm = mPackageManager; + List launchableApps = pm.queryIntentActivities(intent, + PackageManager.GET_DISABLED_COMPONENTS); for (ResolveInfo app : launchableApps) { if (app.activityInfo != null && app.activityInfo.applicationInfo != null) { int flags = app.activityInfo.applicationInfo.flags; if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0 || (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { // System app + // Skip excluded packages + if (excludePackages.contains(app.activityInfo.packageName)) continue; + SelectableAppInfo info = new SelectableAppInfo(); info.packageName = app.activityInfo.packageName; info.appName = app.activityInfo.applicationInfo.loadLabel(pm); info.icon = app.activityInfo.loadIcon(pm); info.activityName = app.activityInfo.loadLabel(pm); if (info.activityName == null) info.activityName = info.appName; + visibleApps.add(info); } } @@ -392,17 +450,20 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen mVisibleApps = new ArrayList(); final Context context = getActivity(); if (context == null) return; - PackageManager pm = context.getPackageManager(); + final PackageManager pm = mPackageManager; IPackageManager ipm = AppGlobals.getPackageManager(); + final HashSet excludePackages = new HashSet(); + addSystemImes(excludePackages); + // Add launchers Intent launcherIntent = new Intent(Intent.ACTION_MAIN); launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); - addSystemApps(mVisibleApps, launcherIntent); + addSystemApps(mVisibleApps, launcherIntent, excludePackages); // Add widgets Intent widgetIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - addSystemApps(mVisibleApps, widgetIntent); + addSystemApps(mVisibleApps, widgetIntent, excludePackages); List installedApps = pm.getInstalledApplications(0); for (ApplicationInfo app : installedApps) { @@ -470,7 +531,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen private void populateApps() { final Context context = getActivity(); if (context == null) return; - PackageManager pm = context.getPackageManager(); + final PackageManager pm = mPackageManager; IPackageManager ipm = AppGlobals.getPackageManager(); mAppList.removeAll(); Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);