summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values-television/strings.xml3
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionApps.java9
-rw-r--r--src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java8
-rw-r--r--src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java193
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);
+ }
+ }
}