Merge "Unbreak CC screen"
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index a53eca0..a3bd5a1 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -403,7 +403,7 @@
                     maxLength, requirePasswordToDecrypt, challenge);
         }
 
-        private Intent getLockPasswordIntent(Context context, int quality, int minLength,
+        protected Intent getLockPasswordIntent(Context context, int quality, int minLength,
                 final int maxLength, boolean requirePasswordToDecrypt, String password) {
             return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
                     requirePasswordToDecrypt, password);
@@ -420,7 +420,7 @@
             return ChooseLockPattern.createIntent(context, requirePassword, challenge);
         }
 
-        private Intent getLockPatternIntent(Context context, final boolean requirePassword,
+        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
                 final String pattern) {
             return ChooseLockPattern.createIntent(context, requirePassword, pattern);
         }
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 4e28eab..e15d3fc 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -78,16 +78,16 @@
 
     public static Intent createIntent(Context context, int quality,
             int minLength, final int maxLength, boolean requirePasswordToDecrypt, String password) {
-        Intent intent = createIntent(context, quality, minLength, maxLength, requirePasswordToDecrypt,
-                false);
+        Intent intent = createIntent(context, quality, minLength, maxLength,
+                requirePasswordToDecrypt, false);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
         return intent;
     }
 
     public static Intent createIntent(Context context, int quality,
             int minLength, final int maxLength, boolean requirePasswordToDecrypt, long challenge) {
-        Intent intent = createIntent(context, quality, minLength, maxLength, requirePasswordToDecrypt,
-                false);
+        Intent intent = createIntent(context, quality, minLength, maxLength,
+                requirePasswordToDecrypt, false);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
         return intent;
diff --git a/src/com/android/settings/SetupChooseLockGeneric.java b/src/com/android/settings/SetupChooseLockGeneric.java
index a69ae38..ee85916 100644
--- a/src/com/android/settings/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/SetupChooseLockGeneric.java
@@ -130,19 +130,56 @@
 
         @Override
         protected Intent getLockPasswordIntent(Context context, int quality,
-                int minLength, int maxLength, boolean requirePasswordToDecrypt,
-                boolean confirmCredentials) {
-            final Intent intent = SetupChooseLockPassword.createIntent(context, quality,
-                    minLength, maxLength, requirePasswordToDecrypt, confirmCredentials);
+                int minLength, final int maxLength,
+                boolean requirePasswordToDecrypt, boolean confirmCredentials) {
+            final Intent intent = SetupChooseLockPassword.createIntent(context, quality, minLength,
+                    maxLength, requirePasswordToDecrypt, confirmCredentials);
             SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
             return intent;
         }
 
         @Override
-        protected Intent getLockPatternIntent(Context context,
-                boolean requirePassword, boolean confirmCredentials) {
-            final Intent intent = SetupChooseLockPattern.createIntent(context,
-                    requirePassword, confirmCredentials);
+        protected Intent getLockPasswordIntent(Context context, int quality,
+                int minLength, final int maxLength,
+                boolean requirePasswordToDecrypt, long challenge) {
+            final Intent intent = SetupChooseLockPassword.createIntent(context, quality, minLength,
+                    maxLength, requirePasswordToDecrypt, challenge);
+            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            return intent;
+        }
+
+        @Override
+        protected Intent getLockPasswordIntent(Context context, int quality, int minLength,
+                final int maxLength, boolean requirePasswordToDecrypt, String password) {
+            final Intent intent = SetupChooseLockPassword.createIntent(context, quality, minLength,
+                    maxLength, requirePasswordToDecrypt, password);
+            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            return intent;
+        }
+
+        @Override
+        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
+                final boolean confirmCredentials) {
+            final Intent intent = SetupChooseLockPattern.createIntent(context, requirePassword,
+                    confirmCredentials);
+            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            return intent;
+        }
+
+        @Override
+        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
+                long challenge) {
+            final Intent intent = SetupChooseLockPattern.createIntent(context, requirePassword,
+                    challenge);
+            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            return intent;
+        }
+
+        @Override
+        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
+                final String pattern) {
+            final Intent intent = SetupChooseLockPattern.createIntent(context, requirePassword,
+                    pattern);
             SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
             return intent;
         }
diff --git a/src/com/android/settings/SetupChooseLockPassword.java b/src/com/android/settings/SetupChooseLockPassword.java
index 75a4b76..40bbb29 100644
--- a/src/com/android/settings/SetupChooseLockPassword.java
+++ b/src/com/android/settings/SetupChooseLockPassword.java
@@ -48,6 +48,24 @@
         return intent;
     }
 
+    public static Intent createIntent(Context context, int quality,
+            int minLength, final int maxLength, boolean requirePasswordToDecrypt, String password) {
+        Intent intent = ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
+                requirePasswordToDecrypt, password);
+        intent.setClass(context, SetupChooseLockPassword.class);
+        intent.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false);
+        return intent;
+    }
+
+    public static Intent createIntent(Context context, int quality,
+            int minLength, final int maxLength, boolean requirePasswordToDecrypt, long challenge) {
+        Intent intent = ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
+                requirePasswordToDecrypt, challenge);
+        intent.setClass(context, SetupChooseLockPassword.class);
+        intent.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false);
+        return intent;
+    }
+
     private SetupWizardNavBar mNavigationBar;
     private SetupChooseLockPasswordFragment mFragment;
 
diff --git a/src/com/android/settings/SetupChooseLockPattern.java b/src/com/android/settings/SetupChooseLockPattern.java
index ed5b61a..57fa2ff 100644
--- a/src/com/android/settings/SetupChooseLockPattern.java
+++ b/src/com/android/settings/SetupChooseLockPattern.java
@@ -38,14 +38,26 @@
 public class SetupChooseLockPattern extends ChooseLockPattern
         implements SetupWizardNavBar.NavigationBarListener {
 
-    public static Intent createIntent(Context context,
-            boolean requirePassword, boolean confirmCredentials) {
+    public static Intent createIntent(Context context, boolean requirePassword,
+            boolean confirmCredentials) {
         Intent intent = ChooseLockPattern.createIntent(context, requirePassword,
                 confirmCredentials);
         intent.setClass(context, SetupChooseLockPattern.class);
         return intent;
     }
 
+    public static Intent createIntent(Context context, boolean requirePassword, String pattern) {
+        Intent intent = ChooseLockPattern.createIntent(context, requirePassword, pattern);
+        intent.setClass(context, SetupChooseLockPattern.class);
+        return intent;
+    }
+
+    public static Intent createIntent(Context context, boolean requirePassword, long challenge) {
+        Intent intent = ChooseLockPattern.createIntent(context, requirePassword, challenge);
+        intent.setClass(context, SetupChooseLockPattern.class);
+        return intent;
+    }
+
     private SetupWizardNavBar mNavigationBar;
     private SetupChooseLockPatternFragment mFragment;
 
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index 8c5e65f..52a8b85 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -26,6 +26,7 @@
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.applications.ApplicationsState.AppEntry;
 import com.android.settings.applications.ApplicationsState.Session;
+import com.android.settingslib.applications.PermissionsInfo;
 
 import java.util.ArrayList;
 
diff --git a/src/com/android/settings/applications/ManagePermissions.java b/src/com/android/settings/applications/ManagePermissions.java
index a6d29c5..e8f9d0f 100644
--- a/src/com/android/settings/applications/ManagePermissions.java
+++ b/src/com/android/settings/applications/ManagePermissions.java
@@ -27,7 +27,8 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.applications.PermissionsInfo.PermissionGroup;
+import com.android.settingslib.applications.PermissionsInfo;
+import com.android.settingslib.applications.PermissionsInfo.PermissionGroup;
 
 import java.util.List;
 
diff --git a/src/com/android/settings/applications/PermissionsInfo.java b/src/com/android/settings/applications/PermissionsInfo.java
deleted file mode 100644
index 8656d1a..0000000
--- a/src/com/android/settings/applications/PermissionsInfo.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2015 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.settings.applications;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.PermissionGroupInfo;
-import android.content.pm.PermissionInfo;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.ShapeDrawable;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-public class PermissionsInfo {
-
-    private static final String TAG = "PermissionsInfo";
-
-    private final PackageManager mPm;
-    private final ArrayList<PermissionGroup> mGroups = new ArrayList<>();
-    private final Map<String, PermissionGroup> mGroupLookup = new ArrayMap<>();
-    private final Callback mCallback;
-    private final Context mContext;
-    // Count of apps that request runtime permissions.
-    private int mRuntimePermAppsCt;
-    // Count of apps that are granted runtime permissions.
-    private int mRuntimePermAppsGrantedCt;
-
-    public PermissionsInfo(Context context, Callback callback) {
-        mContext = context;
-        mPm = context.getPackageManager();
-        mCallback = callback;
-        new PermissionsLoader().execute();
-    }
-
-    public List<PermissionGroup> getGroups() {
-        synchronized (mGroups) {
-            return new ArrayList<>(mGroups);
-        }
-    }
-
-    public int getRuntimePermAppsCount() {
-        return mRuntimePermAppsCt;
-    }
-
-    public int getRuntimePermAppsGrantedCount() {
-        return mRuntimePermAppsGrantedCt;
-    }
-
-    private PermissionGroup getOrCreateGroup(String permission) {
-        PermissionGroup group = mGroupLookup.get(permission);
-        if (group == null) {
-            // Some permissions don't have a group, in that case treat them like a group
-            // and create their own PermissionGroup (only if they are runtime).
-            try {
-                PermissionInfo info = mPm.getPermissionInfo(permission, 0);
-                if (info.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS) {
-                    group = new PermissionGroup();
-                    // TODO: Add default permission icon.
-                    group.icon = info.icon != 0 ? info.loadIcon(mPm) : new ShapeDrawable();
-                    group.name = info.name;
-                    group.label = info.loadLabel(mPm).toString();
-                    mGroups.add(group);
-                    mGroupLookup.put(permission, group);
-                }
-            } catch (NameNotFoundException e) {
-                Log.w(TAG, "Unknown permission " + permission, e);
-            }
-        }
-        return group;
-    }
-
-    private class PermissionsLoader extends AsyncTask<Void, Void, Void> {
-
-        @Override
-        protected Void doInBackground(Void... params) {
-            List<PermissionGroupInfo> groups =
-                    mPm.getAllPermissionGroups(PackageManager.GET_META_DATA);
-            // Get the groups.
-            for (PermissionGroupInfo groupInfo : groups) {
-                PermissionGroup group = new PermissionGroup();
-                // TODO: Add default permission icon.
-                group.icon = groupInfo.icon != 0 ? groupInfo.loadIcon(mPm) : new ShapeDrawable();
-                group.name = groupInfo.name;
-                group.label = groupInfo.loadLabel(mPm).toString();
-                synchronized (mGroups) {
-                    mGroups.add(group);
-                }
-            }
-            // Load permissions and which are runtime.
-            for (PermissionGroup group : mGroups) {
-                try {
-                    List<PermissionInfo> permissions =
-                            mPm.queryPermissionsByGroup(group.name, 0);
-                    for (PermissionInfo info : permissions) {
-                        if (info.protectionLevel != PermissionInfo.PROTECTION_DANGEROUS) continue;
-                        mGroupLookup.put(info.name, group);
-                    }
-                } catch (NameNotFoundException e) {
-                    Log.w(TAG, "Problem getting permissions", e);
-                }
-            }
-            // Load granted info.
-            for (UserHandle user : UserManager.get(mContext).getUserProfiles()) {
-                List<PackageInfo> allApps = mPm.getInstalledPackages(
-                        PackageManager.GET_PERMISSIONS, user.getIdentifier());
-                for (PackageInfo info : allApps) {
-                    if (info.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1
-                            || info.requestedPermissions == null)  {
-                        continue;
-                    }
-                    final int N = info.requestedPermissionsFlags.length;
-                    boolean appHasRuntimePerms = false;
-                    boolean appGrantedRuntimePerms = false;
-                    for (int i = 0; i < N; i++) {
-                        boolean granted = (info.requestedPermissionsFlags[i]
-                                & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0;
-                        PermissionGroup group = getOrCreateGroup(info.requestedPermissions[i]);
-                        String key = Integer.toString(info.applicationInfo.uid);
-                        if (group != null && !group.possibleApps.contains(key)) {
-                            appHasRuntimePerms = true;
-                            group.possibleApps.add(key);
-                            if (granted) {
-                                appGrantedRuntimePerms = true;
-                                group.grantedApps.add(key);
-                            }
-                        }
-                    }
-                    if (appHasRuntimePerms) {
-                        mRuntimePermAppsCt++;
-                        if (appGrantedRuntimePerms) {
-                            mRuntimePermAppsGrantedCt++;
-                        }
-                    }
-                }
-            }
-            Collections.sort(mGroups);
-
-            return null;
-        }
-
-        @Override
-        protected void onPostExecute(Void result) {
-            mCallback.onPermissionLoadComplete();
-        }
-    }
-
-    public static class PermissionGroup implements Comparable<PermissionGroup> {
-        public final List<String> possibleApps = new ArrayList<>();
-        public final List<String> grantedApps = new ArrayList<>();
-        public String name;
-        public String label;
-        public Drawable icon;
-
-        @Override
-        public int compareTo(PermissionGroup another) {
-            return label.compareTo(another.label);
-        }
-    }
-
-    public interface Callback {
-        void onPermissionLoadComplete();
-    }
-
-}