diff options
4 files changed, 179 insertions, 34 deletions
diff --git a/res/values-television/strings.xml b/res/values-television/strings.xml index 32517c67..f1d17469 100644 --- a/res/values-television/strings.xml +++ b/res/values-television/strings.xml @@ -25,4 +25,7 @@ <string name="current_permission_template"> <xliff:g id="current_permission_index" example="1">%1$s</xliff:g> / <xliff:g id="permission_count" example="2">%2$s</xliff:g></string> + + <!-- Preference row title for showing system apps. --> + <string name="preference_show_system_apps">Show system apps</string> </resources> diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java index 8c537155..844374a0 100644 --- a/src/com/android/packageinstaller/permission/model/PermissionApps.java +++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java @@ -55,6 +55,7 @@ public class PermissionApps { private ArrayMap<String, PermissionApp> mAppLookup; private boolean mSkipUi; + private boolean mRefreshing; public PermissionApps(Context context, String groupName, Callback callback) { this(context, groupName, callback, null); @@ -79,8 +80,11 @@ public class PermissionApps { } public void refresh(boolean getUiInfo) { - mSkipUi = !getUiInfo; - new PermissionAppsLoader().execute(); + if (!mRefreshing) { + mRefreshing = true; + mSkipUi = !getUiInfo; + new PermissionAppsLoader().execute(); + } } public int getGrantedCount(ArraySet<String> launcherPkgs) { @@ -368,6 +372,7 @@ public class PermissionApps { @Override protected void onPostExecute(List<PermissionApp> result) { + mRefreshing = false; createMap(result); if (mCallback != null) { mCallback.onPermissionsLoaded(PermissionApps.this); diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java index 934ed369..bf0ebf3a 100644 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java @@ -26,8 +26,12 @@ public final class ManagePermissionsActivity extends Activity { private static final String LOG_TAG = "ManagePermissionsActivity"; @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState != null) { + return; + } Fragment fragment; String action = getIntent().getAction(); diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java index 92c53fb6..2b014b23 100644 --- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java @@ -18,16 +18,19 @@ package com.android.packageinstaller.permission.ui; import android.annotation.Nullable; import android.app.ActionBar; import android.app.AlertDialog; +import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; +import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v14.preference.SwitchPreference; import android.support.v4.util.ArrayMap; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference.OnPreferenceChangeListener; +import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.PreferenceScreen; import android.util.ArraySet; import android.view.Menu; @@ -55,17 +58,23 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple private static final int MENU_SHOW_SYSTEM = Menu.FIRST; private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 1; + private static final String KEY_SHOW_SYSTEM_PREFS = "_showSystem"; public static PermissionAppsFragment newInstance(String permissionName) { - PermissionAppsFragment instance = new PermissionAppsFragment(); + return setPermissionName(new PermissionAppsFragment(), permissionName); + } + + private static <T extends Fragment> T setPermissionName(T fragment, String permissionName) { Bundle arguments = new Bundle(); arguments.putString(Intent.EXTRA_PERMISSION_NAME, permissionName); - instance.setArguments(arguments); - return instance; + fragment.setArguments(arguments); + return fragment; } private PermissionApps mPermissionApps; + private PreferenceScreen mExtraScreen; + private ArrayMap<String, AppPermissionGroup> mToggledGroups; private ArraySet<String> mLauncherPkgs; private boolean mHasConfirmedRevoke; @@ -74,6 +83,8 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple private MenuItem mShowSystemMenu; private MenuItem mHideSystemMenu; + private Callback mOnPermissionsLoadedListener; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -84,6 +95,10 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple ab.setDisplayHomeAsUpEnabled(true); } mLauncherPkgs = Utils.getLauncherPackages(getContext()); + + String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); + mPermissionApps = new PermissionApps(getActivity(), groupName, this); + mPermissionApps.refresh(true); } @Override @@ -132,20 +147,18 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - bindUi(); + bindUi(this, mPermissionApps); } - private void bindUi() { - String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); - mPermissionApps = new PermissionApps(getActivity(), groupName, this); - final Drawable icon = mPermissionApps.getIcon(); - final CharSequence label = mPermissionApps.getLabel(); - final ActionBar ab = getActivity().getActionBar(); + private static void bindUi(Fragment fragment, PermissionApps permissionApps) { + final Drawable icon = permissionApps.getIcon(); + final CharSequence label = permissionApps.getLabel(); + final ActionBar ab = fragment.getActivity().getActionBar(); if (ab != null) { - ab.setTitle(getString(R.string.permission_title, label)); + ab.setTitle(fragment.getString(R.string.permission_title, label)); } - final ViewGroup rootView = (ViewGroup) getView(); + final ViewGroup rootView = (ViewGroup) fragment.getView(); final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); if (iconView != null) { // Set the icon as the background instead of the image because ImageView @@ -162,6 +175,10 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple } } + private void setOnPermissionsLoadedListener(Callback callback) { + mOnPermissionsLoadedListener = callback; + } + @Override public void onPermissionsLoaded(PermissionApps permissionApps) { Context context = getPreferenceManager().getContext(); @@ -170,38 +187,121 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple return; } - PreferenceScreen preferences = getPreferenceScreen(); - preferences.removeAll(); + int uiModeType = getResources().getConfiguration().uiMode & Configuration.UI_MODE_TYPE_MASK; + boolean isTelevision = uiModeType == Configuration.UI_MODE_TYPE_TELEVISION; + PreferenceScreen screen = getPreferenceScreen(); + + ArraySet<String> preferencesToRemove = new ArraySet<>(); + for (int i = 0, n = screen.getPreferenceCount(); i < n; i++) { + preferencesToRemove.add(screen.getPreference(i).getKey()); + } + if (mExtraScreen != null) { + for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { + preferencesToRemove.add(mExtraScreen.getPreference(i).getKey()); + } + } + for (PermissionApp app : permissionApps.getApps()) { if (!Utils.shouldShowPermission(app)) { continue; } - SwitchPreference pref = (SwitchPreference) findPreference(app.getKey()); - if (!mShowSystem && Utils.isSystem(app, mLauncherPkgs)) { - if (pref != null) { - preferences.removePreference(pref); + String key = app.getKey(); + preferencesToRemove.remove(key); + Preference existingPref = screen.findPreference(key); + if (existingPref == null && mExtraScreen != null) { + existingPref = mExtraScreen.findPreference(key); + } + + boolean isSystemApp = Utils.isSystem(app, mLauncherPkgs); + if (isSystemApp && !isTelevision && !mShowSystem) { + if (existingPref != null) { + screen.removePreference(existingPref); } continue; } + + if (existingPref != null) { + continue; + } + + SwitchPreference pref = new SwitchPreference(context); + pref.setOnPreferenceChangeListener(this); + pref.setKey(app.getKey()); + pref.setIcon(app.getIcon()); + pref.setTitle(app.getLabel()); + if (app.isPolicyFixed()) { + pref.setSummary(getString(R.string.permission_summary_enforced_by_policy)); + } + pref.setPersistent(false); + pref.setEnabled(!app.isPolicyFixed()); + pref.setChecked(app.areRuntimePermissionsGranted()); + + if (isSystemApp && isTelevision) { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(context); + } + mExtraScreen.addPreference(pref); + } else { + screen.addPreference(pref); + } + } + + if (mExtraScreen != null) { + preferencesToRemove.remove(KEY_SHOW_SYSTEM_PREFS); + Preference pref = screen.findPreference(KEY_SHOW_SYSTEM_PREFS); + if (pref == null) { - pref = new SwitchPreference(context); - pref.setOnPreferenceChangeListener(this); - pref.setKey(app.getKey()); - pref.setIcon(app.getIcon()); - pref.setTitle(app.getLabel()); - if (app.isPolicyFixed()) { - pref.setSummary(getString(R.string.permission_summary_enforced_by_policy)); + pref = new Preference(context); + pref.setKey(KEY_SHOW_SYSTEM_PREFS); + pref.setIcon(Utils.applyTint(context, R.drawable.ic_toc, + android.R.attr.colorControlNormal)); + pref.setTitle(R.string.preference_show_system_apps); + pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + SystemAppsFragment frag = new SystemAppsFragment(); + setPermissionName(frag, getArguments().getString(Intent.EXTRA_PERMISSION_NAME)); + frag.setTargetFragment(PermissionAppsFragment.this, 0); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack("SystemApps") + .commit(); + return true; + } + }); + screen.addPreference(pref); + } + + int grantedCount = 0; + for (int i = 0, n = mExtraScreen.getPreferenceCount(); i < n; i++) { + if (((SwitchPreference) mExtraScreen.getPreference(i)).isChecked()) { + grantedCount++; } - pref.setPersistent(false); - pref.setEnabled(!app.isPolicyFixed()); - preferences.addPreference(pref); } - pref.setChecked(app.areRuntimePermissionsGranted()); + pref.setSummary(getString(R.string.app_permissions_group_summary, + grantedCount, mExtraScreen.getPreferenceCount())); } - if (preferences.getPreferenceCount() != 0) { + + for (String key : preferencesToRemove) { + Preference pref = screen.findPreference(key); + if (pref != null) { + screen.removePreference(pref); + } else if (mExtraScreen != null) { + pref = mExtraScreen.findPreference(key); + if (pref != null) { + mExtraScreen.removePreference(pref); + } + } + } + + if (screen.getPreferenceCount() != 0) { setLoading(false, true); } + + if (mOnPermissionsLoadedListener != null) { + mOnPermissionsLoadedListener.onPermissionsLoaded(permissionApps); + } } @Override @@ -277,4 +377,37 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple mToggledGroups = null; } } + + public static class SystemAppsFragment extends PermissionsFrameFragment implements Callback { + PermissionAppsFragment mOuterFragment; + + @Override + public void onCreate(Bundle savedInstanceState) { + mOuterFragment = (PermissionAppsFragment) getTargetFragment(); + super.onCreate(savedInstanceState); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + if (mOuterFragment.mExtraScreen != null) { + setPreferenceScreen(mOuterFragment.mExtraScreen); + } else { + mOuterFragment.setOnPermissionsLoadedListener(this); + } + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + String groupName = getArguments().getString(Intent.EXTRA_PERMISSION_NAME); + PermissionApps permissionApps = new PermissionApps(getActivity(), groupName, null); + bindUi(this, permissionApps); + } + + @Override + public void onPermissionsLoaded(PermissionApps permissionApps) { + setPreferenceScreen(mOuterFragment.mExtraScreen); + mOuterFragment.setOnPermissionsLoadedListener(null); + } + } } |