diff --git a/res/drawable/ic_mode_edit_gm2_24px.xml b/res/drawable/ic_mode_edit_gm2_24px.xml
new file mode 100644
index 0000000..674611c
--- /dev/null
+++ b/res/drawable/ic_mode_edit_gm2_24px.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M20.41,4.94l-1.35,-1.35c-0.78,-0.78 -2.05,-0.78 -2.83,0L13.4,6.41 3,16.82L3,21h4.18l10.46,-10.46 2.77,-2.77c0.79,-0.78 0.79,-2.05 0,-2.83zM6.41,19.06L5,19v-1.36l9.82,-9.82 1.41,1.41 -9.82,9.83z"/>
+</vector>
diff --git a/res/drawable/ic_pan_zoom_24dp.xml b/res/drawable/ic_pan_zoom_24dp.xml
deleted file mode 100644
index 5dbfb7d..0000000
--- a/res/drawable/ic_pan_zoom_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M22,2v7h-2V5.4l-4.32,4.29l-1.36,-1.37L18.67,4H15V2H22zM9.66,15.69L8.3,14.32L4,18.6V15H2v7h7v-2H5.33L9.66,15.69z"/>
-</vector>
diff --git a/res/drawable/ic_rotation_gm2_24px.xml b/res/drawable/ic_rotation_gm2_24px.xml
new file mode 100644
index 0000000..e8a12be
--- /dev/null
+++ b/res/drawable/ic_rotation_gm2_24px.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M13,9v2h7V4h-2v2.74C16.53,5.07 14.4,4 12,4c-2.21,0 -4.21,0.9 -5.66,2.34S4,9.79 4,12c0,4.42 3.58,8 8,8 2.21,0 4.21,-0.9 5.66,-2.34l-1.42,-1.42C15.15,17.33 13.65,18 12,18c-3.31,0 -6,-2.69 -6,-6 0,-1.65 0.67,-3.15 1.76,-4.24C8.85,6.67 10.35,6 12,6c2.21,0 4.15,1.21 5.19,3H13z"/>
+</vector>
diff --git a/res/drawable/ic_slideshow_24dp.xml b/res/drawable/ic_slideshow_24dp.xml
deleted file mode 100644
index f7c0815..0000000
--- a/res/drawable/ic_slideshow_24dp.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M4,6H2V20a2,2 0,0 0,2 2H18V20H4Z"/>
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M20,2H15V4h5V9h2V4A2,2 0,0 0,20 2Z"/>
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M8,4h5V2H8A2,2 0,0 0,6 4V9H8Z"/>
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M8,18h5V16H8V11H6v5A2,2 0,0 0,8 18Z"/>
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M20,16H15v2h5a2,2 0,0 0,2 -2V11H20Z"/>
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M13.28,13.01l-1.78,-2.01l-2.5,3l10,0l-3.22,-4l-2.5,3.01z"/>
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M17,7m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"/>
-</vector>
diff --git a/res/drawable/ic_tune_black_24dp.xml b/res/drawable/ic_tune_black_24dp.xml
deleted file mode 100644
index ad3e25e..0000000
--- a/res/drawable/ic_tune_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:pathData="M3,17v2h6v-2L3,17zM3,5v2h10L13,5L3,5zM13,21v-2h8v-2h-8v-2h-2v6h2zM7,9v2L3,11v2h4v2h2L9,9L7,9zM21,13v-2L11,11v2h10zM15,9h2L17,7h4L21,5h-4L17,3h-2v6z"
-      android:fillColor="#000000"/>
-</vector>
diff --git a/res/layout/bottom_action_bar_preview_info.xml b/res/layout/bottom_action_bar_preview_info.xml
index 62715c2..6baf5fb 100644
--- a/res/layout/bottom_action_bar_preview_info.xml
+++ b/res/layout/bottom_action_bar_preview_info.xml
@@ -21,7 +21,7 @@
     android:layout_width="match_parent"
     android:orientation="vertical"
     android:paddingHorizontal="@dimen/preview_attribution_pane_horizontal_padding"
-    android:paddingVertical="@dimen/bottom_action_bar_preview_info_padding_vertical"
+    android:paddingVertical="@dimen/bottom_action_bar_padding_vertical"
     android:theme="@style/WallpaperPicker.BottomPaneStyle">
 
   <TextView
diff --git a/res/layout/bottom_actions_layout.xml b/res/layout/bottom_actions_layout.xml
index 15718c0..14bea38 100644
--- a/res/layout/bottom_actions_layout.xml
+++ b/res/layout/bottom_actions_layout.xml
@@ -23,9 +23,7 @@
     <!--  Bottom Sheet  -->
     <androidx.coordinatorlayout.widget.CoordinatorLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:clipToPadding="false"
-        android:paddingTop="2dp">
+        android:layout_height="wrap_content">
         <!-- Bottom sheet view should be a child view of CoordinatorLayout -->
         <FrameLayout
             android:id="@+id/action_bottom_sheet"
@@ -33,7 +31,6 @@
             android:layout_height="wrap_content"
             android:background="@drawable/bottom_sheet_background"
             android:theme="@style/WallpaperPicker.BottomPaneStyle"
-            android:elevation="@dimen/bottom_action_bar_elevation"
             app:behavior_peekHeight="@dimen/preview_attribution_pane_collapsed_height"
             app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
             <include layout="@layout/bottom_action_bar_preview_info"/>
@@ -44,126 +41,55 @@
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="@dimen/bottom_navbar_height"
-        android:paddingTop="@dimen/bottom_action_bar_padding_top"
         android:paddingHorizontal="@dimen/bottom_action_bar_padding_horizontal"
         android:clickable="true"
         android:background="?android:colorPrimary"
-        android:theme="@style/BottomActionItemStyle"
-        android:layoutDirection="locale">
+        android:theme="@style/BottomActionItemStyle">
 
         <ImageView
-            android:id="@+id/action_back"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:id="@+id/action_cancel"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
             android:src="@drawable/ic_close_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/bottom_action_bar_back"
-            app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_rotation"
             app:layout_constraintHorizontal_chainStyle="spread_inside"
             app:layout_constraintStart_toStartOf="parent" />
 
         <ImageView
             android:id="@+id/action_rotation"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
-            android:src="@drawable/ic_slideshow_24dp"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/bottom_action_bar_slideshow_wallpaper"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:src="@drawable/ic_rotation_gm2_24px"
             android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintEnd_toStartOf="@id/action_delete"
-            app:layout_constraintStart_toEndOf="@id/action_back" />
-
-        <ImageView
-            android:id="@+id/action_delete"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
-            android:src="@drawable/ic_delete_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/delete_live_wallpaper"
-            android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_information"
-            app:layout_constraintStart_toEndOf="@id/action_rotation" />
+            app:layout_constraintStart_toEndOf="@id/action_cancel" />
 
         <ImageView
             android:id="@+id/action_information"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
             android:src="@drawable/ic_info_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/tab_info"
             android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_edit"
-            app:layout_constraintStart_toEndOf="@id/action_delete" />
+            app:layout_constraintStart_toEndOf="@id/action_rotation" />
 
         <ImageView
             android:id="@+id/action_edit"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
-            android:src="@drawable/ic_pan_zoom_24dp"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/bottom_action_bar_edit"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:src="@drawable/ic_mode_edit_gm2_24px"
             android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintEnd_toStartOf="@id/action_customize"
+            app:layout_constraintEnd_toStartOf="@id/action_apply"
             app:layout_constraintStart_toEndOf="@id/action_information" />
 
         <ImageView
-            android:id="@+id/action_customize"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
-            android:src="@drawable/ic_tune_black_24dp"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/tab_customize"
-            android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintEnd_toStartOf="@id/action_download"
-            app:layout_constraintStart_toEndOf="@id/action_edit" />
-
-        <ImageView
-            android:id="@+id/action_download"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
-            android:src="@drawable/ic_file_download_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/bottom_action_bar_download"
-            android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintEnd_toStartOf="@id/action_progress"
-            app:layout_constraintStart_toEndOf="@id/action_customize" />
-
-        <ProgressBar
-            android:id="@+id/action_progress"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
-            android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintEnd_toStartOf="@id/action_apply"
-            app:layout_constraintStart_toEndOf="@id/action_download" />
-
-        <ImageView
             android:id="@+id/action_apply"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
             android:src="@drawable/ic_done_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
-            android:contentDescription="@string/bottom_action_bar_apply"
             android:visibility="gone"
-            app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@id/action_progress" />
+            app:layout_constraintStart_toEndOf="@id/action_edit" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 </LinearLayout>
diff --git a/res/layout/fragment_individual_picker.xml b/res/layout/fragment_individual_picker.xml
index 2b8c25b..05bcb18 100755
--- a/res/layout/fragment_individual_picker.xml
+++ b/res/layout/fragment_individual_picker.xml
@@ -32,6 +32,7 @@
             android:clipToPadding="false"
             android:fitsSystemWindows="true"
             android:paddingHorizontal="@dimen/grid_edge_space"
+            android:paddingTop="@dimen/grid_padding"
             android:scrollbarSize="@dimen/grid_padding"
             android:scrollbarStyle="outsideOverlay"
             android:scrollbarThumbVertical="@color/scrollbar_thumb_color_dark"
diff --git a/res/layout/wallpaper_preview_card.xml b/res/layout/wallpaper_preview_card.xml
index f548dfb..f9e36da 100644
--- a/res/layout/wallpaper_preview_card.xml
+++ b/res/layout/wallpaper_preview_card.xml
@@ -33,11 +33,4 @@
         android:id="@+id/wallpaper_surface"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
-
-    <View
-        android:id="@+id/fade_cover"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:alpha="0"
-        android:background="@color/preview_pager_background" />
 </androidx.cardview.widget.CardView>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 618c823..b43d350 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -208,17 +208,12 @@
     <item name="preview_pager_maximum_height_ratio" format="float" type="dimen">0.7</item>
 
     <!-- Dimensions for the bottom bar. -->
-    <dimen name="bottom_navbar_height">76dp</dimen>
-    <dimen name="bottom_action_bar_padding_horizontal">4dp</dimen>
-    <dimen name="bottom_action_bar_padding_top">6dp</dimen>
-    <dimen name="bottom_action_bar_preview_info_padding_vertical">20dp</dimen>
+    <dimen name="bottom_navbar_height">56dp</dimen>
+    <dimen name="bottom_action_bar_padding_horizontal">16dp</dimen>
+    <dimen name="bottom_action_bar_padding_vertical">20dp</dimen>
     <dimen name="bottom_action_bar_elevation">10dp</dimen>
-    <dimen name="bottom_action_button_size">48dp</dimen>
-    <dimen name="bottom_action_button_padding">12dp</dimen>
-    <dimen name="bottom_action_icon_size">24dp</dimen>
 
     <dimen name="option_border_width">2dp</dimen>
     <dimen name="option_selected_border_width">3dp</dimen>
     <dimen name="option_title_font_text_size">12sp</dimen>
-    <dimen name="option_title_line_height">16dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9cde4fd..c61d80d 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -316,22 +316,6 @@
     <!-- Confirmation dialog. Shown after user selects to delete one wallpaper. [CHAR LIMIT=NONE] -->
     <string name="delete_wallpaper_confirmation">Delete this wallpaper from your phone?</string>
 
-    <!-- Content description of back button on the bottom action bar. [CHAR LIMIT=30] -->
-    <string name="bottom_action_bar_back">Back</string>
-
-    <!-- Content description of edit button on the bottom action bar. [CHAR LIMIT=30] -->
-    <string name="bottom_action_bar_edit">Edit</string>
-
-    <!-- TODO(b/154299462): Separate downloadable related actions from WallpaperPicker. -->
-    <!-- Content description of download button on the bottom action bar. [CHAR LIMIT=30] -->
-    <string name="bottom_action_bar_download">Download</string>
-
-    <!-- Content description of "slideshow wallpaper" button on the bottom action bar. [CHAR LIMIT=30] -->
-    <string name="bottom_action_bar_slideshow_wallpaper">Slideshow Wallpaper</string>
-
-    <!-- Content description of apply button on the bottom action bar. [CHAR LIMIT=30] -->
-    <string name="bottom_action_bar_apply">Apply</string>
-
     <!-- The class name for the ScaleBehavior -->
     <string name="scalable_container_behavior" translatable="false">com.android.wallpaper.picker.ScaleBehavior</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 51fb1a8..3cf2dbc 100755
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -227,7 +227,6 @@
         <item name="android:textColor">@color/option_title_color</item>
         <item name="android:textAlignment">center</item>
         <item name="android:textSize">@dimen/option_title_font_text_size</item>
-        <item name="android:lineHeight">@dimen/option_title_line_height</item>
     </style>
 
 </resources>
diff --git a/src/com/android/wallpaper/asset/Asset.java b/src/com/android/wallpaper/asset/Asset.java
index 25313f8..80e2196 100755
--- a/src/com/android/wallpaper/asset/Asset.java
+++ b/src/com/android/wallpaper/asset/Asset.java
@@ -27,17 +27,11 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.TransitionDrawable;
 import android.os.AsyncTask;
-import android.view.Display;
 import android.view.View;
 import android.widget.ImageView;
 
 import androidx.annotation.Nullable;
 
-import com.android.wallpaper.module.BitmapCropper;
-import com.android.wallpaper.module.InjectorProvider;
-import com.android.wallpaper.util.ScreenSizeCalculator;
-import com.android.wallpaper.util.WallpaperCropUtils;
-
 import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
 
 /**
@@ -253,71 +247,6 @@
     }
 
     /**
-     * Loads the image for this asset into the provided ImageView which is used for the preview.
-     * While waiting for the image to load, first loads a ColorDrawable based on the provided
-     * placeholder color.
-     *
-     * @param activity         Activity hosting the ImageView.
-     * @param imageView        ImageView which is the target view of this asset.
-     * @param placeholderColor Color of placeholder set to ImageView while waiting for image to
-     *                         load.
-     */
-    public void loadPreviewImage(Activity activity, ImageView imageView, int placeholderColor) {
-        boolean needsTransition = imageView.getDrawable() == null;
-        Drawable placeholderDrawable = new ColorDrawable(placeholderColor);
-        if (needsTransition) {
-            imageView.setImageDrawable(placeholderDrawable);
-        }
-
-        decodeRawDimensions(activity, dimensions -> {
-            if (dimensions == null) {
-                loadDrawable(activity, imageView, placeholderColor);
-                return;
-            }
-
-            Display defaultDisplay = activity.getWindowManager().getDefaultDisplay();
-            Point screenSize = ScreenSizeCalculator.getInstance().getScreenSize(defaultDisplay);
-            Rect visibleRawWallpaperRect =
-                    WallpaperCropUtils.calculateVisibleRect(dimensions, screenSize);
-            adjustCropRect(activity, dimensions, visibleRawWallpaperRect);
-
-            BitmapCropper bitmapCropper = InjectorProvider.getInjector().getBitmapCropper();
-            bitmapCropper.cropAndScaleBitmap(this, /* scale= */ 1f, visibleRawWallpaperRect,
-                    new BitmapCropper.Callback() {
-                        @Override
-                        public void onBitmapCropped(Bitmap croppedBitmap) {
-                            // Since the size of the cropped bitmap may not exactly the same with
-                            // image view(maybe has 1px or 2px difference),
-                            // so set CENTER_CROP to let the bitmap to fit the image view.
-                            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
-                            if (!needsTransition) {
-                                imageView.setImageBitmap(croppedBitmap);
-                                return;
-                            }
-
-                            Resources resources = activity.getResources();
-
-                            Drawable[] layers = new Drawable[2];
-                            layers[0] = placeholderDrawable;
-                            layers[1] = new BitmapDrawable(resources, croppedBitmap);
-
-                            TransitionDrawable transitionDrawable = new TransitionDrawable(layers);
-                            transitionDrawable.setCrossFadeEnabled(true);
-
-                            imageView.setImageDrawable(transitionDrawable);
-                            transitionDrawable.startTransition(resources.getInteger(
-                                    android.R.integer.config_shortAnimTime));
-                        }
-
-                        @Override
-                        public void onError(@Nullable Throwable e) {
-
-                        }
-                    });
-        });
-    }
-
-    /**
      * Interface for receiving decoded Bitmaps.
      */
     public interface BitmapReceiver {
@@ -350,23 +279,6 @@
         void onDrawableLoaded();
     }
 
-    protected void adjustCropRect(Context context, Point assetDimensions, Rect cropRect) {
-        float centerX = cropRect.centerX();
-        float centerY = cropRect.centerY();
-        float width = cropRect.width();
-        float height = cropRect.height();
-        // TODO(b/154783188): Use the new system UI's API to get the maximum scale
-        //  when the API is available.
-        float systemWallpaperMaxScale = WallpaperCropUtils.getSystemWallpaperMaximumScale();
-
-        // Adjust the rect according to the system wallpaper's maximum scale.
-        int left = (int) (centerX - (width / 2) / systemWallpaperMaxScale);
-        int top = (int) (centerY - (height / 2) / systemWallpaperMaxScale);
-        int right = (int) (centerX + (width / 2) / systemWallpaperMaxScale);
-        int bottom = (int) (centerY + (height / 2) / systemWallpaperMaxScale);
-        cropRect.set(left, top, right, bottom);
-    }
-
     /**
      * Custom AsyncTask which returns a copy of the given bitmap which is center cropped and scaled
      * to fit in the given ImageView.
diff --git a/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java b/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java
index 89d4b9e..70c729e 100755
--- a/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java
+++ b/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java
@@ -17,17 +17,13 @@
 
 import android.app.WallpaperManager;
 import android.content.Context;
-import android.graphics.Point;
-import android.graphics.Rect;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.AutoCloseInputStream;
 import android.util.Log;
-import android.view.View;
 import android.widget.ImageView;
 
 import com.android.wallpaper.compat.WallpaperManagerCompat;
 import com.android.wallpaper.compat.WallpaperManagerCompat.WallpaperLocation;
-
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.Key;
 import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
@@ -99,20 +95,6 @@
                 .into(imageView);
     }
 
-    @Override
-    protected void adjustCropRect(Context context, Point assetDimensions, Rect cropRect) {
-        boolean isRtl = context.getResources().getConfiguration().getLayoutDirection()
-                == View.LAYOUT_DIRECTION_RTL;
-        if (isRtl) {
-            // Get the far right visible rect of source image
-            cropRect.offsetTo(assetDimensions.x - cropRect.width(), 0);
-        } else {
-            // Get the far left visible rect of source image
-            cropRect.offsetTo(0, 0);
-        }
-        super.adjustCropRect(context, assetDimensions, cropRect);
-    }
-
     public Key getKey() {
         return new CurrentWallpaperVNKey(mWallpaperManager, mWallpaperManagerFlag);
     }
diff --git a/src/com/android/wallpaper/module/DefaultWallpaperPersister.java b/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
index 60527d0..54393af 100755
--- a/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
+++ b/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
@@ -784,7 +784,6 @@
                     mWallpaper.getActionIconRes(mAppContext));
             mWallpaperPreferences.setLockWallpaperCollectionId(
                     mWallpaper.getCollectionId(mAppContext));
-            mWallpaperPreferences.setLockWallpaperRemoteId(mWallpaper.getWallpaperId());
 
             // Save the lock wallpaper image's hash code as well for the sake of backup & restore
             // because WallpaperManager-generated IDs are specific to a physical device and
diff --git a/src/com/android/wallpaper/module/DefaultWallpaperPreferences.java b/src/com/android/wallpaper/module/DefaultWallpaperPreferences.java
index eb2fc90..b040ebb 100755
--- a/src/com/android/wallpaper/module/DefaultWallpaperPreferences.java
+++ b/src/com/android/wallpaper/module/DefaultWallpaperPreferences.java
@@ -465,19 +465,6 @@
     }
 
     @Override
-    public String getLockWallpaperRemoteId() {
-        return mNoBackupPrefs.getString(
-                NoBackupKeys.KEY_LOCK_WALLPAPER_REMOTE_ID, null);
-    }
-
-    @Override
-    public void setLockWallpaperRemoteId(String wallpaperRemoteId) {
-        mNoBackupPrefs.edit().putString(
-                NoBackupKeys.KEY_LOCK_WALLPAPER_REMOTE_ID, wallpaperRemoteId)
-                .apply();
-    }
-
-    @Override
     public long getLockWallpaperHashCode() {
         return mSharedPrefs.getLong(WallpaperPreferenceKeys.KEY_LOCK_WALLPAPER_HASH_CODE, 0);
     }
diff --git a/src/com/android/wallpaper/module/WallpaperPreferenceKeys.java b/src/com/android/wallpaper/module/WallpaperPreferenceKeys.java
index 17e4789..e4c6588 100755
--- a/src/com/android/wallpaper/module/WallpaperPreferenceKeys.java
+++ b/src/com/android/wallpaper/module/WallpaperPreferenceKeys.java
@@ -49,7 +49,6 @@
         public static final String KEY_HOME_WALLPAPER_REMOTE_ID = "home_wallpaper_remote_id";
         public static final String KEY_HOME_WALLPAPER_BACKING_FILE = "home_wallpaper_backing_file";
         public static final String KEY_LOCK_WALLPAPER_MANAGER_ID = "lock_wallpaper_id";
-        public static final String KEY_LOCK_WALLPAPER_REMOTE_ID = "lock_wallpaper_remote_id";
         public static final String KEY_LOCK_WALLPAPER_BACKING_FILE = "lock_wallpaper_backing_file";
         public static final String KEY_DAILY_ROTATION_TIMESTAMPS = "daily_rotation_timestamps";
         public static final String KEY_DAILY_WALLPAPER_ENABLED_TIMESTAMP =
diff --git a/src/com/android/wallpaper/module/WallpaperPreferences.java b/src/com/android/wallpaper/module/WallpaperPreferences.java
index 8857ed4..f009f59 100755
--- a/src/com/android/wallpaper/module/WallpaperPreferences.java
+++ b/src/com/android/wallpaper/module/WallpaperPreferences.java
@@ -257,18 +257,6 @@
     void setLockWallpaperId(int lockWallpaperId);
 
     /**
-     * Gets the lock wallpaper's remote identifier.
-     */
-    String getLockWallpaperRemoteId();
-
-    /**
-     * Sets the lock wallpaper's remote identifier to SharedPreferences. This should be a string
-     * which uniquely identifies the currently set lock wallpaper in the context of a remote
-     * wallpaper collection.
-     */
-    void setLockWallpaperRemoteId(String wallpaperRemoteId);
-
-    /**
      * Persists the timestamp of a daily wallpaper rotation that just occurred.
      */
     void addDailyRotation(long timestamp);
diff --git a/src/com/android/wallpaper/picker/BottomActionBarFragment.java b/src/com/android/wallpaper/picker/BottomActionBarFragment.java
deleted file mode 100644
index bf3b997..0000000
--- a/src/com/android/wallpaper/picker/BottomActionBarFragment.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-
-import com.android.wallpaper.widget.BottomActionBar;
-import com.android.wallpaper.widget.BottomActionBar.BottomActionBarHost;
-
-/**
- * Base class for Fragments that own a {@link BottomActionBar} widget.
- *
- * A Fragment extending this class is expected to have a {@link BottomActionBar} in its activity
- * which is a {@link BottomActionBarHost}, which can handle lifecycle management of
- * {@link BottomActionBar} for extending fragment.
- */
-public class BottomActionBarFragment extends Fragment {
-
-    private BottomActionBar mBottomActionBar;
-
-    @Override
-    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-        Activity activity = getActivity();
-        if (activity instanceof BottomActionBarHost) {
-            mBottomActionBar = ((BottomActionBarHost) activity).getBottomActionBar();
-            mBottomActionBar.bindBackButtonToSystemBackKey(activity);
-            onBottomActionBarReady(mBottomActionBar);
-        }
-    }
-
-    @Override
-    public void onDestroyView() {
-        if (mBottomActionBar != null) {
-            mBottomActionBar.reset();
-            mBottomActionBar = null;
-        }
-        super.onDestroyView();
-    }
-
-    /** Returns {@code true} if the fragment would handle the event. */
-    public boolean onBackPressed() {
-        if (mBottomActionBar != null && mBottomActionBar.isVisible()) {
-            mBottomActionBar.hide();
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Gets called when {@link #onViewCreated} finished. For extending fragment, this is the only
-     * one interface to get {@link BottomActionBar}.
-     */
-    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {}
-}
diff --git a/src/com/android/wallpaper/picker/CategoryFragment.java b/src/com/android/wallpaper/picker/CategoryFragment.java
index 43f88fc..13ebef0 100755
--- a/src/com/android/wallpaper/picker/CategoryFragment.java
+++ b/src/com/android/wallpaper/picker/CategoryFragment.java
@@ -17,9 +17,6 @@
 
 import static android.view.View.MeasureSpec.EXACTLY;
 import static android.view.View.MeasureSpec.makeMeasureSpec;
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-
-import static com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED;
 
 import android.app.Activity;
 import android.app.ProgressDialog;
@@ -36,15 +33,12 @@
 import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
-import android.os.Message;
-import android.os.RemoteException;
 import android.provider.Settings;
 import android.service.wallpaper.WallpaperService;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.Display;
 import android.view.LayoutInflater;
-import android.view.Surface;
 import android.view.SurfaceControlViewHost;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
@@ -63,11 +57,11 @@
 import androidx.appcompat.app.AlertDialog;
 import androidx.cardview.widget.CardView;
 import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.viewpager.widget.PagerAdapter;
 import androidx.viewpager.widget.ViewPager;
 
+import com.android.systemui.shared.system.SurfaceViewRequestUtils;
 import com.android.wallpaper.R;
 import com.android.wallpaper.config.Flags;
 import com.android.wallpaper.model.Category;
@@ -79,7 +73,6 @@
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.LockWallpaperStatusChecker;
 import com.android.wallpaper.module.UserEventLogger;
-import com.android.wallpaper.module.WallpaperPersister;
 import com.android.wallpaper.module.WallpaperPreferences;
 import com.android.wallpaper.module.WallpaperPreferences.PresentationMode;
 import com.android.wallpaper.module.WallpaperRotationRefresher;
@@ -87,13 +80,10 @@
 import com.android.wallpaper.picker.CategorySelectorFragment.CategorySelectorFragmentHost;
 import com.android.wallpaper.picker.MyPhotosStarter.MyPhotosStarterProvider;
 import com.android.wallpaper.picker.MyPhotosStarter.PermissionChangedListener;
-import com.android.wallpaper.picker.individual.IndividualPickerFragment;
 import com.android.wallpaper.picker.individual.IndividualPickerFragment.ThumbnailUpdater;
-import com.android.wallpaper.picker.individual.IndividualPickerFragment.WallpaperDestinationCallback;
 import com.android.wallpaper.util.DisplayMetricsRetriever;
 import com.android.wallpaper.util.PreviewUtils;
 import com.android.wallpaper.util.ScreenSizeCalculator;
-import com.android.wallpaper.util.SurfaceViewUtils;
 import com.android.wallpaper.util.TileSizeCalculator;
 import com.android.wallpaper.util.WallpaperConnection;
 import com.android.wallpaper.util.WallpaperConnection.WallpaperConnectionListener;
@@ -111,12 +101,8 @@
 /**
  * Displays the Main UI for picking a category of wallpapers to choose from.
  */
-public class CategoryFragment extends AppbarFragment
-        implements CategorySelectorFragmentHost, ThumbnailUpdater, WallpaperDestinationCallback {
-
-    private final Rect mPreviewLocalRect = new Rect();
-    private final Rect mPreviewGlobalRect = new Rect();
-    private final int[] mLivePreviewLocation = new int[2];
+public class CategoryFragment extends ToolbarFragment
+        implements CategorySelectorFragmentHost, ThumbnailUpdater {
 
     /**
      * Interface to be implemented by an Activity hosting a {@link CategoryFragment}
@@ -132,7 +118,7 @@
 
     public static CategoryFragment newInstance(CharSequence title) {
         CategoryFragment fragment = new CategoryFragment();
-        fragment.setArguments(AppbarFragment.createArguments(title));
+        fragment.setArguments(ToolbarFragment.createArguments(title));
         return fragment;
     }
 
@@ -158,16 +144,13 @@
     private List<View> mWallPaperPreviews;
     private WallpaperConnection mWallpaperConnection;
     private CategorySelectorFragment mCategorySelectorFragment;
-    private IndividualPickerFragment mIndividualPickerFragment;
     private boolean mShowSelectedWallpaper;
-    private BottomSheetBehavior<View> mBottomSheetBehavior;
+    private BottomSheetBehavior mBottomSheetBehavior;
     private PreviewUtils mPreviewUtils;
-    private int mSelectedPreviewPage;
 
     // Home workspace surface is behind the app window, and so must the home image wallpaper like
     // the live wallpaper. This view is rendered on mWallpaperSurface for home image wallpaper.
     private ImageView mHomeImageWallpaper;
-    private boolean mIsCollapsingByUserSelecting;
 
     public CategoryFragment() {
         mCategorySelectorFragment = new CategorySelectorFragment();
@@ -217,10 +200,6 @@
 
             @Override
             public void onPageSelected(int i) {
-                mSelectedPreviewPage = i;
-                if (mIndividualPickerFragment != null && mIndividualPickerFragment.isVisible()) {
-                    mIndividualPickerFragment.highlightAppliedWallpaper(i);
-                }
             }
 
             @Override
@@ -231,42 +210,15 @@
 
         View fragmentContainer = view.findViewById(R.id.category_fragment_container);
         mBottomSheetBehavior = BottomSheetBehavior.from(fragmentContainer);
-        mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
-            @Override
-            public void onStateChanged(@NonNull View bottomSheet, int newState) {
-                if (mIsCollapsingByUserSelecting) {
-                    mIsCollapsingByUserSelecting = newState != STATE_COLLAPSED;
-                    return;
-                }
-
-                if (mIndividualPickerFragment != null && mIndividualPickerFragment.isVisible()) {
-                    mIndividualPickerFragment.resizeLayout(newState == STATE_COLLAPSED
-                            ? mBottomSheetBehavior.getPeekHeight() : MATCH_PARENT);
-                }
-            }
-
-            @Override
-            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
-
-            }
+        fragmentContainer.addOnLayoutChangeListener((containerView, left, top, right, bottom,
+                                                     oldLeft, oldTop, oldRight, oldBottom) -> {
+            int minimumHeight = containerView.getHeight() - mPreviewPager.getMeasuredHeight();
+            mBottomSheetBehavior.setPeekHeight(minimumHeight);
+            containerView.setMinimumHeight(minimumHeight);
+            ((CardView) mHomePreview.getParent())
+                    .setRadius(TileSizeCalculator.getPreviewCornerRadius(
+                            getActivity(), homePreviewCard.getMeasuredWidth()));
         });
-        fragmentContainer.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-            @Override
-            public void onLayoutChange(View containerView, int left, int top, int right,
-                    int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                int minimumHeight = containerView.getHeight() - mPreviewPager.getMeasuredHeight();
-                mBottomSheetBehavior.setPeekHeight(minimumHeight);
-                containerView.setMinimumHeight(minimumHeight);
-                ((CardView) mHomePreview.getParent())
-                        .setRadius(TileSizeCalculator.getPreviewCornerRadius(
-                                getActivity(), homePreviewCard.getMeasuredWidth()));
-                if (mLockscreenPreview != null) {
-                    ((CardView) mLockscreenPreview.getParent())
-                            .setRadius(TileSizeCalculator.getPreviewCornerRadius(
-                                    getActivity(), mLockscreenPreview.getMeasuredWidth()));
-                }
-                fragmentContainer.removeOnLayoutChangeListener(this);
-            }});
 
         mPreviewUtils = new PreviewUtils(getContext(),
                 getString(R.string.grid_control_metadata_name));
@@ -323,7 +275,6 @@
     @Override
     public void onDestroyView() {
         super.onDestroyView();
-        LiveTileOverlay.INSTANCE.detach(mHomePreview.getOverlay());
         if (mWallpaperConnection != null) {
             mWallpaperConnection.disconnect();
             mWallpaperConnection = null;
@@ -356,24 +307,10 @@
 
     @Override
     public void show(String collectionId) {
-        mIndividualPickerFragment =
-                InjectorProvider.getInjector().getIndividualPickerFragment(collectionId);
-        mIndividualPickerFragment.highlightAppliedWallpaper(mSelectedPreviewPage);
-        mIndividualPickerFragment.setOnWallpaperSelectedListener(position -> {
-            // Scroll to the selected wallpaper and collapse the sheet if needed.
-            // Resize and scroll here because we want to let the RecyclerView's scrolling and
-            // BottomSheet's collapsing can be executed together instead of scrolling
-            // the RecyclerView after the BottomSheet is collapsed.
-            mIndividualPickerFragment.resizeLayout(mBottomSheetBehavior.getPeekHeight());
-            mIndividualPickerFragment.scrollToPosition(position);
-            if (mBottomSheetBehavior.getState() != STATE_COLLAPSED) {
-                mIsCollapsingByUserSelecting = true;
-                mBottomSheetBehavior.setState(STATE_COLLAPSED);
-            }
-        });
         getChildFragmentManager()
                 .beginTransaction()
-                .replace(R.id.category_fragment_container, mIndividualPickerFragment)
+                .replace(R.id.category_fragment_container,
+                        InjectorProvider.getInjector().getIndividualPickerFragment(collectionId))
                 .addToBackStack(null)
                 .commit();
         getChildFragmentManager().executePendingTransactions();
@@ -391,6 +328,7 @@
             updateThumbnail(wallpaperInfo, mHomePreview, true);
             updateThumbnail(wallpaperInfo, mLockscreenPreview, false);
             mShowSelectedWallpaper = true;
+            mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
         });
     }
 
@@ -400,25 +338,6 @@
         mShowSelectedWallpaper = false;
     }
 
-    @Override
-    public void onDestinationSet(@WallpaperPersister.Destination int destination) {
-        if (destination == WallpaperPersister.DEST_BOTH) {
-            return;
-        }
-        mPreviewPager.switchPreviewPage(destination);
-    }
-
-    @Override
-    public boolean onBackPressed() {
-        Fragment childFragment = getChildFragmentManager().findFragmentById(
-                R.id.category_fragment_container);
-        if (childFragment instanceof BottomActionBarFragment
-                && ((BottomActionBarFragment) childFragment).onBackPressed()) {
-            return true;
-        }
-        return false;
-    }
-
     /**
      * Pops the child fragment from the stack if {@link CategoryFragment} is visible to the users.
      *
@@ -606,12 +525,10 @@
                     previewView.getBottom());
         }
 
-        previewView.getLocationOnScreen(mLivePreviewLocation);
-        mPreviewGlobalRect.set(0, 0, previewView.getMeasuredWidth(),
-                previewView.getMeasuredHeight());
-        mPreviewLocalRect.set(mPreviewGlobalRect);
-        mPreviewGlobalRect.offset(mLivePreviewLocation[0], mLivePreviewLocation[1]);
-
+        Rect previewLocalRect = new Rect();
+        Rect previewGlobalRect = new Rect();
+        previewView.getLocalVisibleRect(previewLocalRect);
+        previewView.getGlobalVisibleRect(previewGlobalRect);
         mWallpaperConnection = new WallpaperConnection(
                 getWallpaperIntent(homeWallpaper.getWallpaperComponent()), activity,
                 new WallpaperConnectionListener() {
@@ -624,20 +541,21 @@
                         LiveTileOverlay.INSTANCE.setForegroundDrawable(placeholder);
                         LiveTileOverlay.INSTANCE.attach(previewView.getOverlay());
                         previewView.animate()
-                                .setStartDelay(50)
-                                .setDuration(200)
+                                .setStartDelay(400)
+                                .setDuration(400)
                                 .setInterpolator(AnimationUtils.loadInterpolator(getContext(),
                                         android.R.interpolator.fast_out_linear_in))
                                 .setUpdateListener(value -> placeholder.setAlpha(
                                         (int) (MAX_ALPHA * (1 - value.getAnimatedFraction()))))
                                 .withEndAction(() -> {
                                     LiveTileOverlay.INSTANCE.setForegroundDrawable(null);
+
                                 }).start();
 
                     }
-                }, mPreviewGlobalRect);
+                }, previewGlobalRect);
 
-        LiveTileOverlay.INSTANCE.update(new RectF(mPreviewLocalRect),
+        LiveTileOverlay.INSTANCE.update(new RectF(previewLocalRect),
                 ((CardView) previewView.getParent()).getRadius());
 
         mWallpaperConnection.setVisibility(true);
@@ -750,15 +668,12 @@
         boolean renderInImageWallpaperSurface =
                 !(wallpaperInfo instanceof LiveWallpaperInfo) && isHomeWallpaper;
         wallpaperInfo.getThumbAsset(activity.getApplicationContext())
-                .loadPreviewImage(activity,
+                .loadDrawable(activity,
                         renderInImageWallpaperSurface ? mHomeImageWallpaper : thumbnailView,
                         getResources().getColor(R.color.secondary_color));
         if (isHomeWallpaper) {
             LiveTileOverlay.INSTANCE.detach(thumbnailView.getOverlay());
             if (wallpaperInfo instanceof LiveWallpaperInfo) {
-                wallpaperInfo.getThumbAsset(activity.getApplicationContext()).loadPreviewImage(
-                        activity, mHomeImageWallpaper,
-                        getResources().getColor(R.color.secondary_color));
                 setUpLiveWallpaperPreview(wallpaperInfo, thumbnailView,
                         new ColorDrawable(getResources().getColor(
                                 R.color.secondary_color, activity.getTheme())));
@@ -786,12 +701,9 @@
 
     private final SurfaceHolder.Callback mWallpaperSurfaceCallback = new SurfaceHolder.Callback() {
 
-        private Surface mLastSurface;
-
         @Override
-        public void surfaceCreated(SurfaceHolder holder) {
-            if (mLastSurface != holder.getSurface()) {
-                mLastSurface = holder.getSurface();
+        public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
+            if (mHomeImageWallpaper == null) {
                 mHomeImageWallpaper = new ImageView(getContext());
                 mHomeImageWallpaper.setBackgroundColor(
                         ContextCompat.getColor(getContext(), R.color.primary_color));
@@ -808,48 +720,30 @@
         }
 
         @Override
+        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+        }
+
+        @Override
+        public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
+        }
+    };
+
+    private final SurfaceHolder.Callback mWorkspaceSurfaceCallback = new SurfaceHolder.Callback() {
+        @Override
+        public void surfaceCreated(SurfaceHolder holder) {
+            Bundle bundle = SurfaceViewRequestUtils.createSurfaceBundle(mWorkspaceSurface);
+            if (mPreviewUtils.supportsPreview()) {
+                mPreviewUtils.renderPreview(bundle);
+            }
+        }
+
+        @Override
         public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
 
         @Override
         public void surfaceDestroyed(SurfaceHolder holder) { }
     };
 
-    private final SurfaceHolder.Callback mWorkspaceSurfaceCallback = new SurfaceHolder.Callback() {
-
-        private Surface mLastSurface;
-        private Message mCallback;
-
-        @Override
-        public void surfaceCreated(SurfaceHolder holder) {
-            if (mPreviewUtils.supportsPreview() && mLastSurface != holder.getSurface()) {
-                mLastSurface = holder.getSurface();
-                Bundle result = mPreviewUtils.renderPreview(
-                        SurfaceViewUtils.createSurfaceViewRequest(mWorkspaceSurface));
-                if (result != null) {
-                    mWorkspaceSurface.setChildSurfacePackage(
-                            SurfaceViewUtils.getSurfacePackage(result));
-                    mCallback = SurfaceViewUtils.getCallback(result);
-                }
-            }
-        }
-
-        @Override
-        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
-
-        @Override
-        public void surfaceDestroyed(SurfaceHolder holder) {
-            if (mCallback != null) {
-                try {
-                    mCallback.replyTo.send(mCallback);
-                } catch (RemoteException e) {
-                    e.printStackTrace();
-                } finally {
-                    mCallback = null;
-                }
-            }
-        }
-    };
-
     private interface MetadataHolder {
         /**
          * Binds {@link WallpaperInfo} objects representing the currently-set wallpapers to the
diff --git a/src/com/android/wallpaper/picker/LivePreviewFragment.java b/src/com/android/wallpaper/picker/LivePreviewFragment.java
index 6e2c1ba..0a3003d 100644
--- a/src/com/android/wallpaper/picker/LivePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/LivePreviewFragment.java
@@ -71,11 +71,11 @@
 public class LivePreviewFragment extends PreviewFragment implements
         WallpaperConnection.WallpaperConnectionListener {
 
-    public static final String EXTRA_LIVE_WALLPAPER_INFO = "android.live_wallpaper.info";
-    public static final String KEY_ACTION_DELETE_LIVE_WALLPAPER = "action_delete_live_wallpaper";
-
     private static final String TAG = "LivePreviewFragment";
 
+    private static final String KEY_ACTION_DELETE_LIVE_WALLPAPER = "action_delete_live_wallpaper";
+    private static final String EXTRA_LIVE_WALLPAPER_INFO = "android.live_wallpaper.info";
+
     /**
      * Instance of {@link WallpaperConnection} used to bind to the live wallpaper service to show
      * it in this preview fragment.
diff --git a/src/com/android/wallpaper/picker/AppbarFragment.java b/src/com/android/wallpaper/picker/ToolbarFragment.java
similarity index 93%
rename from src/com/android/wallpaper/picker/AppbarFragment.java
rename to src/com/android/wallpaper/picker/ToolbarFragment.java
index 0729d16..488d49e 100644
--- a/src/com/android/wallpaper/picker/AppbarFragment.java
+++ b/src/com/android/wallpaper/picker/ToolbarFragment.java
@@ -24,13 +24,12 @@
 import androidx.annotation.MenuRes;
 import androidx.appcompat.widget.Toolbar;
 import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener;
+import androidx.fragment.app.Fragment;
 
 import com.android.wallpaper.R;
-import com.android.wallpaper.widget.BottomActionBar;
 
 /**
- * Base class for Fragments that own a {@link Toolbar} widget and a {@link BottomActionBar}.
- *
+ * Base class for Fragments that own a {@link Toolbar} widget.
  * A Fragment extending this class is expected to have a {@link Toolbar} in its root view, with id
  * {@link R.id#toolbar}, which can optionally have a TextView with id custom_toolbar_title for
  * the title.
@@ -40,10 +39,8 @@
  * used as title.
  *
  * @see #setArguments(Bundle)
- * @see BottomActionBarFragment
  */
-public abstract class AppbarFragment extends BottomActionBarFragment
-        implements OnMenuItemClickListener {
+public abstract class ToolbarFragment extends Fragment implements OnMenuItemClickListener {
 
     private static final String ARG_TITLE = "ToolbarFragment.title";
 
diff --git a/src/com/android/wallpaper/picker/TopLevelPickerActivity.java b/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
index b513dc2..1d0d8f0 100755
--- a/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
+++ b/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
@@ -79,8 +79,6 @@
 import com.android.wallpaper.picker.individual.IndividualPickerFragment;
 import com.android.wallpaper.util.ScreenSizeCalculator;
 import com.android.wallpaper.util.ThrowableAnalyzer;
-import com.android.wallpaper.widget.BottomActionBar;
-import com.android.wallpaper.widget.BottomActionBar.BottomActionBarHost;
 
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
 import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback;
@@ -95,7 +93,7 @@
  */
 public class TopLevelPickerActivity extends BaseActivity implements WallpapersUiContainer,
         CurrentWallpaperBottomSheetPresenter, SetWallpaperErrorDialogFragment.Listener,
-        MyPhotosStarter, CategoryFragmentHost, BottomActionBarHost {
+        MyPhotosStarter, CategoryFragmentHost {
 
     private static final String TAG_SET_WALLPAPER_ERROR_DIALOG_FRAGMENT =
             "toplevel_set_wallpaper_error_dialog";
@@ -1097,11 +1095,6 @@
         }
     }
 
-    @Override
-    public BottomActionBar getBottomActionBar() {
-        return findViewById(R.id.bottom_actionbar);
-    }
-
     private interface AssetReceiver {
         void onAssetReceived(Asset asset);
     }
diff --git a/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java b/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
index 1a790dd..5f8436d 100644
--- a/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
+++ b/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
@@ -449,7 +449,6 @@
                 // image.
                 ImageWallpaperInfo imageWallpaper = new ImageWallpaperInfo(imageUri);
 
-                mWallpaperPersister.setWallpaperInfoInPreview(imageWallpaper);
                 imageWallpaper.showPreview(mActivity, getPreviewIntentFactory(),
                         PREVIEW_WALLPAPER_REQUEST_CODE);
                 return false;
diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java b/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java
index 57d16de..beb8a75 100755
--- a/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java
+++ b/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java
@@ -50,14 +50,12 @@
 import com.android.wallpaper.picker.BaseActivity;
 import com.android.wallpaper.picker.PreviewActivity.PreviewActivityIntentFactory;
 import com.android.wallpaper.util.DiskBasedLogger;
-import com.android.wallpaper.widget.BottomActionBar;
-import com.android.wallpaper.widget.BottomActionBar.BottomActionBarHost;
 
 /**
  * Activity that can be launched from the Android wallpaper picker and allows users to pick from
  * various wallpapers and enter a preview mode for specific ones.
  */
-public class IndividualPickerActivity extends BaseActivity implements BottomActionBarHost {
+public class IndividualPickerActivity extends BaseActivity {
     private static final String TAG = "IndividualPickerAct";
     private static final String EXTRA_CATEGORY_COLLECTION_ID =
             "com.android.wallpaper.category_collection_id";
@@ -260,11 +258,6 @@
         bundle.putString(KEY_CATEGORY_COLLECTION_ID, mCategoryCollectionId);
     }
 
-    @Override
-    public BottomActionBar getBottomActionBar() {
-        return findViewById(R.id.bottom_actionbar);
-    }
-
     /**
      * Default implementation of intent factory that provides an intent to start an
      * IndividualPickerActivity.
diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
index 58cb84f..4392ca8 100755
--- a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
+++ b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
@@ -16,12 +16,12 @@
 package com.android.wallpaper.picker.individual;
 
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.APPLY;
+import static com.android.wallpaper.widget.BottomActionBar.BottomAction.CANCEL;
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.INFORMATION;
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.ROTATION;
 
 import android.app.Activity;
 import android.app.ProgressDialog;
-import android.app.WallpaperManager;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources.NotFoundException;
@@ -45,6 +45,7 @@
 import androidx.annotation.Nullable;
 import androidx.cardview.widget.CardView;
 import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerView.OnScrollListener;
@@ -76,7 +77,6 @@
 import com.android.wallpaper.module.WallpaperPreferences;
 import com.android.wallpaper.module.WallpaperSetter;
 import com.android.wallpaper.picker.BaseActivity;
-import com.android.wallpaper.picker.BottomActionBarFragment;
 import com.android.wallpaper.picker.CurrentWallpaperBottomSheetPresenter;
 import com.android.wallpaper.picker.MyPhotosStarter.MyPhotosStarterProvider;
 import com.android.wallpaper.picker.RotationStarter;
@@ -95,14 +95,14 @@
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.EnumSet;
 import java.util.List;
-import java.util.Optional;
 import java.util.Random;
 
 /**
  * Displays the Main UI for picking an individual wallpaper image.
  */
-public class IndividualPickerFragment extends BottomActionBarFragment
+public class IndividualPickerFragment extends Fragment
         implements RotationStarter, StartRotationErrorDialogFragment.Listener,
         CurrentWallpaperBottomSheetPresenter.RefreshListener,
         SetWallpaperErrorDialogFragment.Listener, SetWallpaperDialogFragment.Listener {
@@ -112,10 +112,6 @@
      */
     static final int SPECIAL_FIXED_TILE_ADAPTER_POSITION = 0;
     static final String ARG_CATEGORY_COLLECTION_ID = "category_collection_id";
-    /**
-     * A temporary flag to hide the bottom action bar feature.
-     */
-    static final boolean TEMP_BOTTOM_ACTION_BAR_FEATURE = true;
 
     private static final String TAG = "IndividualPickerFrgmnt";
     private static final int UNUSED_REQUEST_CODE = 1;
@@ -128,6 +124,11 @@
     private static final String KEY_NIGHT_MODE = "IndividualPickerFragment.NIGHT_MODE";
 
     /**
+     * A temporary flag to hide the bottom action bar feature.
+     */
+    private static final boolean TEMP_BOTTOM_ACTION_BAR_FEATURE = false;
+
+    /**
      * An interface for updating the thumbnail with the specific wallpaper.
      */
     public interface ThumbnailUpdater {
@@ -142,31 +143,6 @@
         void restoreThumbnails();
     }
 
-    /**
-     * An interface for receiving the destination of the new applied wallpaper.
-     */
-    public interface WallpaperDestinationCallback {
-        /**
-         * Called when the destination of the wallpaper is set.
-         *
-         * @param destination the destination which a wallpaper may be set.
-         *                    See {@link Destination} for more details.
-         */
-        void onDestinationSet(@Destination int destination);
-    }
-
-    /**
-     * The listener which will be notified when the wallpaper is selected.
-     */
-    public interface WallpaperSelectedListener {
-        /**
-         * Called when the wallpaper is selected.
-         *
-         * @param position the position of the selected wallpaper
-         */
-        void onWallpaperSelected(int position);
-    }
-
     WallpaperPreferences mWallpaperPreferences;
     WallpaperChangedNotifier mWallpaperChangedNotifier;
     RecyclerView mImageGrid;
@@ -206,8 +182,6 @@
         }
     };
     PackageStatusNotifier.Listener mAppStatusListener;
-    BottomActionBar mBottomActionBar;
-    @Nullable WallpaperInfo mSelectedWallpaperInfo;
 
     private ProgressDialog mProgressDialog;
     private boolean mTestingMode;
@@ -251,12 +225,11 @@
         }
     };
 
+    private BottomActionBar mBottomActionBar;
     private WallpaperSetter mWallpaperSetter;
     private WallpaperPersister mWallpaperPersister;
+    @Nullable private WallpaperInfo mSelectedWallpaperInfo;
     private WallpaperInfo mAppliedWallpaperInfo;
-    private WallpaperManager mWallpaperManager;
-    private int mWallpaperDestination;
-    private WallpaperSelectedListener mWallpaperSelectedListener;
 
     public static IndividualPickerFragment newInstance(String collectionId) {
         Bundle args = new Bundle();
@@ -267,21 +240,6 @@
         return fragment;
     }
 
-    /**
-     * Highlights the applied wallpaper (if it exists) according to the destination a wallpaper
-     * would be set.
-     *
-     * @param wallpaperDestination the destination a wallpaper would be set.
-     *                             It will be either {@link Destination#DEST_HOME_SCREEN}
-     *                             or {@link Destination#DEST_LOCK_SCREEN}.
-     */
-    public void highlightAppliedWallpaper(@Destination int wallpaperDestination) {
-        mWallpaperDestination = wallpaperDestination;
-        if (mWallpapers != null) {
-            refreshAppliedWallpaper();
-        }
-    }
-
     private static int getResIdForRotationState(@RotationInitializationState int rotationState) {
         switch (rotationState) {
             case WallpaperRotationInitializer.ROTATION_NOT_INITIALIZED:
@@ -326,8 +284,6 @@
         mWallpaperChangedNotifier = WallpaperChangedNotifier.getInstance();
         mWallpaperChangedNotifier.registerListener(mWallpaperChangedListener);
 
-        mWallpaperManager = WallpaperManager.getInstance(appContext);
-
         mFormFactor = injector.getFormFactorChecker(appContext).getFormFactor();
 
         mPackageStatusNotifier = injector.getPackageStatusNotifier(appContext);
@@ -447,13 +403,44 @@
                 getResources().getDimensionPixelSize(R.dimen.grid_padding)));
 
         maybeSetUpImageGrid();
+
         setUpBottomSheet();
+
+        if (TEMP_BOTTOM_ACTION_BAR_FEATURE) {
+            mBottomActionBar = getActivity().findViewById(R.id.bottom_actionbar);
+
+            mBottomActionBar.setActionClickListener(CANCEL, unused -> {
+                if (mSelectedWallpaperInfo != null) {
+                    onWallpaperSelected(null);
+                    return;
+                }
+                getActivity().onBackPressed();
+            });
+            mBottomActionBar.setActionClickListener(ROTATION, unused -> {
+                DialogFragment startRotationDialogFragment = new StartRotationDialogFragment();
+                startRotationDialogFragment.setTargetFragment(
+                        IndividualPickerFragment.this, UNUSED_REQUEST_CODE);
+                startRotationDialogFragment.show(getFragmentManager(), TAG_START_ROTATION_DIALOG);
+            });
+            mBottomActionBar.setActionClickListener(APPLY, unused -> {
+                mBottomActionBar.disableActions();
+                mWallpaperSetter.requestDestination(getActivity(), getFragmentManager(), this,
+                        mSelectedWallpaperInfo instanceof LiveWallpaperInfo);
+            });
+
+            mBottomActionBar.show();
+            mBottomActionBar.showActionsOnly(
+                    isRotationEnabled() ? EnumSet.of(CANCEL, ROTATION) : EnumSet.of(CANCEL));
+        }
+
         return view;
     }
 
     @Override
     public void onDestroyView() {
         if (TEMP_BOTTOM_ACTION_BAR_FEATURE) {
+            mBottomActionBar.hide();
+            mBottomActionBar.clearActionClickListeners();
             updateThumbnail(null);
         }
         super.onDestroyView();
@@ -532,28 +519,6 @@
     }
 
     @Override
-    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
-        if (TEMP_BOTTOM_ACTION_BAR_FEATURE) {
-            mBottomActionBar = bottomActionBar;
-            if (isRotationEnabled()) {
-                mBottomActionBar.showActionsOnly(ROTATION);
-            }
-            mBottomActionBar.setActionClickListener(ROTATION, unused -> {
-                DialogFragment startRotationDialogFragment = new StartRotationDialogFragment();
-                startRotationDialogFragment.setTargetFragment(
-                        IndividualPickerFragment.this, UNUSED_REQUEST_CODE);
-                startRotationDialogFragment.show(getFragmentManager(), TAG_START_ROTATION_DIALOG);
-            });
-            mBottomActionBar.setActionClickListener(APPLY, unused -> {
-                mBottomActionBar.disableActions();
-                mWallpaperSetter.requestDestination(getActivity(), getFragmentManager(), this,
-                        mSelectedWallpaperInfo instanceof LiveWallpaperInfo);
-            });
-            mBottomActionBar.show();
-        }
-    }
-
-    @Override
     public void onResume() {
         super.onResume();
 
@@ -603,6 +568,7 @@
                 }
             }
         }
+
     }
 
     @Override
@@ -629,15 +595,6 @@
         startRotation(networkPreference);
     }
 
-    @Override
-    public boolean onBackPressed() {
-        if (mSelectedWallpaperInfo != null) {
-            onWallpaperSelected(null, 0);
-            return true;
-        }
-        return false;
-    }
-
     public void setCurrentWallpaperBottomSheetPresenter(
             CurrentWallpaperBottomSheetPresenter presenter) {
         mCurrentWallpaperBottomSheetPresenter = presenter;
@@ -647,29 +604,6 @@
         mWallpapersUiContainer = uiContainer;
     }
 
-    public void setOnWallpaperSelectedListener(
-            WallpaperSelectedListener wallpaperSelectedListener) {
-        mWallpaperSelectedListener = wallpaperSelectedListener;
-    }
-
-    /**
-     * Resizes the layout's height.
-     */
-    public void resizeLayout(int height) {
-        mImageGrid.getLayoutParams().height = height;
-        mImageGrid.requestLayout();
-    }
-
-    /**
-     * Scrolls to the specific item.
-     *
-     * @param position the position of the item
-     */
-    public void scrollToPosition(int position) {
-        ((GridLayoutManager) mImageGrid.getLayoutManager())
-                .scrollToPositionWithOffset(position, /* offset= */ 0);
-    }
-
     /**
      * Enable a test mode of operation -- in which certain UI features are disabled to allow for
      * UI tests to run correctly. Works around issue in ProgressDialog currently where the dialog
@@ -850,17 +784,17 @@
             mWallpaperSetter.setCurrentWallpaper(
                     getActivity(), mSelectedWallpaperInfo, destination, mSetWallpaperCallback);
         }
-        onWallpaperDestinationSet(destination);
     }
 
     private WallpaperPersister.SetWallpaperCallback mSetWallpaperCallback =
             new WallpaperPersister.SetWallpaperCallback() {
                 @Override
                 public void onSuccess(WallpaperInfo wallpaperInfo) {
-                    Toast.makeText(getActivity(), R.string.wallpaper_set_successfully_message,
-                            Toast.LENGTH_SHORT).show();
+                    // TODO(b/150913705): Show the snack bar.
                     mBottomActionBar.enableActions();
-                    refreshAppliedWallpaper();
+                    updateAppliedStatus(mAppliedWallpaperInfo, false);
+                    updateAppliedStatus(wallpaperInfo, true);
+                    mAppliedWallpaperInfo = wallpaperInfo;
 
                     mWallpaperPersister.onLiveWallpaperSet();
                 }
@@ -894,12 +828,11 @@
         }
     }
 
-    void updateBottomActions(boolean hasWallpaperSelected) {
-        if (hasWallpaperSelected) {
-            mBottomActionBar.showActionsOnly(INFORMATION, APPLY);
-        } else {
-            mBottomActionBar.showActionsOnly(ROTATION);
-        }
+    private void updateBottomActions(boolean hasWallpaperSelected) {
+        mBottomActionBar.showActions(
+                hasWallpaperSelected ? EnumSet.of(APPLY, INFORMATION) : EnumSet.of(ROTATION));
+        mBottomActionBar.hideActions(
+                hasWallpaperSelected ? EnumSet.of(ROTATION) : EnumSet.of(APPLY, INFORMATION));
     }
 
     private void updateThumbnail(WallpaperInfo selectedWallpaperInfo) {
@@ -915,18 +848,7 @@
         }
     }
 
-    private void onWallpaperDestinationSet(int destination) {
-        WallpaperDestinationCallback wallpaperDestinationCallback =
-                (WallpaperDestinationCallback) getParentFragment();
-        if (wallpaperDestinationCallback == null) {
-            return;
-        }
-
-        wallpaperDestinationCallback.onDestinationSet(destination);
-    }
-
-    void onWallpaperSelected(@Nullable WallpaperInfo newSelectedWallpaperInfo,
-                                     int position) {
+    private void onWallpaperSelected(@Nullable WallpaperInfo newSelectedWallpaperInfo) {
         if (mSelectedWallpaperInfo == newSelectedWallpaperInfo) {
             return;
         }
@@ -943,12 +865,8 @@
         // Populate wallpaper info to bottom sheet page.
         if (mSelectedWallpaperInfo != null) {
             mBottomActionBar.populateInfoPage(
-                    mSelectedWallpaperInfo.getAttributions(getContext()),
-                    shouldShowMetadataInPreview(mSelectedWallpaperInfo));
-        }
-
-        if (mWallpaperSelectedListener != null) {
-            mWallpaperSelectedListener.onWallpaperSelected(position);
+                mSelectedWallpaperInfo.getAttributions(getContext()),
+                shouldShowMetadataInPreview(mSelectedWallpaperInfo));
         }
     }
 
@@ -990,45 +908,6 @@
         return wallpaperComponent == null || wallpaperComponent.getShowMetadataInPreview();
     }
 
-    private void refreshAppliedWallpaper() {
-        // Clear the check mark and blue border(if it shows) of the old applied wallpaper.
-        showCheckMarkAndBorderForAppliedWallpaper(false);
-
-        // Update to the new applied wallpaper.
-        String appliedWallpaperId = getAppliedWallpaperId();
-        Optional<WallpaperInfo> wallpaperInfoOptional = mWallpapers
-                .stream()
-                .filter(wallpaper -> wallpaper.getWallpaperId() != null)
-                .filter(wallpaper -> wallpaper.getWallpaperId().equals(appliedWallpaperId))
-                .findFirst();
-        mAppliedWallpaperInfo = wallpaperInfoOptional.orElse(null);
-
-        // Set the check mark and blue border(if user doesn't select) of the new applied wallpaper.
-        showCheckMarkAndBorderForAppliedWallpaper(true);
-    }
-
-    private String getAppliedWallpaperId() {
-        WallpaperPreferences prefs =
-                InjectorProvider.getInjector().getPreferences(getContext());
-        android.app.WallpaperInfo wallpaperInfo = mWallpaperManager.getWallpaperInfo();
-        boolean isDestinationBoth =
-                mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK) < 0;
-
-        if (isDestinationBoth || mWallpaperDestination == WallpaperPersister.DEST_HOME_SCREEN) {
-            return wallpaperInfo != null
-                    ? wallpaperInfo.getServiceName() : prefs.getHomeWallpaperRemoteId();
-        } else {
-            return prefs.getLockWallpaperRemoteId();
-        }
-    }
-
-    private void showCheckMarkAndBorderForAppliedWallpaper(boolean show) {
-        updateAppliedStatus(mAppliedWallpaperInfo, show);
-        if (mSelectedWallpaperInfo == null) {
-            updateActivatedStatus(mAppliedWallpaperInfo, show);
-        }
-    }
-
     /**
      * ViewHolder subclass for "daily refresh" tile in the RecyclerView, only shown if rotation is
      * enabled for this category.
@@ -1360,7 +1239,8 @@
                     ? position - 1 : position;
             WallpaperInfo wallpaper = mWallpapers.get(wallpaperIndex);
             ((IndividualHolder) holder).bindWallpaper(wallpaper);
-            String appliedWallpaperId = getAppliedWallpaperId();
+            WallpaperPreferences prefs = InjectorProvider.getInjector().getPreferences(getContext());
+            String appliedWallpaperId = prefs.getHomeWallpaperRemoteId();
             boolean isWallpaperApplied = wallpaper.getWallpaperId().equals(appliedWallpaperId);
             boolean isWallpaperSelected = wallpaper.equals(mSelectedWallpaperInfo);
             boolean hasUserSelectedWallpaper = mSelectedWallpaperInfo != null;
@@ -1376,7 +1256,7 @@
                 holder.itemView.findViewById(R.id.check_circle).setVisibility(
                         isWallpaperApplied ? View.VISIBLE : View.GONE);
                 holder.itemView.findViewById(R.id.tile).setOnClickListener(
-                        view -> onWallpaperSelected(wallpaper, position));
+                        view -> onWallpaperSelected(wallpaper));
             }
         }
     }
diff --git a/src/com/android/wallpaper/util/PreviewUtils.java b/src/com/android/wallpaper/util/PreviewUtils.java
index 5b1d857..14b9cde 100644
--- a/src/com/android/wallpaper/util/PreviewUtils.java
+++ b/src/com/android/wallpaper/util/PreviewUtils.java
@@ -52,9 +52,8 @@
     }
 
     /** Render preview under the current grid option. */
-    public Bundle renderPreview(Bundle bundle) {
-        return mContext.getContentResolver().call(getUri(PREVIEW), METHOD_GET_PREVIEW, null,
-                bundle);
+    public void renderPreview(Bundle bundle) {
+        mContext.getContentResolver().call(getUri(PREVIEW), METHOD_GET_PREVIEW, null, bundle);
     }
 
     /** Easy way to generate a Uri with the provider info from this class. */
diff --git a/src/com/android/wallpaper/util/SurfaceViewUtils.java b/src/com/android/wallpaper/util/SurfaceViewUtils.java
deleted file mode 100644
index 1656b1b..0000000
--- a/src/com/android/wallpaper/util/SurfaceViewUtils.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.util;
-
-import android.os.Bundle;
-import android.os.Message;
-import android.view.SurfaceControlViewHost;
-import android.view.SurfaceView;
-
-/** Util class to generate surface view requests and parse responses */
-public class SurfaceViewUtils {
-
-    private static final String KEY_HOST_TOKEN = "host_token";
-    private static final String KEY_VIEW_WIDTH = "width";
-    private static final String KEY_VIEW_HEIGHT = "height";
-    private static final String KEY_DISPLAY_ID = "display_id";
-    private static final String KEY_SURFACE_PACKAGE = "surface_package";
-    private static final String KEY_CALLBACK = "callback";
-
-    /** Create a surface view request. */
-    public static Bundle createSurfaceViewRequest(SurfaceView surfaceView) {
-        Bundle bundle = new Bundle();
-        bundle.putBinder(KEY_HOST_TOKEN, surfaceView.getHostToken());
-        bundle.putInt(KEY_DISPLAY_ID, surfaceView.getDisplay().getDisplayId());
-        bundle.putInt(KEY_VIEW_WIDTH, surfaceView.getWidth());
-        bundle.putInt(KEY_VIEW_HEIGHT, surfaceView.getHeight());
-        return bundle;
-    }
-
-    /** Return the surface package. */
-    public static SurfaceControlViewHost.SurfacePackage getSurfacePackage(Bundle bundle) {
-        return bundle.getParcelable(KEY_SURFACE_PACKAGE);
-    }
-
-    /** Return the message callback. */
-    public static Message getCallback(Bundle bundle) {
-        return bundle.getParcelable(KEY_CALLBACK);
-    }
-}
diff --git a/src/com/android/wallpaper/util/WallpaperConnection.java b/src/com/android/wallpaper/util/WallpaperConnection.java
index b8c02de..ed12095 100644
--- a/src/com/android/wallpaper/util/WallpaperConnection.java
+++ b/src/com/android/wallpaper/util/WallpaperConnection.java
@@ -34,8 +34,6 @@
 
 import androidx.annotation.Nullable;
 
-import java.lang.reflect.Method;
-
 /**
  * Implementation of {@link IWallpaperConnection} that handles communication with a
  * {@link android.service.wallpaper.WallpaperService}
@@ -53,7 +51,6 @@
     private boolean mIsVisible;
     private boolean mIsEngineVisible;
     private boolean mEngineReady;
-    private Method mScalePreviewMethod;
 
     /**
      * @param intent used to bind the wallpaper service
@@ -167,16 +164,17 @@
 
     private void updateEnginePosition() {
         if (mWallpaperPreviewRect != null) {
-            // TODO(santie): switch to regular method call once SDK is sync'ed
+            // TODO(santie): replace with proper surface resizing when the API is available
+            View decorView = mActivity.getWindow().getDecorView();
+            int availw = decorView.getWidth();
+            int availh = decorView.getHeight();
             try {
-                if (mScalePreviewMethod == null) {
-                    mScalePreviewMethod =
-                            mEngine.getClass().getMethod("scalePreview", Rect.class);
-                    mScalePreviewMethod.setAccessible(true);
-                }
-                mScalePreviewMethod.invoke(mEngine, mWallpaperPreviewRect);
-            } catch (Exception e) {
-                Log.e(TAG, "Couldn't call scalePreview method on WallpaperEngine", e);
+                mEngine.setDisplayPadding(
+                        new Rect(-mWallpaperPreviewRect.left, -mWallpaperPreviewRect.top,
+                                mWallpaperPreviewRect.right - availw,
+                                mWallpaperPreviewRect.bottom - availh));
+            } catch (RemoteException e) {
+                Log.e(TAG, "Couldn't set preview padding", e);
             }
         }
     }
diff --git a/src/com/android/wallpaper/util/WallpaperCropUtils.java b/src/com/android/wallpaper/util/WallpaperCropUtils.java
index 7d9c2b8..3e751b8 100755
--- a/src/com/android/wallpaper/util/WallpaperCropUtils.java
+++ b/src/com/android/wallpaper/util/WallpaperCropUtils.java
@@ -243,18 +243,6 @@
         }
     }
 
-    // TODO(b/154783188): Remove this method when new system UI's API is available.
-    /**
-     * Get the system wallpaper's maximum scale value.
-     */
-    public static float getSystemWallpaperMaximumScale() {
-        Resources system = Resources.getSystem();
-        return system.getFloat(system.getIdentifier(
-                /* name= */ "config_wallpaperMaxScale",
-                /* defType= */ "dimen",
-                /* defPackage= */ "android"));
-    }
-
     /**
      * Returns whether layout direction is RTL (or false for LTR). Since native RTL layout support
      * was added in API 17, returns false for versions lower than 17.
diff --git a/src/com/android/wallpaper/widget/BottomActionBar.java b/src/com/android/wallpaper/widget/BottomActionBar.java
index b5bbdd5..ee68b81 100644
--- a/src/com/android/wallpaper/widget/BottomActionBar.java
+++ b/src/com/android/wallpaper/widget/BottomActionBar.java
@@ -18,7 +18,6 @@
 import static com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED;
 import static com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED;
 
-import android.app.Activity;
 import android.content.Context;
 import android.graphics.drawable.GradientDrawable;
 import android.util.AttributeSet;
@@ -37,31 +36,20 @@
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
 import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback;
 
-import java.util.Arrays;
 import java.util.EnumMap;
-import java.util.HashSet;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /** A {@code ViewGroup} which provides the specific actions for the user to interact with. */
 public class BottomActionBar extends FrameLayout {
 
-    /**
-     * Interface to be implemented by an Activity hosting a {@link BottomActionBar}
-     */
-    public interface BottomActionBarHost {
-        /** Gets {@link BottomActionBar}. */
-        BottomActionBar getBottomActionBar();
-    }
-
-    // TODO(b/154299462): Separate downloadable related actions from WallpaperPicker.
     /** The action items in the bottom action bar. */
     public enum BottomAction {
-        ROTATION, DELETE, INFORMATION, EDIT, CUSTOMIZE, DOWNLOAD, PROGRESS, APPLY,
+        CANCEL, ROTATION, INFORMATION, EDIT, APPLY,
     }
 
-    private final Map<BottomAction, View> mActionMap = new EnumMap<>(BottomAction.class);
+    private final Map<BottomAction, View> mActionList = new EnumMap<>(BottomAction.class);
     private final BottomSheetBehavior<ViewGroup> mBottomSheetBehavior;
     private final TextView mAttributionTitle;
     private final TextView mAttributionSubtitle1;
@@ -75,14 +63,11 @@
         mAttributionSubtitle1 = findViewById(R.id.preview_attribution_pane_subtitle1);
         mAttributionSubtitle2 = findViewById(R.id.preview_attribution_pane_subtitle2);
 
-        mActionMap.put(BottomAction.ROTATION, findViewById(R.id.action_rotation));
-        mActionMap.put(BottomAction.DELETE, findViewById(R.id.action_delete));
-        mActionMap.put(BottomAction.INFORMATION, findViewById(R.id.action_information));
-        mActionMap.put(BottomAction.EDIT, findViewById(R.id.action_edit));
-        mActionMap.put(BottomAction.CUSTOMIZE, findViewById(R.id.action_customize));
-        mActionMap.put(BottomAction.DOWNLOAD, findViewById(R.id.action_download));
-        mActionMap.put(BottomAction.PROGRESS, findViewById(R.id.action_progress));
-        mActionMap.put(BottomAction.APPLY, findViewById(R.id.action_apply));
+        mActionList.put(BottomAction.CANCEL, findViewById(R.id.action_cancel));
+        mActionList.put(BottomAction.ROTATION, findViewById(R.id.action_rotation));
+        mActionList.put(BottomAction.INFORMATION, findViewById(R.id.action_information));
+        mActionList.put(BottomAction.EDIT, findViewById(R.id.action_edit));
+        mActionList.put(BottomAction.APPLY, findViewById(R.id.action_apply));
 
         ViewGroup bottomSheet = findViewById(R.id.action_bottom_sheet);
         mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
@@ -131,18 +116,12 @@
      */
     public void setActionClickListener(
             BottomAction bottomAction, OnClickListener actionClickListener) {
-        mActionMap.get(bottomAction).setOnClickListener(actionClickListener);
-    }
-
-    /** Binds the cancel button to back key. */
-    public void bindBackButtonToSystemBackKey(Activity activity) {
-        findViewById(R.id.action_back).setOnClickListener(v -> activity.onBackPressed());
+        mActionList.get(bottomAction).setOnClickListener(actionClickListener);
     }
 
     /** Clears all the actions' click listeners */
     public void clearActionClickListeners() {
-        mActionMap.forEach((bottomAction, view) -> view.setOnClickListener(null));
-        findViewById(R.id.action_back).setOnClickListener(null);
+        mActionList.forEach((bottomAction, view) -> view.setOnClickListener(null));
     }
 
     /**
@@ -180,10 +159,6 @@
         }
     }
 
-    /** Returns {@code true} if visible. */
-    public boolean isVisible() {
-        return getVisibility() == VISIBLE;
-    }
 
     /** Shows {@link BottomActionBar}. */
     public void show() {
@@ -200,10 +175,8 @@
      *
      * @param actions the specific actions
      */
-    public void showActions(BottomAction... actions) {
-        for (BottomAction action : actions) {
-            mActionMap.get(action).setVisibility(VISIBLE);
-        }
+    public void showActions(EnumSet<BottomAction> actions) {
+        showActions(actions, true);
     }
 
     /**
@@ -211,13 +184,10 @@
      *
      * @param actions the specific actions
      */
-    public void hideActions(BottomAction... actions) {
-        for (BottomAction action : actions) {
-            mActionMap.get(action).setVisibility(GONE);
-
-            if (BottomAction.INFORMATION.equals(action)) {
-                mBottomSheetBehavior.setState(STATE_COLLAPSED);
-            }
+    public void hideActions(EnumSet<BottomAction> actions) {
+        showActions(actions, false);
+        if (actions.contains(BottomAction.INFORMATION)) {
+            mBottomSheetBehavior.setState(STATE_COLLAPSED);
         }
     }
 
@@ -226,64 +196,28 @@
      *
      * @param actions the specific actions which will be shown. Others will be hidden.
      */
-    public void showActionsOnly(BottomAction... actions) {
-        final Set<BottomAction> actionsSet = new HashSet<>(Arrays.asList(actions));
-
-        mActionMap.forEach((action, view) -> {
-            if (actionsSet.contains(action)) {
-                showActions(action);
-            } else {
-                hideActions(action);
-            }
-        });
-    }
-
-    /**
-     * All actions will be hidden.
-     */
-    public void hideAllActions() {
-        showActionsOnly(/* No actions to show */);
+    public void showActionsOnly(EnumSet<BottomAction> actions) {
+        showActions(actions);
+        hideActions(EnumSet.complementOf(actions));
     }
 
     /** Enables all the actions' {@link View}. */
     public void enableActions() {
-        mActionMap.forEach((bottomAction, view) -> view.setEnabled(true));
+        enableActions(true);
     }
 
     /** Disables all the actions' {@link View}. */
     public void disableActions() {
-        mActionMap.forEach((bottomAction, view) -> view.setEnabled(false));
+        enableActions(false);
     }
 
-    /**
-     * Enables specified actions' {@link View}.
-     *
-     * @param actions the specified actions to enable their views
-     */
-    public void enableActions(BottomAction... actions) {
-        for (BottomAction action : actions) {
-            mActionMap.get(action).setEnabled(true);
-        }
+    private void enableActions(boolean enable) {
+        mActionList.forEach((bottomAction, view) -> view.setEnabled(enable));
     }
 
-    /**
-     * Disables specified actions' {@link View}.
-     *
-     * @param actions the specified actions to disable their views
-     */
-    public void disableActions(BottomAction... actions) {
-        for (BottomAction action : actions) {
-            mActionMap.get(action).setEnabled(false);
-        }
-    }
-
-    /** Resets {@link BottomActionBar}. */
-    public void reset() {
-        hide();
-        hideAllActions();
-        clearActionClickListeners();
-        enableActions();
-        resetInfoPage();
+    private void showActions(EnumSet<BottomAction> actions, boolean show) {
+        actions.forEach(bottomAction ->
+                mActionList.get(bottomAction).setVisibility(show ? VISIBLE : GONE));
     }
 
     private void resetInfoPage() {
diff --git a/src/com/android/wallpaper/widget/PreviewPager.java b/src/com/android/wallpaper/widget/PreviewPager.java
index a70fdda..1e11abc 100644
--- a/src/com/android/wallpaper/widget/PreviewPager.java
+++ b/src/com/android/wallpaper/widget/PreviewPager.java
@@ -19,12 +19,11 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.database.DataSetObserver;
-import android.graphics.Point;
 import android.util.AttributeSet;
+import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.WindowManager;
 import android.widget.LinearLayout;
 
 import androidx.annotation.Nullable;
@@ -35,7 +34,6 @@
 import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
 
 import com.android.wallpaper.R;
-import com.android.wallpaper.util.ScreenSizeCalculator;
 
 import java.util.Locale;
 
@@ -87,32 +85,6 @@
         mMaxHeightRatio = ratioValue.getFloat();
 
         mViewPager = findViewById(R.id.preview_viewpager);
-        mViewPager.setPageTransformer(false, (view, position) -> {
-            int origin = mViewPager.getPaddingStart();
-            int leftBoundary = -view.getWidth();
-            int rightBoundary = mViewPager.getWidth();
-            int pageWidth = view.getWidth();
-            int offset = (int) (pageWidth * position);
-
-            //               left      origin     right
-            //             boundary              boundary
-            // ---------------|----------|----------|----------
-            // Cover alpha:  1.0         0         1.0
-            float alpha;
-            if (offset <= leftBoundary || offset >= rightBoundary) {
-                alpha = 1.0f;
-            } else if (offset <= origin) {
-                // offset in (leftBoundary, origin]
-                alpha = (float) Math.abs(offset - origin) / Math.abs(leftBoundary - origin);
-            } else {
-                // offset in (origin, rightBoundary)
-                alpha = (float) Math.abs(offset - origin) / Math.abs(rightBoundary - origin);
-            }
-            View cover = view.findViewById(R.id.fade_cover);
-            if (cover != null) {
-                view.findViewById(R.id.fade_cover).setAlpha(alpha);
-            }
-        }, LAYER_TYPE_NONE);
         mViewPager.setPageMargin(res.getDimensionPixelOffset(R.dimen.preview_page_gap));
         mViewPager.setClipToPadding(false);
         if (mPageStyle == STYLE_PEEKING) {
@@ -125,27 +97,15 @@
                     hMargin,
                     res.getDimensionPixelOffset(R.dimen.preview_page_bottom_margin));
         } else if (mPageStyle == STYLE_ASPECT_RATIO) {
-            WindowManager windowManager = context.getSystemService(WindowManager.class);
-            Point screenSize = ScreenSizeCalculator.getInstance()
-                    .getScreenSize(windowManager.getDefaultDisplay());
-            mScreenAspectRatio = (float) screenSize.y / screenSize.x;
+            DisplayMetrics dm = res.getDisplayMetrics();
+            mScreenAspectRatio = dm.heightPixels > dm.widthPixels
+                    ? (float) dm.heightPixels / dm.widthPixels
+                    : (float) dm.widthPixels / dm.heightPixels;
             mViewPager.setPadding(
                     0,
                     res.getDimensionPixelOffset(R.dimen.preview_page_top_margin),
                     0,
                     res.getDimensionPixelOffset(R.dimen.preview_page_bottom_margin));
-            // Set the default margin to make sure not peeking the second page before calculating
-            // the real margin.
-            mViewPager.setPageMargin(screenSize.x / 2);
-            mViewPager.addOnLayoutChangeListener(new OnLayoutChangeListener() {
-                @Override
-                public void onLayoutChange(View view, int left, int top, int right, int bottom,
-                                           int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                    // Set the minimum margin which can't peek the second page.
-                    mViewPager.setPageMargin(view.getPaddingEnd());
-                    mViewPager.removeOnLayoutChangeListener(this);
-                }
-            });
         }
         mPageIndicator = findViewById(R.id.page_indicator);
         mPreviousArrow = findViewById(R.id.arrow_previous);
@@ -164,18 +124,12 @@
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        View parentView = (View) getParent();
-        float parentHeight = parentView != null ? parentView.getMeasuredHeight() : 0;
-        if (parentHeight > 0) {
-            int maxHeight = Math.min(MeasureSpec.getSize(heightMeasureSpec),
-                    (int) (parentHeight * mMaxHeightRatio));
-            heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
-        }
-
         if (mPageStyle == STYLE_ASPECT_RATIO) {
             int availableWidth = MeasureSpec.getSize(widthMeasureSpec);
             int availableHeight = MeasureSpec.getSize(heightMeasureSpec);
-            int indicatorHeight = ((View) mPageIndicator.getParent()).getLayoutParams().height;
+            int indicatorHeight = mPageIndicator.getVisibility() == VISIBLE
+                    ? ((View) mPageIndicator.getParent()).getLayoutParams().height
+                    : 0;
             int pagerHeight = availableHeight - indicatorHeight;
             if (availableWidth > 0) {
                 int absoluteCardWidth = (int) ((pagerHeight - mViewPager.getPaddingBottom()
@@ -189,6 +143,14 @@
             }
         }
 
+        View parentView = (View) getParent();
+        float parentHeight = parentView != null ? parentView.getMeasuredHeight() : 0;
+        if (parentHeight > 0) {
+            int maxHeight = Math.min(MeasureSpec.getSize(heightMeasureSpec),
+                    (int) (parentHeight * mMaxHeightRatio));
+            heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
+        }
+
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     }
 
@@ -244,15 +206,6 @@
         mExternalPageListener = listener;
     }
 
-    /**
-     * Switches to the specific preview page.
-     *
-     * @param index preview page index to select
-     */
-    public void switchPreviewPage(int index) {
-        mViewPager.setCurrentItem(index);
-    }
-
     private void initIndicator() {
         mPageIndicator.setNumPages(mAdapter.getCount());
         mPageIndicator.setLocation(mViewPager.getCurrentItem());
diff --git a/tests/src/com/android/wallpaper/testing/TestWallpaperPersister.java b/tests/src/com/android/wallpaper/testing/TestWallpaperPersister.java
index 5c1ddbd..26bd25f 100644
--- a/tests/src/com/android/wallpaper/testing/TestWallpaperPersister.java
+++ b/tests/src/com/android/wallpaper/testing/TestWallpaperPersister.java
@@ -85,7 +85,6 @@
             if (destination == DEST_LOCK_SCREEN || destination == DEST_BOTH) {
                 mPendingLockWallpaper = bitmap;
                 mPrefs.setLockWallpaperAttributions(wallpaperInfo.getAttributions(mAppContext));
-                mPrefs.setLockWallpaperRemoteId(wallpaperInfo.getWallpaperId());
             }
             mDestination = destination;
             mCallback = callback;
@@ -110,7 +109,6 @@
                 mPrefs.setWallpaperPresentationMode(WallpaperPreferences.PRESENTATION_MODE_STATIC);
                 mPendingLockWallpaper = bitmap;
                 mPrefs.setLockWallpaperAttributions(wallpaper.getAttributions(mAppContext));
-                mPrefs.setLockWallpaperRemoteId(wallpaper.getWallpaperId());
 
                 mDestination = WallpaperPersister.DEST_BOTH;
                 mCallback = callback;
diff --git a/tests/src/com/android/wallpaper/testing/TestWallpaperPreferences.java b/tests/src/com/android/wallpaper/testing/TestWallpaperPreferences.java
index 840e40a..715e81b 100644
--- a/tests/src/com/android/wallpaper/testing/TestWallpaperPreferences.java
+++ b/tests/src/com/android/wallpaper/testing/TestWallpaperPreferences.java
@@ -45,7 +45,6 @@
     private int mLockWallpaperManagerId;
     private String mLockActionUrl;
     private String mLockCollectionId;
-    private String mLockWallpaperRemoteId;
 
     private List<Long> mDailyRotations;
     private long mDailyWallpaperEnabledTimestamp;
@@ -301,16 +300,6 @@
     }
 
     @Override
-    public String getLockWallpaperRemoteId() {
-        return mLockWallpaperRemoteId;
-    }
-
-    @Override
-    public void setLockWallpaperRemoteId(String wallpaperRemoteId) {
-        mLockWallpaperRemoteId = wallpaperRemoteId;
-    }
-
-    @Override
     public void addDailyRotation(long timestamp) {
         mDailyRotations.add(timestamp);
     }
