Embed the app restrictions fragment in the dual-pane settings.

Change the limited user creation flow to show the usual message before
actually adding the user. Might need to customize the message for limited
users.

Removed the old activity wrapper and moved the logic to UserSettings.

Removed the finish button.

Bug: 8566751
Change-Id: Ie9e1a03736c41758b0bb6e79d004ad662a5af7f4
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e9218e1..8a779c9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -87,16 +87,6 @@
             </intent-filter>
         </activity>
 
-        <!-- User Restrictions activity -->
-
-        <activity android:name=".users.UserRestrictionsActivity"
-                android:label="@string/user_restrictions_title">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
         <activity android:name=".SubSettings"
                 android:taskAffinity="com.android.settings"
                 android:parentActivityName="Settings">
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index 9c5d47a..5b40656 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.users;
 
+import android.app.Activity;
 import android.app.AppGlobals;
 import android.appwidget.AppWidgetManager;
 import android.content.BroadcastReceiver;
@@ -37,6 +38,7 @@
 import android.os.Bundle;
 import android.os.Parcelable;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.CheckBoxPreference;
@@ -71,6 +73,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
 
@@ -95,9 +98,17 @@
     private static final int MAX_APP_RESTRICTIONS = 100;
 
     private static final String DELIMITER = ";";
+
+    /** Key for extra passed in from calling fragment for the userId of the user being edited */
+    public static final String EXTRA_USER_ID = "user_id";
+
+    /** Key for extra passed in from calling fragment to indicate if this is a newly created user */
+    public static final String EXTRA_NEW_USER = "new_user";
+
     HashMap<String,Boolean> mSelectedPackages = new HashMap<String,Boolean>();
     private boolean mFirstTime = true;
     private boolean mNewUser;
+    private boolean mAppListChanged;
 
     private int mCustomRequestCode;
     private HashMap<Integer, AppRestrictionsPreference> mCustomRequestMap =
@@ -117,16 +128,6 @@
         }
     }
 
-    public static class Activity extends PreferenceActivity {
-        @Override
-        public Intent getIntent() {
-            Intent modIntent = new Intent(super.getIntent());
-            modIntent.putExtra(EXTRA_SHOW_FRAGMENT, AppRestrictionsFragment.class.getName());
-            modIntent.putExtra(EXTRA_NO_HEADERS, true);
-            return modIntent;
-        }
-    }
-
     static class AppRestrictionsPreference extends SwitchPreference {
         private boolean hasSettings;
         private OnClickListener listener;
@@ -206,6 +207,17 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
+        if (icicle != null) {
+            mNewUser = icicle.getBoolean(EXTRA_NEW_USER, false);
+            mUser = new UserHandle(icicle.getInt(EXTRA_USER_ID));
+        } else {
+            Bundle args = getArguments();
+
+            if (args.containsKey(EXTRA_USER_ID)) {
+                mUser = new UserHandle(args.getInt(EXTRA_USER_ID));
+            }
+            mNewUser = args.getBoolean(EXTRA_NEW_USER, false);
+        }
         mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
         addPreferencesFromResource(R.xml.app_restrictions);
         mAppList = getPreferenceScreen();
@@ -218,13 +230,16 @@
         setHasOptionsMenu(true);
     }
 
-    void setUser(UserHandle user, boolean newUser) {
-        mUser = user;
-        mNewUser = newUser;
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBoolean(EXTRA_NEW_USER, mNewUser);
+        outState.putInt(EXTRA_USER_ID, mUser.getIdentifier());
     }
 
     public void onResume() {
         super.onResume();
+        mAppListChanged = false;
         if (mFirstTime) {
             mFirstTime = false;
             populateApps();
@@ -238,6 +253,34 @@
         mUserPreference.setText(info.name);
     }
 
+    public void onPause() {
+        super.onPause();
+        if (mAppListChanged) {
+            updateUserAppList();
+        }
+    }
+
+    private void updateUserAppList() {
+        IPackageManager ipm = IPackageManager.Stub.asInterface(
+                ServiceManager.getService("package"));
+        for (Map.Entry<String,Boolean> entry : mSelectedPackages.entrySet()) {
+            if (entry.getValue()) {
+                // Enable selected apps
+                try {
+                    ipm.installExistingPackageAsUser(entry.getKey(), mUser.getIdentifier());
+                } catch (RemoteException re) {
+                }
+            } else {
+                // Blacklist all other apps, system or downloaded
+                try {
+                    ipm.deletePackageAsUser(entry.getKey(), null, mUser.getIdentifier(),
+                            PackageManager.DELETE_SYSTEM_APP);
+                } catch (RemoteException re) {
+                }
+            }
+        }
+    }
+
     private void addSystemApps(List<SelectableAppInfo> visibleApps, Intent intent) {
         final PackageManager pm = getActivity().getPackageManager();
         List<ResolveInfo> launchableApps = pm.queryIntentActivities(intent, 0);
@@ -383,6 +426,7 @@
                     p.setOrder(MAX_APP_RESTRICTIONS * (i + 2));
                 }
                 mSelectedPackages.put(packageName, p.isChecked());
+                mAppListChanged = true;
                 i++;
             }
         }
@@ -437,6 +481,7 @@
                 pref.setChecked(!pref.isChecked());
                 mSelectedPackages.put(pref.getKey().substring(PKG_PREFIX.length()),
                         pref.isChecked());
+                mAppListChanged = true;
                 updateAllEntries(pref.getKey(), pref.isChecked());
             }
         }
@@ -689,6 +734,7 @@
                 arp.setChecked(!arp.isChecked());
                 mSelectedPackages.put(arp.getKey().substring(PKG_PREFIX.length()), arp.isChecked());
                 updateAllEntries(arp.getKey(), arp.isChecked());
+                mAppListChanged = true;
             }
             return true;
         }
diff --git a/src/com/android/settings/users/UserRestrictionsActivity.java b/src/com/android/settings/users/UserRestrictionsActivity.java
deleted file mode 100644
index 1a90a81..0000000
--- a/src/com/android/settings/users/UserRestrictionsActivity.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2013 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.users;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.app.Activity;
-import android.content.Context;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-
-import com.android.settings.R;
-
-import java.util.Map;
-
-public class UserRestrictionsActivity extends Activity implements OnClickListener {
-
-    private static final String TAG = UserRestrictionsActivity.class.getSimpleName();
-
-    static final String EXTRA_USER_NAME = "user_name";
-    static final String EXTRA_USER_ID = "user_id";
-    static final String EXTRA_ACCOUNTS = "accounts";
-
-    private Button mFinishButton;
-    private Button mBackButton;
-    private AppRestrictionsFragment mAppsFragment;
-    private UserInfo mUserInfo;
-    private boolean mNewUser;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.user_limits);
-
-        mBackButton = (Button) findViewById(R.id.back_button);
-        if (mBackButton != null) {
-            mBackButton.setOnClickListener(this);
-        }
-        mFinishButton = (Button) findViewById(R.id.next_button);
-        if (mFinishButton != null) {
-            mFinishButton.setOnClickListener(this);
-        }
-        mAppsFragment = (AppRestrictionsFragment)
-                getFragmentManager().findFragmentById(R.id.user_limits_fragment);
-
-        UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
-        String name = getIntent().getStringExtra(EXTRA_USER_NAME);
-        int userId = getIntent().getIntExtra(EXTRA_USER_ID, -1);
-        // Create the user so we have an id
-        if (userId == -1) {
-            mNewUser = true;
-            mUserInfo = um.createUser(name, UserInfo.FLAG_RESTRICTED);
-            um.setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true,
-                    new UserHandle(mUserInfo.id));
-
-            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
-                    UserSettings.USER_DRAWABLES[
-                            mUserInfo.id % UserSettings.USER_DRAWABLES.length]);
-            um.setUserIcon(mUserInfo.id, bitmap);
-        } else {
-            mUserInfo = um.getUserInfo(userId);
-        }
-        if (mAppsFragment != null) {
-            mAppsFragment.setUser(new UserHandle(mUserInfo.id), mNewUser);
-        }
-    }
-
-    @Override
-    public void onClick(View v) {
-        if (v == mFinishButton) {
-            if (mNewUser) {
-                AccountManager am = AccountManager.get(this);
-                Account [] accounts = am.getAccounts();
-                if (accounts != null) {
-                    for (Account account : accounts) {
-                        am.addSharedAccount(account,
-                                new UserHandle(mUserInfo.id));
-                    }
-                }
-            }
-
-            IPackageManager ipm = IPackageManager.Stub.asInterface(
-                    ServiceManager.getService("package"));
-            for (Map.Entry<String,Boolean> entry : mAppsFragment.mSelectedPackages.entrySet()) {
-                if (entry.getValue()) {
-                    // Enable selected apps
-                    try {
-                        ipm.installExistingPackageAsUser(entry.getKey(), mUserInfo.id);
-                    } catch (RemoteException re) {
-                    }
-                } else {
-                    // Blacklist all other apps, system or downloaded
-                    try {
-                        ipm.deletePackageAsUser(entry.getKey(), null, mUserInfo.id,
-                                PackageManager.DELETE_SYSTEM_APP);
-                    } catch (RemoteException re) {
-                    }
-                }
-            }
-            setResult(RESULT_OK);
-            mUserInfo = null;
-            finish();
-        }
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
-        if (mUserInfo != null && mNewUser) {
-            UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
-            um.removeUser(mUserInfo.id);
-        }
-    }
-}
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 5830184..1c557a2 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -42,6 +42,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.Preference;
+import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceGroup;
@@ -83,16 +84,20 @@
     private static final String KEY_ADD_RESTRICTED_USER = "user_add_restricted";
     private static final String KEY_ADD_TRUSTED_USER = "user_add_trusted";
 
-    private static final int MENU_ADD_USER = Menu.FIRST;
-    private static final int MENU_REMOVE_USER = Menu.FIRST+1;
+    private static final int MENU_REMOVE_USER = Menu.FIRST;
 
     private static final int DIALOG_CONFIRM_REMOVE = 1;
-    private static final int DIALOG_ADD_USER = 2;
-    private static final int DIALOG_SETUP_USER = 3;
-    private static final int DIALOG_USER_CANNOT_MANAGE = 4;
+    private static final int DIALOG_ADD_USER_TRUSTED = 2;
+    private static final int DIALOG_ADD_USER_LIMITED = 3;
+    private static final int DIALOG_SETUP_USER = 4;
+    private static final int DIALOG_USER_CANNOT_MANAGE = 5;
 
     private static final int MESSAGE_UPDATE_LIST = 1;
     private static final int MESSAGE_SETUP_USER = 2;
+    private static final int MESSAGE_CONFIG_USER = 3;
+
+    private static final int USER_TYPE_TRUSTED = 1;
+    private static final int USER_TYPE_LIMITED = 2;
 
     private static final String KEY_ADD_USER_LONG_MESSAGE_DISPLAYED =
             "key_add_user_long_message_displayed";
@@ -135,6 +140,9 @@
             case MESSAGE_SETUP_USER:
                 onUserCreated(msg.arg1);
                 break;
+            case MESSAGE_CONFIG_USER:
+                onManageUserClicked(msg.arg1, true);
+                break;
             }
         }
     };
@@ -237,10 +245,7 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         final int itemId = item.getItemId();
-        if (itemId == MENU_ADD_USER) {
-            onAddUserClicked();
-            return true;
-        } else if (itemId == MENU_REMOVE_USER) {
+        if (itemId == MENU_REMOVE_USER) {
             onRemoveUserClicked(UserHandle.myUserId());
             return true;
         } else {
@@ -278,10 +283,17 @@
         }
     }
 
-    private void onAddUserClicked() {
+    private void onAddUserClicked(int userType) {
         synchronized (mUserLock) {
             if (mRemovingUserId == -1 && !mAddingUser) {
-                showDialog(DIALOG_ADD_USER);
+                switch (userType) {
+                case USER_TYPE_TRUSTED:
+                    showDialog(DIALOG_ADD_USER_TRUSTED);
+                    break;
+                case USER_TYPE_LIMITED:
+                    showDialog(DIALOG_ADD_USER_LIMITED);
+                    break;
+                }
             }
         }
     }
@@ -295,11 +307,50 @@
         }
     }
 
-    private void onManageUserClicked(int userId) {
-        Intent appsChooser = new Intent();
-        appsChooser.setClass(getActivity(), UserRestrictionsActivity.class);
-        appsChooser.putExtra(UserRestrictionsActivity.EXTRA_USER_ID, userId);
-        startActivity(appsChooser);
+    private UserInfo createLimitedUser() {
+        UserInfo newUserInfo = mUserManager.createUser(
+                getResources().getString(R.string.user_new_user_name),
+                UserInfo.FLAG_RESTRICTED);
+        int userId = newUserInfo.id;
+        UserHandle user = new UserHandle(userId);
+        mUserManager.setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user);
+
+        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
+                UserSettings.USER_DRAWABLES[
+                        userId % UserSettings.USER_DRAWABLES.length]);
+        mUserManager.setUserIcon(userId, bitmap);
+        // Add shared accounts
+        AccountManager am = AccountManager.get(getActivity());
+        Account [] accounts = am.getAccounts();
+        if (accounts != null) {
+            for (Account account : accounts) {
+                am.addSharedAccount(account, user);
+            }
+        }
+        return newUserInfo;
+    }
+
+    private UserInfo createTrustedUser() {
+        UserInfo newUserInfo = mUserManager.createUser(
+                getActivity().getResources().getString(R.string.user_new_user_name), 0);
+        if (newUserInfo != null) {
+            assignDefaultPhoto(newUserInfo);
+        }
+        return newUserInfo;
+    }
+
+    private void onManageUserClicked(int userId, boolean newUser) {
+        Bundle extras = new Bundle();
+        extras.putInt(AppRestrictionsFragment.EXTRA_USER_ID, userId);
+        extras.putBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, newUser);
+        String title = getResources().getString(R.string.user_new_user_name);
+        if (userId > UserHandle.USER_OWNER) {
+            title = mUserManager.getUserInfo(userId).name;
+        }
+        ((PreferenceActivity) getActivity()).startPreferencePanel(
+                AppRestrictionsFragment.class.getName(),
+                extras, 0, title,
+                null, 0);
     }
 
     private void onUserCreated(int userId) {
@@ -340,7 +391,8 @@
                     .setMessage(R.string.user_cannot_manage_message)
                     .setPositiveButton(android.R.string.ok, null)
                     .create();
-            case DIALOG_ADD_USER: {
+            case DIALOG_ADD_USER_TRUSTED:
+            case DIALOG_ADD_USER_LIMITED: {
                 final SharedPreferences preferences = getActivity().getPreferences(
                         Context.MODE_PRIVATE);
                 final boolean longMessageDisplayed = preferences.getBoolean(
@@ -348,13 +400,15 @@
                 final int messageResId = longMessageDisplayed
                         ? R.string.user_add_user_message_short
                         : R.string.user_add_user_message_long;
+                final int userType = dialogId == DIALOG_ADD_USER_TRUSTED
+                        ? USER_TYPE_TRUSTED : USER_TYPE_LIMITED;
                 Dialog dlg = new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.user_add_user_title)
                 .setMessage(messageResId)
                 .setPositiveButton(android.R.string.ok,
                     new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface dialog, int which) {
-                            addUserNow();
+                            addUserNow(userType);
                             if (!longMessageDisplayed) {
                                 preferences.edit().putBoolean(KEY_ADD_USER_LONG_MESSAGE_DISPLAYED,
                                         true).commit();
@@ -409,23 +463,29 @@
         }
     }
 
-    private void addUserNow() {
+    private void addUserNow(final int userType) {
         synchronized (mUserLock) {
             mAddingUser = true;
             updateUserList();
             new Thread() {
                 public void run() {
+                    UserInfo user = null;
                     // Could take a few seconds
-                    UserInfo user = mUserManager.createUser(
-                            getActivity().getResources().getString(R.string.user_new_user_name), 0);
-                    if (user != null) {
-                        assignDefaultPhoto(user);
+                    if (userType == USER_TYPE_TRUSTED) {
+                        user = createTrustedUser();
+                    } else {
+                        user = createLimitedUser();
                     }
                     synchronized (mUserLock) {
                         mAddingUser = false;
                         mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
-                        mHandler.sendMessage(mHandler.obtainMessage(
-                                MESSAGE_SETUP_USER, user.id, user.serialNumber));
+                        if (userType == USER_TYPE_TRUSTED) {
+                            mHandler.sendMessage(mHandler.obtainMessage(
+                                    MESSAGE_SETUP_USER, user.id, user.serialNumber));
+                        } else {
+                            mHandler.sendMessage(mHandler.obtainMessage(
+                                    MESSAGE_CONFIG_USER, user.id, user.serialNumber));
+                        }
                     }
                 }
             }.start();
@@ -589,16 +649,9 @@
                 }
             }
         } else if (pref == mAddTrustedUser) {
-            onAddUserClicked();
+            onAddUserClicked(USER_TYPE_TRUSTED);
         } else if (pref == mAddRestrictedUser) {
-            Account[] accounts = ((AccountManager) getSystemService(Context.ACCOUNT_SERVICE))
-                    .getAccounts();
-            Intent intent = new Intent(getActivity(), UserRestrictionsActivity.class);
-            intent.putExtra(UserRestrictionsActivity.EXTRA_USER_NAME,
-                    getResources().getString(R.string.user_new_user_name));
-            intent.putExtra(UserRestrictionsActivity.EXTRA_ACCOUNTS,
-                    accounts);
-            startActivity(intent);
+            onAddUserClicked(USER_TYPE_LIMITED);
         }
         return false;
     }
@@ -626,7 +679,7 @@
                 onRemoveUserClicked(userId);
                 break;
             case UserPreference.SETTINGS_ID:
-                onManageUserClicked(userId);
+                onManageUserClicked(userId, false);
                 break;
             }
         }