Merge "Restore user picture in add user dialog on rotation" into main
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/CreateUserDialogController.java b/packages/SettingsLib/src/com/android/settingslib/users/CreateUserDialogController.java
index 3011d31..8d03f70 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/CreateUserDialogController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/CreateUserDialogController.java
@@ -80,6 +80,7 @@
     private Bitmap mSavedPhoto;
     private String mSavedName;
     private Drawable mSavedDrawable;
+    private String mCachedDrawablePath;
     private String mUserName;
     private Drawable mNewUserIcon;
     private Boolean mIsAdmin;
@@ -117,6 +118,7 @@
         mUserNameView = null;
         mSuccessCallback = null;
         mCancelCallback = null;
+        mCachedDrawablePath = null;
         mCurrentState = INITIAL_DIALOG;
     }
 
@@ -124,13 +126,7 @@
      * Notifies that the containing activity or fragment was reinitialized.
      */
     public void onRestoreInstanceState(Bundle savedInstanceState) {
-        String pendingPhoto = savedInstanceState.getString(KEY_SAVED_PHOTO);
-        if (pendingPhoto != null) {
-            ThreadUtils.postOnBackgroundThread(() -> {
-                mSavedPhoto = EditUserPhotoController.loadNewUserPhotoBitmap(
-                        new File(pendingPhoto));
-            });
-        }
+        mCachedDrawablePath = savedInstanceState.getString(KEY_SAVED_PHOTO);
         mCurrentState = savedInstanceState.getInt(KEY_CURRENT_STATE);
         if (savedInstanceState.containsKey(KEY_IS_ADMIN)) {
             mIsAdmin = savedInstanceState.getBoolean(KEY_IS_ADMIN);
@@ -143,15 +139,12 @@
      * Notifies that the containing activity or fragment is saving its state for later use.
      */
     public void onSaveInstanceState(Bundle savedInstanceState) {
-        if (mUserCreationDialog != null && mEditUserPhotoController != null) {
-            // Bitmap cannot be stored into bundle because it may exceed parcel limit
-            // Store it in a temporary file instead
-            ThreadUtils.postOnBackgroundThread(() -> {
-                File file = mEditUserPhotoController.saveNewUserPhotoBitmap();
-                if (file != null) {
-                    savedInstanceState.putString(KEY_SAVED_PHOTO, file.getPath());
-                }
-            });
+        if (mUserCreationDialog != null && mEditUserPhotoController != null
+                && mCachedDrawablePath == null) {
+            mCachedDrawablePath = mEditUserPhotoController.getCachedDrawablePath();
+        }
+        if (mCachedDrawablePath != null) {
+            savedInstanceState.putString(KEY_SAVED_PHOTO, mCachedDrawablePath);
         }
         if (mIsAdmin != null) {
             savedInstanceState.putBoolean(KEY_IS_ADMIN, Boolean.TRUE.equals(mIsAdmin));
@@ -271,9 +264,10 @@
                 mGrantAdminView.setVisibility(View.GONE);
                 break;
             case CREATE_USER_AND_CLOSE:
-                mNewUserIcon = mEditUserPhotoController != null
+                mNewUserIcon = (mEditUserPhotoController != null
+                        && mEditUserPhotoController.getNewUserPhotoDrawable() != null)
                         ? mEditUserPhotoController.getNewUserPhotoDrawable()
-                        : null;
+                        : mSavedDrawable;
 
                 String newName = mUserNameView.getText().toString().trim();
                 String defaultName = mActivity.getString(R.string.user_new_user_name);
@@ -295,12 +289,17 @@
         }
     }
 
-    private Drawable getUserIcon(Drawable defaultUserIcon) {
-        if (mSavedPhoto != null) {
-            mSavedDrawable = CircleFramedDrawable.getInstance(mActivity, mSavedPhoto);
-            return mSavedDrawable;
+    private void setUserIcon(Drawable defaultUserIcon, ImageView userPhotoView) {
+        if (mCachedDrawablePath != null) {
+            ThreadUtils.postOnBackgroundThread(() -> {
+                mSavedPhoto = EditUserPhotoController.loadNewUserPhotoBitmap(
+                        new File(mCachedDrawablePath));
+                mSavedDrawable = CircleFramedDrawable.getInstance(mActivity, mSavedPhoto);
+                ThreadUtils.postOnMainThread(() -> userPhotoView.setImageDrawable(mSavedDrawable));
+            });
+        } else {
+            userPhotoView.setImageDrawable(defaultUserIcon);
         }
-        return defaultUserIcon;
     }
 
     private void addUserInfoEditView() {
@@ -312,10 +311,7 @@
         // if oldUserIcon param is null then we use a default gray user icon
         Drawable defaultUserIcon = UserIcons.getDefaultUserIcon(
                 mActivity.getResources(), UserHandle.USER_NULL, false);
-        // in case a new photo was selected and the activity got recreated we have to load the image
-        Drawable userIcon = getUserIcon(defaultUserIcon);
-        userPhotoView.setImageDrawable(userIcon);
-
+        setUserIcon(defaultUserIcon, userPhotoView);
         if (isChangePhotoRestrictedByBase(mActivity)) {
             // some users can't change their photos so we need to remove the suggestive icon
             mEditUserInfoView.findViewById(R.id.add_a_photo_icon).setVisibility(View.GONE);
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
index 38cf383..3fb2f60 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
@@ -60,6 +60,7 @@
     private final File mImagesDir;
     private Bitmap mNewUserPhotoBitmap;
     private Drawable mNewUserPhotoDrawable;
+    private String mCachedDrawablePath;
 
     public EditUserPhotoController(Activity activity, ActivityStarter activityStarter,
             ImageView view, Bitmap savedBitmap, Drawable savedDrawable, String fileAuthority) {
@@ -156,6 +157,9 @@
     private void onPhotoProcessed(Bitmap bitmap) {
         if (bitmap != null) {
             mNewUserPhotoBitmap = bitmap;
+            ThreadUtils.postOnBackgroundThread(() -> {
+                mCachedDrawablePath = saveNewUserPhotoBitmap().getPath();
+            });
             mNewUserPhotoDrawable = CircleFramedDrawable
                     .getInstance(mImageView.getContext(), mNewUserPhotoBitmap);
             mImageView.setImageDrawable(mNewUserPhotoDrawable);
@@ -186,4 +190,8 @@
     void removeNewUserPhotoBitmapFile() {
         new File(mImagesDir, NEW_USER_PHOTO_FILE_NAME).delete();
     }
+
+    String getCachedDrawablePath() {
+        return mCachedDrawablePath;
+    }
 }