Snap for 6830177 from 067634700688a18a705de531f451bd1a5d92fa88 to rvc-qpr1-release

Change-Id: Ie496a08f226e2985dc31eaaa21d76415bb737d2f
diff --git a/src/com/android/wallpaper/picker/BaseActivity.java b/src/com/android/wallpaper/picker/BaseActivity.java
index 7f2ea60..25a2b2a 100755
--- a/src/com/android/wallpaper/picker/BaseActivity.java
+++ b/src/com/android/wallpaper/picker/BaseActivity.java
@@ -21,7 +21,7 @@
  * Base activity that keeps track of whether fragment transactions are safe to commit given the
  * activity's current lifecycle state.
  */
-public class BaseActivity extends AppCompatActivity {
+public class BaseActivity extends AppCompatActivity implements FragmentTransactionChecker {
 
     private boolean mIsSafeToCommitFragmentTransaction;
 
@@ -37,6 +37,7 @@
         mIsSafeToCommitFragmentTransaction = false;
     }
 
+    @Override
     public boolean isSafeToCommitFragmentTransaction() {
         return mIsSafeToCommitFragmentTransaction;
     }
diff --git a/src/com/android/wallpaper/picker/FragmentTransactionChecker.java b/src/com/android/wallpaper/picker/FragmentTransactionChecker.java
new file mode 100644
index 0000000..c25a41f
--- /dev/null
+++ b/src/com/android/wallpaper/picker/FragmentTransactionChecker.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2020 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.wallpaper.picker;
+
+/**
+ * An interface for a class to keep track of whether fragment transactions are safe to commit given
+ * the activity's current lifecycle state.
+ */
+public interface FragmentTransactionChecker {
+    /**
+     * Checks if the fragment transactions are safe to commit
+     *
+     * @return {@code true} if it is safe; {@code false} otherwise.
+     */
+    boolean isSafeToCommitFragmentTransaction();
+}
diff --git a/src/com/android/wallpaper/picker/ImagePreviewFragment.java b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
index b1153bb..308e907 100755
--- a/src/com/android/wallpaper/picker/ImagePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
@@ -52,6 +52,7 @@
 
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
+import com.android.wallpaper.asset.CurrentWallpaperAssetVN;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.WallpaperPersister.Destination;
 import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback;
@@ -314,7 +315,8 @@
                         // Set page bitmap.
                         mFullResImageView.setImage(ImageSource.bitmap(pageBitmap));
 
-                        setDefaultWallpaperZoomAndScroll();
+                        setDefaultWallpaperZoomAndScroll(
+                                mWallpaperAsset instanceof CurrentWallpaperAssetVN);
                         crossFadeInMosaicView();
                     }
                     getActivity().invalidateOptionsMenu();
@@ -370,14 +372,20 @@
      *
      * <p>This method is called once in the Fragment lifecycle after the wallpaper asset has loaded
      * and rendered to the layout.
+     *
+     * @param offsetToFarLeft {@code true} if we want to offset the visible rectangle to far left of
+     *                                    the raw wallpaper; {@code false} otherwise.
      */
-    private void setDefaultWallpaperZoomAndScroll() {
+    private void setDefaultWallpaperZoomAndScroll(boolean offsetToFarLeft) {
         // Determine minimum zoom to fit maximum visible area of wallpaper on crop surface.
         int cropWidth = mWorkspaceSurface.getMeasuredWidth();
         int cropHeight = mWorkspaceSurface.getMeasuredHeight();
         Point crop = new Point(cropWidth, cropHeight);
         Rect visibleRawWallpaperRect =
                 WallpaperCropUtils.calculateVisibleRect(mRawWallpaperSize, crop);
+        if (offsetToFarLeft) {
+            visibleRawWallpaperRect.offsetTo(/* newLeft= */ 0, visibleRawWallpaperRect.top);
+        }
 
         final PointF centerPosition = WallpaperCropUtils.calculateDefaultCenter(requireContext(),
                 mRawWallpaperSize, visibleRawWallpaperRect);
diff --git a/src/com/android/wallpaper/picker/LivePreviewFragment.java b/src/com/android/wallpaper/picker/LivePreviewFragment.java
index a28b4a0..d207809 100644
--- a/src/com/android/wallpaper/picker/LivePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/LivePreviewFragment.java
@@ -302,7 +302,9 @@
             mWallpaperConnection = null;
         }
         mWorkspaceSurfaceCallback.cleanUp();
+        mWorkspaceSurface.getHolder().removeCallback(mWorkspaceSurfaceCallback);
         mWallpaperSurfaceCallback.cleanUp();
+        mWallpaperSurface.getHolder().removeCallback(mWallpaperSurfaceCallback);
     }
 
     private void previewLiveWallpaper(ImageView thumbnailView) {
diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
index 5fd0e7a..260d121 100755
--- a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
+++ b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
@@ -78,6 +78,7 @@
 import com.android.wallpaper.picker.BaseActivity;
 import com.android.wallpaper.picker.BottomActionBarFragment;
 import com.android.wallpaper.picker.CurrentWallpaperBottomSheetPresenter;
+import com.android.wallpaper.picker.FragmentTransactionChecker;
 import com.android.wallpaper.picker.MyPhotosStarter.MyPhotosStarterProvider;
 import com.android.wallpaper.picker.PreviewActivity;
 import com.android.wallpaper.picker.RotationStarter;
@@ -816,7 +817,7 @@
     }
 
     private void showStartRotationErrorDialog(@NetworkPreference int networkPreference) {
-        BaseActivity activity = (BaseActivity) getActivity();
+        FragmentTransactionChecker activity = (FragmentTransactionChecker) getActivity();
         if (activity != null) {
             StartRotationErrorDialogFragment startRotationErrorDialogFragment =
                     StartRotationErrorDialogFragment.newInstance(networkPreference);