Merge "Try not to crash while AppInfo is finishing" into mnc-dev
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index 1bb9c58..1e2d516 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -36,7 +36,6 @@
 
     <PreferenceScreen
         android:key="manage_perms"
-        android:fragment="com.android.settings.applications.ManagePermissions"
         android:title="@string/app_permissions"
         settings:keywords="@string/keywords_app_permissions" />
 
@@ -50,4 +49,8 @@
             android:value="com.android.settings.Settings$HighPowerApplicationsActivity" />
     </PreferenceScreen>
 
+    <PreferenceScreen
+        android:title="@string/memory_settings_title"
+        android:fragment="com.android.settings.applications.ProcessStatsUi" />
+
 </PreferenceScreen>
diff --git a/res/xml/dashboard_categories.xml b/res/xml/dashboard_categories.xml
index cdc1166..14a4db6 100644
--- a/res/xml/dashboard_categories.xml
+++ b/res/xml/dashboard_categories.xml
@@ -134,13 +134,13 @@
                 android:icon="@drawable/ic_settings_multiuser"
                 />
 
-        <!-- Memory -->
+        <!-- Memory (hidden for now)
         <dashboard-tile
                 android:id="@+id/manage_memory"
                 android:title="@string/memory_settings_title"
                 android:fragment="com.android.settings.applications.ProcessStatsUi"
                 android:icon="@drawable/ic_settings_memory"
-                />
+                /> -->
 
         <!-- Manage NFC payment apps -->
         <dashboard-tile
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index 268bc5b..0d2f206 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -15,11 +15,10 @@
  */
 package com.android.settings.applications;
 
-import android.app.Activity;
+import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.os.Bundle;
 import android.preference.Preference;
-import android.util.Log;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
@@ -27,36 +26,34 @@
 import com.android.settings.applications.ApplicationsState.AppEntry;
 import com.android.settings.applications.ApplicationsState.Session;
 import com.android.settings.fuelgauge.PowerWhitelistBackend;
-import com.android.settingslib.applications.PermissionsInfo;
 
 import java.util.ArrayList;
 
 public class AdvancedAppSettings extends SettingsPreferenceFragment implements
-        ApplicationsState.Callbacks, PermissionsInfo.Callback {
+        ApplicationsState.Callbacks {
 
     static final String TAG = "AdvancedAppSettings";
-    static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     private static final String KEY_APP_PERM = "manage_perms";
     private static final String KEY_APP_DOMAIN_URLS = "domain_urls";
     private static final String KEY_HIGH_POWER_APPS = "high_power_apps";
 
-    private ApplicationsState mApplicationsState;
     private Session mSession;
-    private Preference mAppPermsPreference;
     private Preference mAppDomainURLsPreference;
     private Preference mHighPowerPreference;
-    private PermissionsInfo mPermissionsInfo;
 
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.advanced_apps);
 
-        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
-        mSession = mApplicationsState.newSession(this);
+        Preference permissions = getPreferenceScreen().findPreference(KEY_APP_PERM);
+        permissions.setIntent(new Intent(Intent.ACTION_MANAGE_PERMISSIONS));
 
-        mAppPermsPreference = findPreference(KEY_APP_PERM);
+        ApplicationsState applicationsState = ApplicationsState.getInstance(
+                getActivity().getApplication());
+        mSession = applicationsState.newSession(this);
+
         mAppDomainURLsPreference = findPreference(KEY_APP_DOMAIN_URLS);
         mHighPowerPreference = findPreference(KEY_HIGH_POWER_APPS);
         updateUI();
@@ -86,12 +83,6 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        mPermissionsInfo = new PermissionsInfo(getActivity(), this);
-    }
-
-    @Override
     public void onRunningStateChanged(boolean running) {
         // No-op.
     }
@@ -130,13 +121,4 @@
     public void onLoadEntriesCompleted() {
         // No-op.
     }
-
-    @Override
-    public void onPermissionLoadComplete() {
-        Activity activity = getActivity();
-        if (activity == null) return;
-//        mAppPermsPreference.setSummary(activity.getString(R.string.app_permissions_summary,
-//                mPermissionsInfo.getRuntimePermAppsGrantedCount(),
-//                mPermissionsInfo.getRuntimePermAppsCount()));
-    }
 }
diff --git a/src/com/android/settings/applications/ManagePermissions.java b/src/com/android/settings/applications/ManagePermissions.java
deleted file mode 100644
index 35356e5..0000000
--- a/src/com/android/settings/applications/ManagePermissions.java
+++ /dev/null
@@ -1,192 +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.app.Activity;
-import android.app.FragmentTransaction;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.content.res.Resources.Theme;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-import android.view.View;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.settings.AppHeader;
-import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settingslib.applications.PermissionsInfo;
-import com.android.settingslib.applications.PermissionsInfo.PermissionGroup;
-
-import java.util.List;
-
-public class ManagePermissions extends SettingsPreferenceFragment
-        implements PermissionsInfo.Callback {
-
-    private static final String TAG = "ManagePermissions";
-
-    private static final String OS_PKG = "android";
-
-    private PermissionsInfo mPermissionsInfo;
-
-    private PreferenceScreen mExtraScreen;
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        mPermissionsInfo = new PermissionsInfo(getActivity(), this);
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        showLoadingWhenEmpty();
-    }
-
-    private void refreshUi() {
-        Activity activity = getActivity();
-        PreferenceScreen screen = getPreferenceScreen();
-        if (screen == null) {
-            screen = getPreferenceManager().createPreferenceScreen(activity);
-            setPreferenceScreen(screen);
-        } else {
-            screen.removeAll();
-            if (mExtraScreen != null) {
-                mExtraScreen.removeAll();
-            }
-        }
-        final int count = screen.getPreferenceCount();
-        if (count == 0) {
-            final Preference extraScreenPreference = new Preference(activity);
-            extraScreenPreference.setIcon(R.drawable.ic_toc);
-            extraScreenPreference.setTitle(R.string.additional_permissions);
-            List<PermissionGroup> groups = mPermissionsInfo.getGroups();
-            for (PermissionGroup group : groups) {
-                if (group.possibleApps.size() == 0) continue;
-                PermissionPreference pref = new PermissionPreference(activity, group);
-                pref.refreshUi();
-                if (group.packageName.equals(OS_PKG)) {
-                    screen.addPreference(pref);
-                } else {
-                    if (mExtraScreen == null) {
-                        mExtraScreen = getPreferenceManager().createPreferenceScreen(activity);
-                    }
-                    mExtraScreen.addPreference(pref);
-                }
-            }
-            if (mExtraScreen != null) {
-                extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-                    @Override
-                    public boolean onPreferenceClick(Preference preference) {
-                        AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment();
-                        frag.setTargetFragment(ManagePermissions.this, 0);
-                        FragmentTransaction ft = getFragmentManager().beginTransaction();
-                        ft.replace(R.id.main_content, frag);
-                        ft.addToBackStack("AdditionalPerms");
-                        ft.commit();
-                        return true;
-                    }
-                });
-                extraScreenPreference.setSummary(getString(R.string.additional_permissions_more,
-                        mExtraScreen.getPreferenceCount()));
-                screen.addPreference(extraScreenPreference);
-            }
-        } else {
-            updatePrefs(screen);
-            if (mExtraScreen != null) {
-                updatePrefs(mExtraScreen);
-            }
-        }
-    }
-
-    private void updatePrefs(PreferenceScreen screen) {
-        for (int i = 0; i < screen.getPreferenceCount(); i++) {
-            Preference pref = screen.getPreference(i);
-            if (pref instanceof PermissionPreference) {
-                ((PermissionPreference) pref).refreshUi();
-            }
-        }
-    }
-
-    @Override
-    public void onPermissionLoadComplete() {
-        refreshUi();
-    }
-
-    @Override
-    protected int getMetricsCategory() {
-        return MetricsLogger.MANAGE_PERMISSIONS;
-    }
-
-    private class PermissionPreference extends Preference implements OnPreferenceClickListener {
-        private final PermissionGroup mGroup;
-
-        public PermissionPreference(Context context, PermissionGroup group) {
-            super(context);
-            setOnPreferenceClickListener(this);
-            mGroup = group;
-        }
-
-        public void refreshUi() {
-            setTitle(mGroup.label);
-            setIcon(mGroup.icon);
-//            setSummary(getContext().getString(R.string.app_permissions_group_summary,
-//                    mGroup.grantedApps.size(), mGroup.possibleApps.size()));
-        }
-
-        @Override
-        public boolean onPreferenceClick(Preference preference) {
-            Intent i = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS)
-                    .putExtra(Intent.EXTRA_PERMISSION_NAME, mGroup.name);
-            try {
-                getActivity().startActivity(i);
-            } catch (ActivityNotFoundException e) {
-                Log.w(TAG, "No app to handle " + i.getAction());
-            }
-            return true;
-        }
-    }
-
-    public static class AdditionalPermissionsFragment extends SettingsPreferenceFragment {
-        @Override
-        public void onCreate(Bundle icicle) {
-            super.onCreate(icicle);
-            setPreferenceScreen(((ManagePermissions) getTargetFragment()).mExtraScreen);
-        }
-
-        @Override
-        public void onViewCreated(View view, Bundle savedInstanceState) {
-            super.onViewCreated(view, savedInstanceState);
-            Resources resources = getResources();
-            Theme theme = getActivity().getTheme();
-            AppHeader.createAppHeader(this, resources.getDrawable(R.drawable.ic_toc, theme),
-                    getString(R.string.additional_permissions), null, android.R.color.white);
-        }
-
-        @Override
-        protected int getMetricsCategory() {
-            return MetricsLogger.MANAGE_PERMISSIONS;
-        }
-    }
-
-}
diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
index 9ab714a..e2e6dbe 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
@@ -55,12 +55,23 @@
         new PartitionTask().execute();
     }
 
-    public class PartitionTask extends AsyncTask<Void, Void, Exception> {
+    public class PartitionTask extends AsyncTask<Void, Integer, Exception> {
         @Override
         protected Exception doInBackground(Void... params) {
             try {
                 if (mFormatPrivate) {
                     mStorage.partitionPrivate(mDisk.getId());
+                    publishProgress(40);
+
+                    final long internalBench = mStorage.benchmark(null);
+                    publishProgress(60);
+
+                    final VolumeInfo privateVol = findFirstVolume(VolumeInfo.TYPE_PRIVATE);
+                    final long privateBench = mStorage.benchmark(privateVol.id);
+
+                    // TODO: plumb through to user when below threshold
+                    final float pct = (float) internalBench / (float) privateBench;
+                    Log.d(TAG, "New volume is " + pct + "x the speed of internal");
                 } else {
                     mStorage.partitionPublic(mDisk.getId());
                 }
@@ -71,6 +82,11 @@
         }
 
         @Override
+        protected void onProgressUpdate(Integer... progress) {
+            setCurrentProgress(progress[0]);
+        }
+
+        @Override
         protected void onPostExecute(Exception e) {
             final Context context = StorageWizardFormatProgress.this;
             if (e == null) {
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
index 1444ad5..2d200b5 100644
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
@@ -147,7 +147,7 @@
                 mSelectedAccessPoint = mDlgAccessPoint;
 
                 // Hide forget button if config editing is locked down
-                final boolean hideForgetButton = WifiSettings.isCreatorDeviceOwner(getActivity(),
+                final boolean hideForgetButton = WifiSettings.isEditabilityLockedDown(getActivity(),
                         mDlgAccessPoint.getConfig());
                 mDialog = new WifiDialog(getActivity(), this, mDlgAccessPoint,
                         false /* not editting */, true /* hide the submit button */,
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 0c28db3..97612a9 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -43,6 +43,7 @@
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
 import android.text.Spannable;
@@ -439,8 +440,8 @@
                 }
 
                 WifiConfiguration config = mSelectedAccessPoint.getConfig();
-                // Device Owner created configs are uneditable
-                if (isCreatorDeviceOwner(getActivity(), config)) {
+                // Some configs are ineditable
+                if (isEditabilityLockedDown(getActivity(), config)) {
                     return;
                 }
 
@@ -522,7 +523,7 @@
     private void showDialog(AccessPoint accessPoint, boolean edit) {
         if (accessPoint != null) {
             WifiConfiguration config = accessPoint.getConfig();
-            if (isCreatorDeviceOwner(getActivity(), config) && accessPoint.isActive()) {
+            if (isEditabilityLockedDown(getActivity(), config) && accessPoint.isActive()) {
                 final int userId = UserHandle.getUserId(config.creatorUid);
                 final PackageManager pm = getActivity().getPackageManager();
                 final IPackageManager ipm = AppGlobals.getPackageManager();
@@ -575,7 +576,7 @@
                 }
                 // If it's null, fine, it's for Add Network
                 mSelectedAccessPoint = ap;
-                final boolean hideForget = (ap == null || isCreatorDeviceOwner(getActivity(),
+                final boolean hideForget = (ap == null || isEditabilityLockedDown(getActivity(),
                         ap.getConfig()));
                 mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit,
                         /* no hide submit/connect */ false,
@@ -913,11 +914,11 @@
         };
 
     /**
-     * Returns the true if the app that created this config is the device owner of the device.
+     * Returns true if the config is not editable/removable except by its creating Device Owner.
      * @param config The WiFi config.
-     * @return creator package name or null if creator package is not device owner.
+     * @return true if the config is not editable/removable except by its creating Device Owner.
      */
-    static boolean isCreatorDeviceOwner(Context context, WifiConfiguration config) {
+    static boolean isEditabilityLockedDown(Context context, WifiConfiguration config) {
         if (config == null) {
             return false;
         }
@@ -927,6 +928,10 @@
         if (deviceOwnerPackageName == null) {
             return false;
         }
+        UserManager um = UserManager.get(context);
+        if (um.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI)) {
+            return false;
+        }
         final PackageManager pm = context.getPackageManager();
         try {
             final int deviceOwnerUid = pm.getPackageUid(deviceOwnerPackageName,