Split system and adtl. perm managment fragments
This allows for easier lifecycle management. As both fragments are very
similar common code is moved to a superclass.
Test: Opened system perm fragment, resized, opened addtl. perm fragment,
resized, back, back. Permissions show up correctly.
Change-Id: I9313c7d97df8f74c33ac899d2b037f3df75506b6
Fixes: 32008494
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java b/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
index b60dc50..2e0e555 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
@@ -21,8 +21,9 @@
import android.os.Bundle;
import android.util.Log;
-import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear;
import com.android.packageinstaller.DeviceUtils;
+import com.android.packageinstaller.permission.ui.handheld.ManageStandardPermissionsFragment;
+import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear;
public final class ManagePermissionsActivity extends OverlayTouchActivity {
private static final String LOG_TAG = "ManagePermissionsActivity";
@@ -47,8 +48,7 @@
fragment = com.android.packageinstaller.permission.ui.television
.ManagePermissionsFragment.newInstance();
} else {
- fragment = com.android.packageinstaller.permission.ui.handheld
- .ManagePermissionsFragment.newInstance();
+ fragment = ManageStandardPermissionsFragment.newInstance();
}
} break;
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManageCustomPermissionsFragment.java b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManageCustomPermissionsFragment.java
new file mode 100644
index 0000000..4f740e2
--- /dev/null
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManageCustomPermissionsFragment.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 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.packageinstaller.permission.ui.handheld;
+
+import android.view.MenuItem;
+
+/**
+ * Fragment that allows the user to manage custom permissions.
+ */
+public class ManageCustomPermissionsFragment extends ManagePermissionsFragment {
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ getActivity().setTitle(com.android.packageinstaller.R.string.additional_permissions);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ getFragmentManager().popBackStack();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected void updatePermissionsUi() {
+ updatePermissionsUi(false);
+ }
+}
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java
index 238af36..a7307c3 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java
@@ -16,21 +16,15 @@
package com.android.packageinstaller.permission.ui.handheld;
import android.app.ActionBar;
-import android.app.FragmentTransaction;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceScreen;
import android.util.ArraySet;
import android.util.Log;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
+
import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.PermissionApps;
import com.android.packageinstaller.permission.model.PermissionApps.PmCache;
@@ -40,25 +34,20 @@
import java.util.List;
-public final class ManagePermissionsFragment extends PermissionsFrameFragment
+/**
+ * Superclass for fragments allowing the user to manage permissions.
+ */
+abstract class ManagePermissionsFragment extends PermissionsFrameFragment
implements PermissionGroups.PermissionsGroupsChangeCallback,
Preference.OnPreferenceClickListener {
private static final String LOG_TAG = "ManagePermissionsFragment";
- private static final String OS_PKG = "android";
-
- private static final String EXTRA_PREFS_KEY = "extra_prefs_key";
+ static final String OS_PKG = "android";
private ArraySet<String> mLauncherPkgs;
private PermissionGroups mPermissions;
- private PreferenceScreen mExtraScreen;
-
- public static ManagePermissionsFragment newInstance() {
- return new ManagePermissionsFragment();
- }
-
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -73,19 +62,9 @@
}
@Override
- public void onResume() {
- super.onResume();
+ public void onStart() {
+ super.onStart();
mPermissions.refresh();
- updatePermissionsUi();
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- getActivity().finish();
- return true;
- }
- return super.onOptionsItemSelected(item);
}
@Override
@@ -108,27 +87,34 @@
return true;
}
+ /**
+ * @return the permissions
+ */
+ protected PermissionGroups getPermissions() {
+ return mPermissions;
+ }
+
@Override
public void onPermissionGroupsChanged() {
updatePermissionsUi();
}
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- bindPermissionUi(getActivity(), getView());
- }
+ /**
+ * Update the preferences to show the new {@link #getPermissions() permissions}.
+ */
+ protected abstract void updatePermissionsUi();
- private static void bindPermissionUi(Context context, View rootView) {
- if (context == null || rootView == null) {
- return;
- }
- }
-
- private void updatePermissionsUi() {
+ /**
+ * Add preferences for all permissions of a type to the preference screen.
+ *
+ * @param addSystemPermissions If the permissions added should be system permissions or not
+ *
+ * @return The preference screen the permissions were added to
+ */
+ protected PreferenceScreen updatePermissionsUi(boolean addSystemPermissions) {
Context context = getActivity();
if (context == null) {
- return;
+ return null;
}
List<PermissionGroup> groups = mPermissions.getGroups();
@@ -136,6 +122,8 @@
if (screen == null) {
screen = getPreferenceManager().createPreferenceScreen(getActivity());
setPreferenceScreen(screen);
+ } else {
+ screen.removeAll();
}
// Use this to speed up getting the info for all of the PermissionApps below.
@@ -144,34 +132,25 @@
for (PermissionGroup group : groups) {
boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG);
- Preference preference = findPreference(group.getName());
- if (preference == null && mExtraScreen != null) {
- preference = mExtraScreen.findPreference(group.getName());
- }
- if (preference == null) {
- preference = new Preference(context);
- preference.setOnPreferenceClickListener(this);
- preference.setKey(group.getName());
- preference.setIcon(Utils.applyTint(context, group.getIcon(),
- android.R.attr.colorControlNormal));
- preference.setTitle(group.getLabel());
- // Set blank summary so that no resizing/jumping happens when the summary is loaded.
- preference.setSummary(" ");
- preference.setPersistent(false);
- if (isSystemPermission) {
- screen.addPreference(preference);
- } else {
- if (mExtraScreen == null) {
- mExtraScreen = getPreferenceManager().createPreferenceScreen(context);
- }
- mExtraScreen.addPreference(preference);
- }
- }
- final Preference finalPref = preference;
+ if (addSystemPermissions == isSystemPermission) {
+ Preference preference = findPreference(group.getName());
- new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() {
- @Override
- public void onPermissionsLoaded(PermissionApps permissionApps) {
+ if (preference == null) {
+ preference = new Preference(context);
+ preference.setOnPreferenceClickListener(this);
+ preference.setKey(group.getName());
+ preference.setIcon(Utils.applyTint(context, group.getIcon(),
+ android.R.attr.colorControlNormal));
+ preference.setTitle(group.getLabel());
+ // Set blank summary so that no resizing/jumping happens when the summary is
+ // loaded.
+ preference.setSummary(" ");
+ preference.setPersistent(false);
+ screen.addPreference(preference);
+ }
+ final Preference finalPref = preference;
+
+ new PermissionApps(getContext(), group.getName(), permissionApps -> {
if (getActivity() == null) {
return;
}
@@ -179,72 +158,13 @@
int total = permissionApps.getTotalCount(mLauncherPkgs);
finalPref.setSummary(getString(R.string.app_permissions_group_summary,
granted, total));
- }
- }, cache).refresh(false);
- }
-
- if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0
- && screen.findPreference(EXTRA_PREFS_KEY) == null) {
- Preference extraScreenPreference = new Preference(context);
- extraScreenPreference.setKey(EXTRA_PREFS_KEY);
- extraScreenPreference.setIcon(Utils.applyTint(context,
- R.drawable.ic_more_items,
- android.R.attr.colorControlNormal));
- extraScreenPreference.setTitle(R.string.additional_permissions);
- extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment();
- frag.setTargetFragment(ManagePermissionsFragment.this, 0);
- FragmentTransaction ft = getFragmentManager().beginTransaction();
- ft.replace(android.R.id.content, frag);
- ft.addToBackStack(null);
- ft.commit();
- return true;
- }
- });
- int count = mExtraScreen.getPreferenceCount();
- extraScreenPreference.setSummary(getResources().getQuantityString(
- R.plurals.additional_permissions_more, count, count));
- screen.addPreference(extraScreenPreference);
+ }, cache).refresh(false);
+ }
}
if (screen.getPreferenceCount() != 0) {
setLoading(false /* loading */, true /* animate */);
}
- }
- public static class AdditionalPermissionsFragment extends PermissionsFrameFragment {
- @Override
- public void onCreate(Bundle icicle) {
- setLoading(true /* loading */, false /* animate */);
- super.onCreate(icicle);
- getActivity().setTitle(R.string.additional_permissions);
- setHasOptionsMenu(true);
-
- setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen);
- setLoading(false /* loading */, true /* animate */);
- }
-
- @Override
- public void onDestroy() {
- getActivity().setTitle(R.string.app_permissions);
- super.onDestroy();
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- getFragmentManager().popBackStack();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- bindPermissionUi(getActivity(), getView());
- }
+ return screen;
}
}
diff --git a/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManageStandardPermissionsFragment.java b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManageStandardPermissionsFragment.java
new file mode 100644
index 0000000..075ab3c
--- /dev/null
+++ b/PermissionController/src/com/android/packageinstaller/permission/ui/handheld/ManageStandardPermissionsFragment.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2016 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.packageinstaller.permission.ui.handheld;
+
+import android.app.FragmentTransaction;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
+import android.view.MenuItem;
+
+import com.android.packageinstaller.R;
+import com.android.packageinstaller.permission.model.PermissionGroup;
+import com.android.packageinstaller.permission.utils.Utils;
+
+import java.util.List;
+
+/**
+ * Fragment that allows the user to manage standard permissions.
+ */
+public final class ManageStandardPermissionsFragment extends ManagePermissionsFragment {
+ private static final String EXTRA_PREFS_KEY = "extra_prefs_key";
+
+ /**
+ * @return A new fragment
+ */
+ public static ManageStandardPermissionsFragment newInstance() {
+ return new ManageStandardPermissionsFragment();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ getActivity().setTitle(com.android.packageinstaller.R.string.app_permissions);
+ }
+
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ getActivity().finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected void updatePermissionsUi() {
+ PreferenceScreen screen = updatePermissionsUi(true);
+ if (screen == null) {
+ return;
+ }
+
+ // Check if we need an additional permissions preference
+ List<PermissionGroup> groups = getPermissions().getGroups();
+ int numExtraPermissions = 0;
+ for (PermissionGroup group : groups) {
+ if (!group.getDeclaringPackage().equals(ManagePermissionsFragment.OS_PKG)) {
+ numExtraPermissions++;
+ }
+ }
+
+ Preference additionalPermissionsPreference = screen.findPreference(EXTRA_PREFS_KEY);
+ if (numExtraPermissions == 0) {
+ if (additionalPermissionsPreference != null) {
+ screen.removePreference(additionalPermissionsPreference);
+ }
+ } else {
+ if (additionalPermissionsPreference == null) {
+ additionalPermissionsPreference = new Preference(getActivity());
+ additionalPermissionsPreference.setKey(EXTRA_PREFS_KEY);
+ additionalPermissionsPreference.setIcon(Utils.applyTint(getActivity(),
+ R.drawable.ic_more_items,
+ android.R.attr.colorControlNormal));
+ additionalPermissionsPreference.setTitle(R.string.additional_permissions);
+ additionalPermissionsPreference.setOnPreferenceClickListener(preference -> {
+ ManageCustomPermissionsFragment frag =
+ new ManageCustomPermissionsFragment();
+ frag.setTargetFragment(ManageStandardPermissionsFragment.this, 0);
+ FragmentTransaction ft = getFragmentManager().beginTransaction();
+ ft.replace(android.R.id.content, frag);
+ ft.addToBackStack(null);
+ ft.commit();
+ return true;
+ });
+
+ screen.addPreference(additionalPermissionsPreference);
+ }
+
+ additionalPermissionsPreference.setSummary(getResources().getQuantityString(
+ R.plurals.additional_permissions_more, numExtraPermissions,
+ numExtraPermissions));
+ }
+ }
+}