Merge "Fix crash on rotation and tweak landscape layout" into ub-launcher3-qt-r1-dev
diff --git a/res/layout-land/fragment_clock_picker.xml b/res/layout-land/fragment_clock_picker.xml
index a292876..b5044b7 100644
--- a/res/layout-land/fragment_clock_picker.xml
+++ b/res/layout-land/fragment_clock_picker.xml
@@ -23,46 +23,75 @@
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <LinearLayout
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-
-        <com.android.customization.widget.PreviewPager
-            android:id="@+id/clock_preview_pager"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:background="@color/secondary_color"
-            app:card_style="screen_aspect_ratio"/>
+        android:layout_height="match_parent">
 
         <LinearLayout
-            android:id="@+id/options_section"
-            android:layout_width="0dp"
+            android:id="@+id/content_section"
+            android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:paddingVertical="10dp"
-            android:orientation="vertical">
+            android:orientation="horizontal">
 
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/options_container"
-                android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_weight="1"/>
+            <com.android.customization.widget.PreviewPager
+                android:id="@+id/clock_preview_pager"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@color/secondary_color"
+                app:card_style="screen_aspect_ratio"/>
 
-            <RelativeLayout
+            <LinearLayout
+                android:id="@+id/options_section"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:paddingVertical="10dp"
+                android:orientation="vertical">
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/options_container"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingHorizontal="10dp">
+                    <Button
+                        android:id="@+id/apply_button"
+                        style="@style/ActionPrimaryButton"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentEnd="true"
+                        android:text="@string/apply_btn"/>
+                </RelativeLayout>
+
+            </LinearLayout>
+        </LinearLayout>
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingHorizontal="10dp">
-                <Button
-                    android:id="@+id/apply_button"
-                    style="@style/ActionPrimaryButton"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentEnd="true"
-                    android:text="@string/apply_btn"/>
-            </RelativeLayout>
-
-        </LinearLayout>
-    </LinearLayout>
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout-land/fragment_grid_picker.xml b/res/layout-land/fragment_grid_picker.xml
index 20ee447..6fc5933 100644
--- a/res/layout-land/fragment_grid_picker.xml
+++ b/res/layout-land/fragment_grid_picker.xml
@@ -21,7 +21,13 @@
     android:orientation="vertical"
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
-    <LinearLayout
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+        android:id="@+id/content_section"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="horizontal">
@@ -62,4 +68,28 @@
 
         </LinearLayout>
     </LinearLayout>
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout-land/fragment_theme_picker.xml b/res/layout-land/fragment_theme_picker.xml
index 267ef0d..cd3cdbd 100644
--- a/res/layout-land/fragment_theme_picker.xml
+++ b/res/layout-land/fragment_theme_picker.xml
@@ -22,55 +22,88 @@
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <LinearLayout
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-
-        <com.android.customization.widget.PreviewPager
-            android:id="@+id/theme_preview_pager"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:background="@color/secondary_color"/>
-
+        android:layout_height="match_parent">
         <LinearLayout
-            android:id="@+id/options_section"
-            android:layout_width="0dp"
+            android:id="@+id/content_section"
+            android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:paddingVertical="10dp"
-            android:orientation="vertical">
+            android:orientation="horizontal">
 
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/options_container"
-                android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_weight="1"/>
+            <com.android.customization.widget.PreviewPager
+                android:id="@+id/theme_preview_pager"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@color/secondary_color"/>
+            <View
+                android:layout_width="1dp"
+                android:layout_height="match_parent"
+                android:background="@color/divider_color"/>
+            <LinearLayout
+                android:id="@+id/options_section"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:paddingVertical="10dp"
+                android:orientation="vertical">
 
-            <RelativeLayout
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/options_container"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="@null"
+                    android:paddingHorizontal="10dp">
+                    <CheckBox
+                        android:id="@+id/use_my_wallpaper"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentStart="true"
+                        android:layout_centerVertical="true"
+                        android:layout_toStartOf="@+id/apply_button"
+                        android:ellipsize="end"
+                        android:paddingLeft="4dp"
+                        android:minHeight="@dimen/min_taptarget_height"
+                        android:text="@string/keep_my_wallpaper"/>
+                    <Button
+                        android:id="@+id/apply_button"
+                        style="@style/ActionPrimaryButton"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentEnd="true"
+                        android:text="@string/apply_theme_btn"/>
+                </RelativeLayout>
+            </LinearLayout>
+        </LinearLayout>
+
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingHorizontal="10dp">
-                <CheckBox
-                    android:id="@+id/use_my_wallpaper"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentStart="true"
-                    android:layout_centerVertical="true"
-                    android:layout_toStartOf="@+id/apply_button"
-                    android:ellipsize="end"
-                    android:paddingLeft="4dp"
-                    android:minHeight="@dimen/min_taptarget_height"
-                    android:text="@string/keep_my_wallpaper"/>
-                <Button
-                    android:id="@+id/apply_button"
-                    style="@style/ActionPrimaryButton"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentEnd="true"
-                    android:text="@string/apply_theme_btn"/>
-            </RelativeLayout>
-        </LinearLayout>
-    </LinearLayout>
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout/clock_option.xml b/res/layout/clock_option.xml
index 30aa14f..e65cb65 100644
--- a/res/layout/clock_option.xml
+++ b/res/layout/clock_option.xml
@@ -19,6 +19,8 @@
     android:layout_height="wrap_content"
     android:paddingRight="2dp"
     android:paddingBottom="@dimen/option_bottom_margin"
+    android:clipChildren="false"
+    android:clipToPadding="false"
     android:orientation="vertical">
 
     <TextView
diff --git a/res/layout/grid_option.xml b/res/layout/grid_option.xml
index 5edcdc9..286c60b 100644
--- a/res/layout/grid_option.xml
+++ b/res/layout/grid_option.xml
@@ -19,6 +19,8 @@
     android:layout_height="wrap_content"
     android:paddingRight="2dp"
     android:paddingBottom="@dimen/option_bottom_margin"
+    android:clipChildren="false"
+    android:clipToPadding="false"
     android:orientation="vertical">
 
     <TextView
diff --git a/res/layout/theme_component_preview.xml b/res/layout/theme_component_preview.xml
index 32d3f20..0d01e05 100644
--- a/res/layout/theme_component_preview.xml
+++ b/res/layout/theme_component_preview.xml
@@ -26,7 +26,7 @@
     android:maxHeight="@dimen/preview_theme_max_height"
     android:minHeight="@dimen/preview_theme_min_height"
     android:paddingHorizontal="@dimen/preview_card_padding"
-    android:paddingTop="@dimen/preview_card_padding">
+    android:paddingTop="@dimen/preview_card_top_padding">
 
         <ViewStub
             android:id="@+id/theme_preview_top_bar"
@@ -76,7 +76,7 @@
             android:layout_height="wrap_content"
             android:orientation="horizontal"
             app:layout_constraintBottom_toTopOf="@+id/edit_label"
-            app:layout_constraintGuide_end="@dimen/min_taptarget_height"
+            app:layout_constraintGuide_end="@dimen/preview_theme_content_bottom"
             app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_body_container"/>
 
         <TextView
diff --git a/res/layout/theme_option.xml b/res/layout/theme_option.xml
index 1cb9ffa..e103b69 100644
--- a/res/layout/theme_option.xml
+++ b/res/layout/theme_option.xml
@@ -19,6 +19,8 @@
     android:layout_height="wrap_content"
     android:paddingRight="2dp"
     android:paddingBottom="@dimen/option_bottom_margin"
+    android:clipChildren="false"
+    android:clipToPadding="false"
     android:orientation="vertical">
 
     <TextView
diff --git a/res/layout/theme_preview_topbar.xml b/res/layout/theme_preview_topbar.xml
index 5642668..15b665d 100644
--- a/res/layout/theme_preview_topbar.xml
+++ b/res/layout/theme_preview_topbar.xml
@@ -28,6 +28,7 @@
         android:layout_height="wrap_content"
         android:layout_gravity="start|center_vertical"
         android:textColor="@color/icon_thumbnail_color"
+        android:textSize="@dimen/preview_theme_cover_topbar_clock_size"
         tools:text="8:10"/>
     <LinearLayout
         android:id="@+id/theme_preview_top_bar_icons"
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 4b16b5e..ddf84e8 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -17,22 +17,30 @@
 -->
 <resources>
     <dimen name="card_title_text_size">12sp</dimen>
-    <dimen name="card_cover_title_text_size">16sp</dimen>
-    <dimen name="card_header_top_margin">8dp</dimen>
+    <dimen name="card_cover_title_text_size">14sp</dimen>
+    <dimen name="card_header_top_margin">6dp</dimen>
     <dimen name="preview_card_padding">8dp</dimen>
-    <dimen name="preview_page_gap">93dp</dimen>
+    <dimen name="preview_card_top_padding">6dp</dimen>
+    <dimen name="preview_page_gap">60dp</dimen>
     <dimen name="preview_page_horizontal_margin">92dp</dimen>
-    <dimen name="preview_theme_content_margin">18dp</dimen>
+    <dimen name="preview_theme_content_margin">8dp</dimen>
     <dimen name="preview_theme_content_max_height">140dp</dimen>
     <dimen name="preview_theme_content_min_height">100dp</dimen>
-    <dimen name="preview_theme_cover_topbar_icon_size">14dp</dimen>
-    <dimen name="preview_theme_icon_size">28dp</dimen>
+    <dimen name="preview_theme_cover_topbar_clock_size">12sp</dimen>
+    <dimen name="preview_theme_cover_topbar_icon_size">12dp</dimen>
+    <dimen name="preview_theme_icon_size">26dp</dimen>
     <dimen name="preview_theme_tile_size">14dp</dimen>
-    <dimen name="preview_theme_shape_size">32dp</dimen>
+    <dimen name="preview_theme_shape_size">30dp</dimen>
     <dimen name="preview_theme_cover_content_extra_margin">0dp</dimen>
+    <dimen name="preview_theme_content_bottom">8dp</dimen>
+    <dimen name="preview_theme_cover_content_bottom">36dp</dimen>
 
     <dimen name="font_preview_divider_gap">12dp</dimen>
 
     <dimen name="options_container_width">400dp</dimen>
     <dimen name="option_bottom_margin">8dp</dimen>
+    <dimen name="option_tile_width">62dp</dimen>
+    <dimen name="option_tile_padding_horizontal">7dp</dimen>
+    <dimen name="option_tile_padding_vertical">8dp</dimen>
+
 </resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ba7ea6b..51e4a83 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -23,7 +23,7 @@
     <dimen name="tip_dot_line_width">2dp</dimen>
 
     <dimen name="check_size">20dp</dimen>
-    <dimen name="check_offset">4dp</dimen>
+    <dimen name="check_offset">-4dp</dimen>
 
     <dimen name="preview_indicator_width">16dp</dimen>
     <dimen name="preview_indicator_height">8dp</dimen>
@@ -62,6 +62,7 @@
     <dimen name="theme_option_label_margin">4dp</dimen>
 
     <dimen name="preview_card_padding">20dp</dimen>
+    <dimen name="preview_card_top_padding">@dimen/preview_card_padding</dimen>
 
     <dimen name="card_title_text_size">16sp</dimen>
     <dimen name="card_cover_title_text_size">24sp</dimen>
@@ -77,8 +78,11 @@
     <dimen name="preview_theme_icon_size">30dp</dimen>
     <dimen name="preview_theme_tile_size">16dp</dimen>
     <dimen name="preview_theme_shape_size">36dp</dimen>
+    <dimen name="preview_theme_cover_topbar_clock_size">14sp</dimen>
     <dimen name="preview_theme_cover_topbar_icon_size">16dp</dimen>
     <dimen name="preview_theme_cover_content_extra_margin">16dp</dimen>
+    <dimen name="preview_theme_content_bottom">@dimen/min_taptarget_height</dimen>
+    <dimen name="preview_theme_cover_content_bottom">@dimen/preview_theme_content_bottom</dimen>
 
     <dimen name="font_preview_body_width">200dp</dimen>
     <dimen name="font_preview_divider_gap">30dp</dimen>
@@ -100,4 +104,5 @@
     <dimen name="roundCornerThreshold">16dp</dimen>
 
     <dimen name="min_taptarget_height">48dp</dimen>
+
 </resources>
diff --git a/src/com/android/customization/picker/theme/ThemePreviewPage.java b/src/com/android/customization/picker/theme/ThemePreviewPage.java
index 79f2e9c..f00cd3f 100644
--- a/src/com/android/customization/picker/theme/ThemePreviewPage.java
+++ b/src/com/android/customization/picker/theme/ThemePreviewPage.java
@@ -20,6 +20,7 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.StringRes;
+import androidx.constraintlayout.widget.Guideline;
 
 import com.android.customization.picker.BasePreviewAdapter.PreviewPage;
 import com.android.wallpaper.R;
@@ -228,6 +229,12 @@
                             cornerRadius, cornerRadius, cornerRadius, cornerRadius});
                 }
             }
+
+            Guideline guideline = card.findViewById(R.id.guideline);
+            if (guideline != null) {
+                guideline.setGuidelineEnd(card.getResources().getDimensionPixelOffset(
+                        R.dimen.preview_theme_cover_content_bottom));
+            }
         }
 
         @Override
diff --git a/src/com/android/customization/widget/OptionSelectorController.java b/src/com/android/customization/widget/OptionSelectorController.java
index e3e2cc5..efd73ea 100644
--- a/src/com/android/customization/widget/OptionSelectorController.java
+++ b/src/com/android/customization/widget/OptionSelectorController.java
@@ -194,7 +194,7 @@
                 if (mShowCheckmark && option.equals(mAppliedOption)) {
                     Resources res = mContainer.getContext().getResources();
                     Drawable checkmark = res.getDrawable(R.drawable.ic_check_circle_filled_24px);
-                    Drawable frame = holder.itemView.getForeground();
+                    Drawable frame = holder.tileView.getForeground();
                     Drawable[] layers = {frame, checkmark};
                     if (frame == null) {
                         layers = new Drawable[]{checkmark};
@@ -204,20 +204,20 @@
                     // Position at lower right
                     int idx = layers.length - 1;
                     int checkSize = (int) res.getDimension(R.dimen.check_size);
-                    int checkOffset = (int) res.getDimension(R.dimen.check_offset);
+                    int checkOffset = (int) res.getDimensionPixelOffset(R.dimen.check_offset);
                     checkedFrame.setLayerGravity(idx, Gravity.BOTTOM | Gravity.RIGHT);
                     checkedFrame.setLayerWidth(idx, checkSize);
                     checkedFrame.setLayerHeight(idx, checkSize);
                     checkedFrame.setLayerInsetBottom(idx, checkOffset);
-                    checkedFrame.setLayerInsetLeft(idx, checkOffset);
-                    holder.itemView.setForeground(checkedFrame);
+                    checkedFrame.setLayerInsetRight(idx, checkOffset);
+                    holder.tileView.setForeground(checkedFrame);
 
                     // Initialize the currently applied option
                     CharSequence cd = mContainer.getContext().getString(
                             R.string.option_applied_previewed_description, option.getTitle());
                     holder.labelView.setContentDescription(cd);
                 } else if (mShowCheckmark) {
-                    holder.itemView.setForeground(null);
+                    holder.tileView.setForeground(null);
                 }
             }
 
diff --git a/src/com/android/customization/widget/PageIndicator.java b/src/com/android/customization/widget/PageIndicator.java
index b80f558..dd636ad 100644
--- a/src/com/android/customization/widget/PageIndicator.java
+++ b/src/com/android/customization/widget/PageIndicator.java
@@ -205,7 +205,11 @@
     }
 
     private void playAnimation(ImageView imageView, int res) {
-        final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) getContext().getDrawable(res);
+        Drawable drawable = getContext().getDrawable(res);
+        if (!(drawable instanceof AnimatedVectorDrawable)) {
+            return;
+        }
+        final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) drawable;
         imageView.setImageDrawable(avd);
         try {
             forceAnimationOnUI(avd);