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));
+        }
+    }
+}