[automerger skipped] Import translations. DO NOT MERGE
am: 4670d420c1 -s ours
am skip reason: subject contains skip directive
Change-Id: I1f3d91a8dd8071a88d35a01965141cc8c01657a9
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6d06bcc..2564487 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -10,16 +10,16 @@
<uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />
<application
+ tools:replace="android:icon,android:name"
android:extractNativeLibs="false"
android:hardwareAccelerated="true"
- android:icon="@mipmap/product_logo_wallpapers_launcher_color_48"
+ android:icon="@drawable/ic_home"
android:label="@string/app_name"
android:requiredForAllUsers="true"
android:restoreAnyVersion="true"
android:supportsRtl="true"
android:name="com.android.customization.picker.CustomizationPickerApplication"
- android:theme="@style/CustomizationTheme"
- tools:replace="android:name">
+ android:theme="@style/CustomizationTheme">
<activity
android:name="com.android.customization.picker.CustomizationPickerActivity"
android:label="@string/app_name"
diff --git a/res/color/option_border_color.xml b/res/color/option_border_color.xml
index ea5f189..ec5ab97 100644
--- a/res/color/option_border_color.xml
+++ b/res/color/option_border_color.xml
@@ -23,5 +23,6 @@
android:alpha="0.24"
android:color="?android:colorAccent" />
<item
- android:color="@color/material_grey500"/>
+ android:alpha="0.05"
+ android:color="@color/option_border_default"/>
</selector>
diff --git a/res/drawable/color_chip_hollow.xml b/res/drawable/color_chip_hollow.xml
index 76ab6b8..c0eab74 100644
--- a/res/drawable/color_chip_hollow.xml
+++ b/res/drawable/color_chip_hollow.xml
@@ -17,8 +17,8 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
- android:innerRadius="13dp"
- android:thickness="8dp"
+ android:innerRadius="10dp"
+ android:thickness="6dp"
android:useLevel="false">
<solid android:color="@android:color/black"/>
</shape>
diff --git a/res/drawable/ic_home.xml b/res/drawable/ic_home.xml
new file mode 100644
index 0000000..c1c8e56
--- /dev/null
+++ b/res/drawable/ic_home.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@color/icon_background" />
+ <foreground>
+ <inset android:inset="16.6%" android:drawable="@drawable/icon_foreground" />
+ </foreground>
+</adaptive-icon>
diff --git a/res/drawable/icon_foreground.xml b/res/drawable/icon_foreground.xml
new file mode 100644
index 0000000..1138c56
--- /dev/null
+++ b/res/drawable/icon_foreground.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<vector android:height="72dp" android:viewportHeight="512"
+ android:viewportWidth="512" android:width="72dp"
+ xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:pathData="M512.25,248.55l-118,-118 -4.86,-4.86c-1.72,-1.65 -3.47,-3.28 -5.26,-4.86 -33,-29.29 -78.25,-47.41 -128.1,-47.41 -100.59,0 -182.56,82 -182.56,182.56a181.9,181.9 0,0 0,50.09 125.42h0l0.14,0.14q3.39,3.58 7,7L254.16,512H512.25Z">
+ <aapt:attr name="android:fillColor">
+ <gradient android:endX="512.25" android:endY="292.69"
+ android:startX="73.44" android:startY="292.69" android:type="linear">
+ <item android:color="#331C3AA9" android:offset="0"/>
+ <item android:color="#051C3AA9" android:offset="1"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path android:fillAlpha="0.2" android:fillColor="#1a237e"
+ android:pathData="M256,438.51c-100.59,0 -182.56,-82 -182.56,-182.56S155.41,73.39 256,73.39s182.56,73.75 182.56,164.3A109.63,109.63 0,0 1,329 347.23L296.71,347.23a9,9 0,0 0,-9.13 9.12,9.65 9.65,0 0,0 2.38,6 46.46,46.46 0,0 1,11.68 30.49A45.66,45.66 0,0 1,256 438.51ZM155.59,274.2a27.38,27.38 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,155.59 274.2ZM210.36,201.2A27.39,27.39 0,1 0,183 173.8,27.38 27.38,0 0,0 210.36,201.18ZM301.64,201.2a27.39,27.39 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,301.64 201.18ZM356.41,274.2A27.38,27.38 0,1 0,329 246.82,27.38 27.38,0 0,0 356.41,274.2Z" android:strokeAlpha="0.2"/>
+ <path android:fillColor="#fff" android:pathData="M389.36,125.66l4.86,4.86C392.64,128.87 391,127.25 389.36,125.66Z"/>
+ <path android:fillColor="#eee" android:pathData="M256,438.51c-100.59,0 -182.56,-82 -182.56,-182.56S155.41,73.39 256,73.39s182.56,73.75 182.56,164.3A109.63,109.63 0,0 1,329 347.23L296.71,347.23a9,9 0,0 0,-9.13 9.12,9.65 9.65,0 0,0 2.38,6 46.46,46.46 0,0 1,11.68 30.49A45.66,45.66 0,0 1,256 438.51ZM155.59,274.2a27.38,27.38 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,155.59 274.2ZM210.36,201.2A27.39,27.39 0,1 0,183 173.8,27.38 27.38,0 0,0 210.36,201.18ZM301.64,201.2a27.39,27.39 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,301.64 201.18ZM356.41,274.2A27.38,27.38 0,1 0,329 246.82,27.38 27.38,0 0,0 356.41,274.2Z"/>
+ <path android:fillAlpha="0.4" android:fillColor="#fff" android:pathData="M256,75.39c100.24,0 182,73.24 182.55,163.36 0,-0.36 0,-0.71 0,-1.06 0,-90.55 -82,-164.3 -182.56,-164.3S73.44,155.36 73.44,256c0,0.33 0,0.66 0,1C74,156.82 155.74,75.39 256,75.39Z"/>
+ <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M329,345.23H296.71a9,9 0,0 0,-9.13 9.12,7.45 7.45,0 0,0 0.07,0.95 9,9 0,0 1,9.06 -8.07H329A109.63,109.63 0,0 0,438.56 237.69c0,-0.31 0,-0.63 0,-0.94A109.62,109.62 0,0 1,329 345.23Z"/>
+ <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M256,436.51C155.74,436.51 74,355.08 73.45,255c0,0.33 0,0.66 0,1 0,100.59 82,182.56 182.56,182.56a45.66,45.66 0,0 0,45.64 -45.64c0,-0.35 0,-0.69 0,-1A45.66,45.66 0,0 1,256 436.51Z"/>
+ <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M356.41,221.44a27.38,27.38 0,0 1,27.36 26.38c0,-0.33 0,-0.67 0,-1a27.39,27.39 0,0 0,-54.77 0c0,0.33 0,0.67 0,1A27.38,27.38 0,0 1,356.41 221.44Z"/>
+ <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M301.64,148.41A27.39,27.39 0,0 1,329 174.8c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,1 0,-54.76 0c0,0.33 0,0.66 0,1A27.39,27.39 0,0 1,301.64 148.41Z"/>
+ <path android:fillColor="#8ab4f8" android:pathData="M155.59,246.82m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0"/>
+ <path android:fillAlpha="0.6" android:fillColor="#8ab4f8"
+ android:pathData="M210.36,173.8m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0" android:strokeAlpha="0.6"/>
+ <path android:fillAlpha="0.3" android:fillColor="#8ab4f8"
+ android:pathData="M301.64,173.8m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0" android:strokeAlpha="0.3"/>
+ <path android:fillColor="#1a73e8" android:pathData="M356.41,246.82m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0"/>
+ <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M155.59,274.2A27.38,27.38 0,0 0,183 246.82c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,0 1,-54.72 0c0,0.33 0,0.66 0,1A27.38,27.38 0,0 0,155.59 274.2Z"/>
+ <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+ android:pathData="M155.59,219.44a27.38,27.38 0,0 0,-27.38 27.38c0,0.33 0,0.67 0,1a27.38,27.38 0,0 1,54.72 0c0,-0.33 0,-0.67 0,-1A27.38,27.38 0,0 0,155.59 219.44Z" android:strokeAlpha="0.6"/>
+ <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+ android:pathData="M210.36,146.41A27.38,27.38 0,0 0,183 173.8c0,0.33 0,0.66 0,1a27.38,27.38 0,0 1,54.72 0c0,-0.34 0,-0.67 0,-1A27.38,27.38 0,0 0,210.36 146.41Z" android:strokeAlpha="0.6"/>
+ <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M210.36,201.18a27.38,27.38 0,0 0,27.38 -27.38c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,0 1,-54.72 0c0,0.33 0,0.66 0,1A27.38,27.38 0,0 0,210.36 201.18Z"/>
+ <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M301.64,199.18a27.38,27.38 0,0 1,-27.36 -26.38c0,0.33 0,0.66 0,1a27.38,27.38 0,0 0,54.76 0c0,-0.34 0,-0.67 0,-1A27.38,27.38 0,0 1,301.64 199.18Z"/>
+ <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+ android:pathData="M301.64,148.41A27.39,27.39 0,0 1,329 174.8c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,1 0,-54.76 0c0,0.33 0,0.66 0,1A27.39,27.39 0,0 1,301.64 148.41Z" android:strokeAlpha="0.6"/>
+ <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+ android:pathData="M356.41,221.44a27.38,27.38 0,0 1,27.36 26.38c0,-0.33 0,-0.67 0,-1a27.39,27.39 0,0 0,-54.77 0c0,0.33 0,0.67 0,1A27.38,27.38 0,0 1,356.41 221.44Z" android:strokeAlpha="0.6"/>
+ <path android:fillAlpha="0.1" android:fillColor="#FF000000" android:pathData="M356.41,272.2a27.38,27.38 0,0 1,-27.36 -26.38c0,0.33 0,0.66 0,1a27.39,27.39 0,0 0,54.77 0c0,-0.34 0,-0.67 0,-1A27.38,27.38 0,0 1,356.41 272.2Z"/>
+ <path android:pathData="M0,0.07V512H512V0Z">
+ <aapt:attr name="android:fillColor">
+ <gradient android:centerX="16.842121"
+ android:centerY="53.77451"
+ android:gradientRadius="512.5738" android:type="radial">
+ <item android:color="#19FFFFFF" android:offset="0"/>
+ <item android:color="#00FFFFFF" android:offset="1"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+</vector>
diff --git a/res/drawable/theme_cover_scrim.xml b/res/drawable/theme_cover_scrim.xml
index 029ea85..c75213c 100644
--- a/res/drawable/theme_cover_scrim.xml
+++ b/res/drawable/theme_cover_scrim.xml
@@ -17,10 +17,11 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <gradient
+ <gradient
android:angle="90"
- android:startColor="@android:color/transparent"
+ android:centerY="25%"
+ android:startColor="@color/black_38_alpha"
android:centerColor="@android:color/transparent"
- android:endColor="@color/translucent_black_darker"
+ android:endColor="@android:color/transparent"
android:type="linear" />
</shape>
\ No newline at end of file
diff --git a/res/drawable/theme_cover_scrim_custom.xml b/res/drawable/theme_cover_scrim_custom.xml
deleted file mode 100644
index de49be3..0000000
--- a/res/drawable/theme_cover_scrim_custom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Copyright (C) 2019 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.
--->
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:drawable="@drawable/theme_cover_scrim"/>
- <item>
- <shape android:shape="rectangle">
- <gradient
- android:angle="90"
- android:centerY="25%"
- android:startColor="@color/black_67_alpha"
- android:centerColor="@android:color/transparent"
- android:endColor="@android:color/transparent"
- android:type="linear" />
- </shape>
- </item>
-</layer-list>
\ No newline at end of file
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/fragment_clock_picker.xml b/res/layout/fragment_clock_picker.xml
index da4f891..e7530f3 100644
--- a/res/layout/fragment_clock_picker.xml
+++ b/res/layout/fragment_clock_picker.xml
@@ -23,40 +23,89 @@
android:background="?android:colorPrimary">
<include layout="@layout/section_header"/>
- <com.android.customization.widget.PreviewPager
- android:id="@+id/clock_preview_pager"
+ <FrameLayout
android:layout_width="match_parent"
- android:layout_height="0dp"
- 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="match_parent"
- android:layout_height="wrap_content"
- android:paddingVertical="10dp"
- android:orientation="vertical">
-
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/options_container"
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/content_section"
android:layout_width="match_parent"
- android:layout_height="@dimen/options_container_height"
- android:layout_gravity="center_horizontal"/>
+ android:layout_height="match_parent">
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingHorizontal="10dp">
+ <com.android.customization.widget.PreviewPager
+ android:id="@+id/clock_preview_pager"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/preview_pager_background"
+ app:layout_constrainedHeight="true"
+ app:layout_constraintBottom_toTopOf="@id/options_container"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+ app:layout_constraintHeight_min="@dimen/preview_pager_min_height"
+ app:layout_constraintVertical_bias="0.0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_chainStyle="spread_inside"/>
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/options_container"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/options_container_height"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="10dp"
+ app:layout_constraintBottom_toTopOf="@id/placeholder"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/clock_preview_pager"
+ app:layout_constraintVertical_bias="1.0"/>
+
+ <Space
+ android:id="@+id/placeholder"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/min_taptarget_height"
+ app:layout_constraintBottom_toTopOf="@id/apply_button"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_min="@dimen/min_taptarget_height"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/options_container"
+ app:layout_constraintVertical_bias="1.0"/>
+
<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>
+ android:layout_gravity="end"
+ android:layout_marginEnd="10dp"
+ android:layout_marginVertical="10dp"
+ android:layout_weight="1"
+ android:text="@string/apply_theme_btn"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"/>
+ </androidx.constraintlayout.widget.ConstraintLayout>
- </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/fragment_custom_theme_component.xml b/res/layout/fragment_custom_theme_component.xml
index e9dd927..fb9c36c 100644
--- a/res/layout/fragment_custom_theme_component.xml
+++ b/res/layout/fragment_custom_theme_component.xml
@@ -16,54 +16,85 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="?android:colorPrimary">
<include layout="@layout/section_header"/>
- <FrameLayout
- android:id="@+id/component_preview_container"
+ <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:background="?android:colorPrimary">
- <include
- android:id="@+id/component_preview_content"
+ android:layout_height="match_parent">
+
+ <FrameLayout
+ android:id="@+id/component_preview_container"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
- android:layout_marginTop="@dimen/preview_page_top_margin"
- android:layout_marginBottom="@dimen/component_preview_page_bottom_margin"
- layout="@layout/theme_component_preview"/>
- </FrameLayout>
- <View
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="@color/divider_color"/>
- <LinearLayout
- android:id="@+id/options_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingVertical="10dp"
- android:clipToPadding="false"
- android:orientation="vertical">
+ android:layout_height="0dp"
+ android:background="?android:colorPrimary"
+ app:layout_constrainedHeight="true"
+ app:layout_constraintBottom_toTopOf="@+id/guideline"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+ app:layout_constraintHorizontal_bias="0.5"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.0">
+
+ <include
+ android:id="@+id/component_preview_content"
+ layout="@layout/theme_component_preview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
+ android:layout_marginTop="@dimen/preview_page_top_margin"/>
+ </FrameLayout>
+ <View
+ android:id="@+id/divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/divider_color"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/component_preview_container"/>
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent=".7"/>
+
<TextView
android:id="@+id/component_options_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_margin="10dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginStart="10dp"
+ android:layout_marginEnd="10dp"
+ android:layout_marginBottom="10dp"
android:textAlignment="center"
- android:textAppearance="@style/HeaderTextAppearance"/>
+ android:textAppearance="@style/HeaderTextAppearance"
+ android:textSize="@dimen/component_options_title_size"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/component_preview_container"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintVertical_bias=".15"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/options_container"
android:layout_width="match_parent"
android:layout_height="@dimen/options_container_height"
- android:layout_gravity="center_horizontal"/>
+ android:layout_gravity="center_horizontal"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.5"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/component_options_title"
+ app:layout_constraintVertical_bias=".25"/>
- </LinearLayout>
-
+ </androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
diff --git a/res/layout/fragment_custom_theme_name.xml b/res/layout/fragment_custom_theme_name.xml
index 98feb60..6a3d1ba 100644
--- a/res/layout/fragment_custom_theme_name.xml
+++ b/res/layout/fragment_custom_theme_name.xml
@@ -16,59 +16,80 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:background="?android:colorPrimary">
<include layout="@layout/section_header"/>
- <FrameLayout
- android:id="@+id/component_preview_container"
+ <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:background="@color/secondary_color">
- <include
- android:id="@+id/component_preview_content"
+ android:layout_height="match_parent">
+
+ <FrameLayout
+ android:id="@+id/component_preview_container"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
- android:layout_marginTop="@dimen/preview_page_top_margin"
- android:layout_marginBottom="@dimen/component_preview_page_bottom_margin"
- layout="@layout/theme_preview_card"/>
- </FrameLayout>
- <LinearLayout
- android:id="@+id/options_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingVertical="10dp"
- android:clipToPadding="false"
- android:orientation="vertical">
+ android:layout_height="0dp"
+ android:background="@color/secondary_color"
+ app:layout_constrainedHeight="true"
+ app:layout_constraintBottom_toTopOf="@+id/guideline"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+ app:layout_constraintHorizontal_bias="0.5"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.0">
+
+ <include
+ android:id="@+id/component_preview_content"
+ layout="@layout/theme_preview_card"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
+ android:layout_marginTop="@dimen/preview_page_top_margin"
+ android:layout_marginBottom="@dimen/indicator_container_height"/>
+ </FrameLayout>
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent=".7"/>
<TextView
android:id="@+id/component_options_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_margin="10dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginStart="10dp"
+ android:layout_marginEnd="10dp"
+ android:layout_marginBottom="10dp"
android:textAlignment="center"
- android:textAppearance="@style/HeaderTextAppearance"/>
+ android:textAppearance="@style/HeaderTextAppearance"
+ android:textSize="@dimen/component_options_title_size"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/component_preview_container"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintVertical_bias=".15"/>
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="@dimen/options_container_height"
- android:layout_gravity="center">
+ <EditText
+ android:id="@+id/custom_theme_name"
+ style="@style/CustomThemeNameEditText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:importantForAutofill="no"
+ android:minWidth="300dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.5"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/component_options_title"
+ app:layout_constraintVertical_bias=".25"/>
- <EditText
- style="@style/CustomThemeNameEditText"
- android:id="@+id/custom_theme_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:minWidth="300dp"/>
- </FrameLayout>
- </LinearLayout>
+ </androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
diff --git a/res/layout/fragment_grid_picker.xml b/res/layout/fragment_grid_picker.xml
index d7618f3..182d795 100644
--- a/res/layout/fragment_grid_picker.xml
+++ b/res/layout/fragment_grid_picker.xml
@@ -16,46 +16,95 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_height="match_parent"
android:orientation="vertical"
android:background="?android:colorPrimary">
<include layout="@layout/section_header"/>
- <com.android.customization.widget.PreviewPager
- android:id="@+id/grid_preview_pager"
+ <FrameLayout
android:layout_width="match_parent"
- android:layout_height="0dp"
- 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="match_parent"
- android:layout_height="wrap_content"
- android:paddingVertical="10dp"
- android:orientation="vertical">
-
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/options_container"
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/content_section"
android:layout_width="match_parent"
- android:layout_height="@dimen/options_container_height"
- android:layout_gravity="center_horizontal"/>
+ android:layout_height="match_parent">
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingHorizontal="10dp">
+ <com.android.customization.widget.PreviewPager
+ android:id="@+id/grid_preview_pager"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/preview_pager_background"
+ app:card_style="screen_aspect_ratio"
+ app:layout_constrainedHeight="true"
+ app:layout_constraintBottom_toTopOf="@id/options_container"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+ app:layout_constraintHeight_min="@dimen/preview_pager_min_height"
+ app:layout_constraintVertical_bias="0.0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_chainStyle="spread_inside"/>
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/options_container"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/options_container_height"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="10dp"
+ app:layout_constraintBottom_toTopOf="@id/placeholder"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/grid_preview_pager"
+ app:layout_constraintVertical_bias="1.0"/>
+
+ <Space
+ android:id="@+id/placeholder"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/min_taptarget_height"
+ app:layout_constraintBottom_toTopOf="@id/apply_button"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/options_container"
+ app:layout_constraintVertical_bias="1.0"/>
+
<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>
+ android:layout_gravity="end"
+ android:layout_marginEnd="10dp"
+ android:layout_marginVertical="10dp"
+ android:layout_weight="1"
+ android:text="@string/apply_theme_btn"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"/>
- </LinearLayout>
+ </androidx.constraintlayout.widget.ConstraintLayout>
+ <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/fragment_theme_picker.xml b/res/layout/fragment_theme_picker.xml
index 2cfac1d..8272bde 100644
--- a/res/layout/fragment_theme_picker.xml
+++ b/res/layout/fragment_theme_picker.xml
@@ -16,56 +16,101 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="?android:colorPrimary">
<include layout="@layout/section_header"/>
- <com.android.customization.widget.PreviewPager
- android:id="@+id/theme_preview_pager"
+ <FrameLayout
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:background="@color/secondary_color"/>
+ android:layout_height="match_parent">
- <LinearLayout
- android:id="@+id/options_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingVertical="10dp"
- android:orientation="vertical">
-
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/options_container"
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/content_section"
android:layout_width="match_parent"
- android:layout_height="@dimen/options_container_height"
- android:layout_gravity="center_horizontal"/>
+ android:layout_height="match_parent">
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingHorizontal="10dp">
+ <com.android.customization.widget.PreviewPager
+ android:id="@+id/theme_preview_pager"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/preview_pager_background"
+ app:layout_constrainedHeight="true"
+ app:layout_constraintBottom_toTopOf="@id/options_container"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.0"
+ app:layout_constraintVertical_chainStyle="spread_inside"/>
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/options_container"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/options_container_height"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_marginTop="10dp"
+ android:layout_weight="1"
+ app:layout_constraintBottom_toTopOf="@id/use_my_wallpaper"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/theme_preview_pager"
+ app:layout_constraintVertical_bias="1.0"/>
+
<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:layout_height="@dimen/min_taptarget_height"
+ android:layout_marginStart="10dp"
android:ellipsize="end"
+ android:gravity="start|center_vertical"
android:paddingLeft="4dp"
- android:minHeight="@dimen/min_taptarget_height"
- android:text="@string/keep_my_wallpaper"/>
+ android:text="@string/keep_my_wallpaper"
+ app:layout_constraintBottom_toTopOf="@id/apply_button"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_min="@dimen/min_taptarget_height"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/options_container"
+ app:layout_constraintVertical_bias="1.0"/>
+
<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>
+ android:layout_gravity="end"
+ android:layout_marginEnd="10dp"
+ android:layout_marginBottom="10dp"
+ android:text="@string/apply_theme_btn"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"/>
+ </androidx.constraintlayout.widget.ConstraintLayout>
- </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/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/preview_card_color_content.xml b/res/layout/preview_card_color_content.xml
index 8587652..1de2cd4 100644
--- a/res/layout/preview_card_color_content.xml
+++ b/res/layout/preview_card_color_content.xml
@@ -75,14 +75,13 @@
android:layout_width="@dimen/preview_theme_icon_size"
android:layout_height="@dimen/preview_theme_icon_size"
android:layout_gravity="center"
- android:id="@+id/preview_color_qs_2_bg"
- android:tint="@color/tile_disabled_background_color"/>
+ android:id="@+id/preview_color_qs_2_bg"/>
<ImageView
android:layout_width="@dimen/preview_theme_tile_size"
android:layout_height="@dimen/preview_theme_tile_size"
android:layout_gravity="center"
android:id="@+id/preview_color_qs_2_icon"
- android:color="@color/tile_disabled_icon_color"/>
+ android:color="@color/tile_enabled_icon_color"/>
</FrameLayout>
</LinearLayout>
<Space
diff --git a/res/layout/preview_card_cover_content.xml b/res/layout/preview_card_cover_content.xml
index d052642..055a126 100644
--- a/res/layout/preview_card_cover_content.xml
+++ b/res/layout/preview_card_cover_content.xml
@@ -67,13 +67,12 @@
<ImageView
android:layout_width="@dimen/preview_theme_icon_size"
android:layout_height="@dimen/preview_theme_icon_size"
- android:id="@+id/preview_color_qs_2_bg"
- android:tint="@color/tile_disabled_background_color"/>
+ android:id="@+id/preview_color_qs_2_bg"/>
<ImageView
android:layout_width="@dimen/preview_theme_tile_size"
android:layout_height="@dimen/preview_theme_tile_size"
android:id="@+id/preview_color_qs_2_icon"
- android:color="@color/tile_disabled_icon_color"
+ android:tint="@color/tile_enabled_icon_color"
android:layout_gravity="center"/>
</FrameLayout>
diff --git a/res/layout/preview_card_font_content.xml b/res/layout/preview_card_font_content.xml
index 2a27b01..fb7879e 100644
--- a/res/layout/preview_card_font_content.xml
+++ b/res/layout/preview_card_font_content.xml
@@ -20,26 +20,39 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
- android:gravity="center_horizontal"
+ android:weightSum="7"
android:orientation="vertical"
tools:showIn="@layout/theme_preview_card">
<TextView
style="@style/FontCardTitleStyle"
android:id="@+id/font_card_title"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="16sp"
+ android:layout_weight="1.5"
+ android:layout_gravity="center"
android:gravity="center_horizontal"
+ android:maxLines="1"
android:text="@string/font_card_title"/>
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="0"/>
<View
android:id="@+id/font_card_divider"
android:layout_width="15dp"
android:layout_height="2dp"
- android:layout_marginVertical="@dimen/font_preview_divider_gap"
+ android:layout_gravity="center"
android:background="?android:colorAccent"/>
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"/>
<TextView
style="@style/FontCardBodyTextStyle"
android:id="@+id/font_card_body"
- android:layout_height="wrap_content"
+ android:layout_height="56sp"
+ android:layout_weight="2"
+ android:layout_gravity="bottom|center_horizontal"
android:gravity="center_horizontal"
android:text="@string/font_card_body"/>
</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/theme_color_option.xml b/res/layout/theme_color_option.xml
index 72acd8b..12fe623 100644
--- a/res/layout/theme_color_option.xml
+++ b/res/layout/theme_color_option.xml
@@ -18,7 +18,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:padding="4dp">
+ android:padding="8dp">
<ImageView
android:id="@+id/option_tile"
diff --git a/res/layout/theme_component_preview.xml b/res/layout/theme_component_preview.xml
index a087c0d..fe2f691 100644
--- a/res/layout/theme_component_preview.xml
+++ b/res/layout/theme_component_preview.xml
@@ -14,55 +14,48 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<FrameLayout
- xmlns:app="http://schemas.android.com/apk/res-auto"
+
+
+<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools" android:id="@+id/theme_preview_card_background"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/theme_preview_card_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:focusable="true" tools:showIn="@layout/theme_preview_card">
-
- <androidx.constraintlayout.widget.ConstraintLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingHorizontal="@dimen/preview_card_padding"
- android:paddingTop="@dimen/preview_card_padding"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.5"
- app:layout_constraintStart_toStartOf="parent">
+ android:clipToPadding="false"
+ 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_top_padding">
<ViewStub
android:id="@+id/theme_preview_top_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/theme_preview_topbar"
+ app:layout_constraintBottom_toTopOf="@+id/theme_preview_card_header"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"/>
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_chainStyle="spread_inside"/>
<TextView
android:id="@+id/theme_preview_card_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:layout_marginVertical="@dimen/card_header_top_margin"
- android:drawablePadding="12dp"
+ android:drawablePadding="@dimen/theme_preview_header_drawable_padding"
android:textAppearance="@style/CardTitleTextAppearance"
+ app:layout_constraintBottom_toTopOf="@id/theme_preview_card_body_container"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/theme_preview_top_bar"
- app:layout_goneMarginTop="@dimen/card_header_top_margin"/>
-
- <Space
- android:id="@+id/theme_preview_content_spacer"
- android:layout_width="0dp"
- android:layout_height="0dp"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHeight_max="48dp"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_header"/>
+ app:layout_goneMarginTop="@dimen/card_header_top_margin"
+ app:layout_constraintVertical_chainStyle="spread_inside"
+ tools:text="Default"/>
<FrameLayout
android:id="@+id/theme_preview_card_body_container"
@@ -76,23 +69,23 @@
app:layout_constraintHeight_min="@dimen/preview_theme_content_min_height"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/theme_preview_content_spacer">
-
- </FrameLayout>
+ app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_header"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
- app:layout_constraintGuide_end="40dp"
- />
+ app:layout_constraintBottom_toTopOf="@+id/edit_label"
+ app:layout_constraintGuide_end="@dimen/preview_theme_content_bottom"
+ app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_body_container"/>
<TextView
android:id="@+id/edit_label"
style="@style/EditLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_taptarget_height"
android:drawableStart="@drawable/ic_tune"
android:drawablePadding="8dp"
android:gravity="center"
@@ -102,8 +95,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_body_container"
+ app:layout_constraintTop_toBottomOf="@+id/guideline"
app:layout_constraintVertical_bias="0.5"/>
- </androidx.constraintlayout.widget.ConstraintLayout>
-</FrameLayout>
\ No newline at end of file
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/theme_icon_option.xml b/res/layout/theme_icon_option.xml
index 4872ffc..62925ad 100644
--- a/res/layout/theme_icon_option.xml
+++ b/res/layout/theme_icon_option.xml
@@ -38,6 +38,7 @@
android:id="@+id/option_icon"
android:layout_width="@dimen/component_icon_thumb_size"
android:layout_height="@dimen/component_icon_thumb_size"
- android:layout_gravity="center"/>
+ android:layout_gravity="center"
+ android:tint="?android:colorForeground"/>
</FrameLayout>
</LinearLayout>
diff --git a/res/layout/theme_option.xml b/res/layout/theme_option.xml
index de81231..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
@@ -45,7 +47,8 @@
android:layout_height="@dimen/theme_option_icon_sample_height"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
- android:layout_margin="@dimen/theme_option_sample_padding"/>
+ android:layout_margin="@dimen/theme_option_sample_padding"
+ android:tint="?android:colorForeground"/>
<ImageView
android:id="@+id/theme_option_shape"
android:layout_width="@dimen/theme_option_shape_sample_width"
diff --git a/res/layout/theme_preview_topbar.xml b/res/layout/theme_preview_topbar.xml
index 2422064..15b665d 100644
--- a/res/layout/theme_preview_topbar.xml
+++ b/res/layout/theme_preview_topbar.xml
@@ -20,13 +20,15 @@
android:id="@+id/theme_preview_top_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- tools:visibility="visible" tools:showIn="@layout/theme_preview_card">
+ tools:visibility="visible"
+ tools:showIn="@layout/theme_preview_card">
<TextView
android:id="@+id/theme_preview_clock"
android:layout_width="wrap_content"
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-af/strings.xml b/res/values-af/strings.xml
index 9ec9fbb..63c127b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Gebruik <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nee, dankie"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>-horlosievoorskou"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Oeps! Iets het skeefgeloop."</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index b28e5c4..ae13d48 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ን ይጠቀሙ"</string>
<string name="no_thanks" msgid="7286616980115687627">"አይ፣ አመሰግናለሁ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"የ<xliff:g id="ID_1">%1$s</xliff:g> ሰዓት ቅድመ-እይታ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"ውይ! የሆነ ችግር ተፈጥሯል።"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 4ba6689..39173b0 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"استخدام <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"لا، شكرًا"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"معاينة الساعة <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"عفوًا! حدث خطأ ما."</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 74d907b..fc322f4 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ব্যৱহাৰ কৰক"</string>
<string name="no_thanks" msgid="7286616980115687627">"নালাগে, ধন্যবাদ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ঘড়ীৰ পূৰ্বদৰ্শন"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"দুঃখিত! কিবা ভুল হ’ল।"</string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index e8de0e2..e1001c9 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> istifadə edin"</string>
<string name="no_thanks" msgid="7286616980115687627">"Xeyr, təşəkkürlər"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>, saatın önizlənməsi"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups! Xəta baş verdi."</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 48bd436..cb4becd 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Koristi <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Pregled sata <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups! Došlo je do greške."</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index e48b7bc..a1b4262 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Выкарыстоўваць <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Не, дзякуй"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Папярэдні прагляд гадзінніка <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Памылка! Нешта пайшло не так."</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index d6599d0..ebd909a 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Използване на „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
<string name="no_thanks" msgid="7286616980115687627">"Не, благодаря"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Визуализация на циферблата <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ами сега! Нещо се обърка."</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index fc5f9f7..9d45e49 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ব্যবহার করুন"</string>
<string name="no_thanks" msgid="7286616980115687627">"না, থাক"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ঘড়ির প্রিভিউ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"উপস! কিছু সমস্যা হয়েছে।"</string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 68f3928..c09fdef 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Koristi stil <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Pregled sata <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups! Nešto nije uredu"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index f9cc32c..9ba191e 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Utilitza l\'estil <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"No, gràcies"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Previsualització de rellotge <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Vaja! S\'ha produït un error."</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 5c5f492..77ce470 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Použít styl <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ne, děkuji"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Náhled ciferníku <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Jejda. Něco se pokazilo."</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 552ea19..848709b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Brug <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nej tak"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Forhåndsvisning af urskiven <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups! Noget gik galt."</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index c4b44ad..681350f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> verwenden"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nein danke"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Vorschau für Zifferblatt <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hoppla, ein Fehler ist aufgetreten."</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index fbab553..fae57a5 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Χρήση <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Όχι, ευχαριστώ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Προεπισκόπηση ρολογιού <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Δυστυχώς, παρουσιάστηκε κάποιο πρόβλημα."</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 2208e8a..756ad00 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Use <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"No thanks"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> clock preview"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Oops! Something went wrong."</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 2208e8a..756ad00 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Use <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"No thanks"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> clock preview"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Oops! Something went wrong."</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 2208e8a..756ad00 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Use <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"No thanks"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> clock preview"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Oops! Something went wrong."</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 4dfe37a..7c372ae 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Usar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"No, gracias"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Vista previa del reloj <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Se produjo un error."</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index bc5b565..47b3b8b 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Utilizar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"No, gracias"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Vista previa del reloj <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"¡Vaya! Se ha producido un error."</string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 59308e2..d6230af 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Kasuta teemat <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Tänan, ei"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Kella <xliff:g id="ID_1">%1$s</xliff:g> eelvaade"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Vabandust! Midagi läks valesti."</string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index df84512..e461865 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Erabili <xliff:g id="ID_1">%1$s</xliff:g> estiloa"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ez"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> erlojuaren aurrebista"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Arazoren bat izan da."</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 9af1cdb..5ffd461 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"استفاده از <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"نه، متشکرم"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> پیشنمایش ساعت"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"متأسفم! مشکلی رخ داد."</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index d2fd65b..696b5d3 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Valitse <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ei kiitos"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Kellon esikatselu: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hups! Jokin meni vikaan."</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 9ab562b..c4b0224 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Utiliser <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Non, merci"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Aperçu de l\'horloge <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Oups! Une erreur s\'est produite."</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 417eebd..e28b35e 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Utiliser <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Non, merci"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> aperçu d\'horloge"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Petit problème… Une erreur s\'est produite."</string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 73b4ce1..2cdb267 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Utilizar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Non, grazas"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Vista previa do reloxo <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ai! Produciuse un erro."</string>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index d344bdd..d94c671 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>નો ઉપયોગ કરો"</string>
<string name="no_thanks" msgid="7286616980115687627">"ના, આભાર"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ઘડિયાળનું પ્રીવ્યૂ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"અરેરે! કંઈક ખોટું થયું."</string>
</resources>
diff --git a/res/values-h740dp/dimens.xml b/res/values-h740dp/dimens.xml
new file mode 100644
index 0000000..a752b6b
--- /dev/null
+++ b/res/values-h740dp/dimens.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Copyright (C) 2019 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.
+-->
+<resources>
+ <dimen name="preview_theme_content_margin">12dp</dimen>
+
+ <dimen name="preview_theme_icon_size">40dp</dimen>
+ <dimen name="preview_theme_tile_size">20dp</dimen>
+ <dimen name="preview_theme_shape_size">52dp</dimen>
+ <dimen name="preview_theme_cover_content_extra_margin">8dp</dimen>
+
+ <dimen name="preview_theme_content_min_height">152dp</dimen>
+
+ <dimen name="theme_preview_header_drawable_padding">12dp</dimen>
+
+ <dimen name="card_header_top_margin">16dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 7e349c9..50e26a8 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> इस्तेमाल करें"</string>
<string name="no_thanks" msgid="7286616980115687627">"रहने दें"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> घड़ी की झलक"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"ओह हो! कुछ गड़बड़ी हुई."</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index fd3990f..b3166b1 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Koristi <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Pregled sata <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups! Došlo je do pogreške."</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 3425778..ee4df61 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> használata"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nem, köszönöm"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> – óra előnézete"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hoppá! Valami hiba történt."</string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 4d0e281..94f4d1c 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Օգտագործել <xliff:g id="ID_1">%1$s</xliff:g> ոճը"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ոչ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ժամացույցի նախադիտում"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Սխալ առաջացավ։"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1002084..67721f8 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Gunakan <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Lain kali"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Pratinjau jam <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups! Ada yang tidak beres."</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 02d46c7..8474c87 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Nota „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nei, takk"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> forskoðun klukku"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Úbbs! Eitthvað fór úrskeiðis."</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 3fd0c72..1a46542 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Usa <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"No, grazie"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Anteprima dell\'orologio <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Spiacenti. Si è verificato un problema."</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5137153..f8d444b 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"שימוש בעיצוב <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"לא תודה"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"תצוגה מקדימה של שעון <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"אופס! משהו השתבש."</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b792418..f95c696 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> を使用"</string>
<string name="no_thanks" msgid="7286616980115687627">"いいえ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> クロックのプレビュー"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"問題が発生しました。"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 4bc9afb..5e6cab0 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>-ის გამოყენება"</string>
<string name="no_thanks" msgid="7286616980115687627">"არა, გმადლობთ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> საათის გადახედვა"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"უკაცრავად! წარმოიქმნა შეფერხება."</string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index a7e5291..c8aa174 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> пайдалану"</string>
<string name="no_thanks" msgid="7286616980115687627">"Жоқ, рақмет"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> сағатын алдын ала қарау"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Қап! Бірдеңе дұрыс болмады."</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 2a7e623..1bc2e7f 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"ប្រើ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"ទេ អរគុណ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"ការមើលនាឡិកា <xliff:g id="ID_1">%1$s</xliff:g> សាកល្បង"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"អូ៎! មានអ្វីមួយខុសប្រក្រតី។"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 272d91e..0bffb94 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ಅನ್ನು ಬಳಸಿ"</string>
<string name="no_thanks" msgid="7286616980115687627">"ಬೇಡ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ಗಡಿಯಾರ ಪೂರ್ವವೀಕ್ಷಣೆ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"ಓಹ್! ಯಾವುದೋ ತಪ್ಪು ಸಂಭವಿಸಿದೆ."</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 80a24c0..2cdd6a8 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> 사용"</string>
<string name="no_thanks" msgid="7286616980115687627">"아니요"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> 시계 미리보기"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"죄송합니다. 문제가 발생했습니다."</string>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index f13c07d..bcd7cea 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> колдонулсун"</string>
<string name="no_thanks" msgid="7286616980115687627">"Жок, рахмат"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> саатын алдын ала көрүү"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ой! Бир жерден ката кетти."</string>
</resources>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 4b16b5e..985987f 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -17,22 +17,31 @@
-->
<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_icon_size">24dp</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-lo/strings.xml b/res/values-lo/strings.xml
index 1ad275c..3b9dd17 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"ໃຊ້ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"ບໍ່, ຂອບໃຈ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"ຕົວຢ່າງໂມງ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"ຂໍອະໄພ! ເກີດບາງຢ່າງຜິດພາດຂຶ້ນ."</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 997608e..07984e6 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Naudoti „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ne, ačiū"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Ciferblato „<xliff:g id="ID_1">%1$s</xliff:g>“ peržiūra"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Oi, kažkas nepavyko."</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index a325e15..c671560 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Izmantojiet <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nē, paldies"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>: pulksteņa priekšskatījums"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Diemžēl radās problēma."</string>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 19b3c23..cf58de7 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Користи <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Не, фала"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Преглед на часовник <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Оф леле! Нешто тргна наопаку."</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index f1b8451..ea0488a 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ഉപയോഗിക്കുക"</string>
<string name="no_thanks" msgid="7286616980115687627">"വേണ്ട"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ക്ലോക്ക് പ്രിവ്യൂ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"ക്ഷമിക്കണം! എന്തോ കുഴപ്പമുണ്ടായി."</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 5084797..136afb1 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>-г ашиглах"</string>
<string name="no_thanks" msgid="7286616980115687627">"Үгүй, баярлалаа"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> цагийг урьдчилан үзэх"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Өө! Алдаа гарлаа."</string>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index b8bf7ce..a5e0550 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> वापरा"</string>
<string name="no_thanks" msgid="7286616980115687627">"नाही, नको"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> घड्याळाचे पूर्वावलोकन"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"अरेरे! काहीतरी चूक झाली."</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 8afa281..87d6f6d 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Gunakan <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Tidak perlu"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> pratonton jam"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Op! Berlaku kesilapan."</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 4c280e7..a0f8435 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> သုံးရန်"</string>
<string name="no_thanks" msgid="7286616980115687627">"မလိုပါ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> နာရီ အစမ်းကြည့်ခြင်း"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"သည်းခံပါ။ တစ်ခုခု မှားသွားသည်။"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 534c219..062a98b 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Bruk <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nei takk"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Forhåndsvisning av <xliff:g id="ID_1">%1$s</xliff:g>-klokke"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Beklager, men noe gikk galt."</string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 6d55db8..5b3c636 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> प्रयोग गर्नु…"</string>
<string name="no_thanks" msgid="7286616980115687627">"पर्दैन, धन्यवाद"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> घडीको पूर्वावलोकन"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"हत्तेरिका! केही चिज गडबड भयो।"</string>
</resources>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index 6a79445..b567d0d 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -18,7 +18,7 @@
<resources>
<color name="theme_preview_icon_color">@color/white_70_alpha</color>
- <color name="icon_thumbnail_color">@color/white_70_alpha</color>
+ <color name="icon_thumbnail_color">@color/white_88_alpha</color>
<color name="control_grey">#b3b3b3</color>
<color name="switch_track_tint">#171717</color>
@@ -28,6 +28,8 @@
<color name="tile_disabled_icon_color">@color/light_grey</color>
<color name="tile_disabled_background_color">#353535</color>
+ <color name="shape_option_tile_foreground_color">@color/edit_background_base</color>
+
<color name="tip_dot_color">#81C995</color>
<color name="tip_dot_line_color">#000000</color>
@@ -35,9 +37,12 @@
<color name="selected_check_background_color">#81C995</color>
<color name="toolbar_icon_color">@color/text_color_light</color>
- <color name="toolbar_color">#000000</color>
<color name="divider_color">@color/white_14_alpha</color>
<color name="edit_background_base">@color/material_white_100</color>
+
+ <color name="cover_title_color">@color/white_88_alpha</color>
+
+ <color name="preview_pager_background">@color/google_grey900</color>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 256faab..71f7f24 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> gebruiken"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nee, bedankt"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Voorbeeld van <xliff:g id="ID_1">%1$s</xliff:g>-klok bekijken"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Er is iets misgegaan."</string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 07905b8..071664a 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="no_thanks" msgid="7286616980115687627">"ନାହିଁ, ଥାଉ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ଘଣ୍ଟାର ପୂର୍ବାବଲୋକନ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"ଓହୋଃ, କିଛି ଭୁଲ ହୋଇଗଲା।"</string>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 07c67ef..61d89a0 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ਵਰਤੋ"</string>
<string name="no_thanks" msgid="7286616980115687627">"ਨਹੀਂ, ਧੰਨਵਾਦ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ਘੜੀ ਦੀ ਪੂਰਵ-ਝਲਕ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"ਓਹੋ! ਕੋਈ ਗੜਬੜ ਹੋਈ।"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7903977..7b94f32 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Użyj motywu <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nie, dziękuję"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Podgląd zegara <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups. Coś poszło nie tak."</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 132119c..73dc198 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Utilizar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Não, obrigado"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Pré-visualização do relógio <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ups! Ocorreu um erro."</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1bf6795..417280b 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Usar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Não"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Visualização do relógio <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ops! Algo deu errado."</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 2a18739..04e1a3f 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Folosiți <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nu, mulțumesc"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Previzualizarea ceasului <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hopa! Ceva nu a funcționat cum trebuie."</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index fac53b9..0b356fc 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>: использовать"</string>
<string name="no_thanks" msgid="7286616980115687627">"Нет"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>: предварительный просмотр циферблата"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Произошла ошибка."</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 7b4a6db..b9e20a3 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> භාවිතා කරන්න"</string>
<string name="no_thanks" msgid="7286616980115687627">"එපා, ස්තූතියි"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ඔරලෝසු පෙරදසුන"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"අපොයි! යමක් වැරදී ගියේය."</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index c836aca..336c221 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Použiť <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nie, ďakujem"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Ukážka ciferníka <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ojoj! Niečo sa pokazilo."</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 38be787..b2415a6 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Uporabi slog <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Predogled ure <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ojoj, prišlo je do napake."</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 8b199d9..b6b9c45 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Përdor <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Jo, faleminderit"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Pamja paraprake e orës <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Mos! Ndodhi një gabim."</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 3b6bf6d..afe91b4 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Користи <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Не, хвала"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Преглед сата <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Упс! Дошло је до грешке."</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index ea1e7f0..d124728 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Använd <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Nej tack"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Förhandsvisning av urtavlan <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hoppsan! Något gick fel."</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 049a4e1..db157ae 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Tumia <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Hapana, asante"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Onyesho la kukagua saa ya <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Lo! Hitilafu imetokea."</string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index e9609b0..a539944 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ஐப் பயன்படுத்து"</string>
<string name="no_thanks" msgid="7286616980115687627">"வேண்டாம்"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> கடிகார மாதிரிக்காட்சி"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"அச்சச்சோ! ஏதோ தவறாகிவிட்டது."</string>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index bbf4026..12dd69d 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ని ఉపయోగించు"</string>
<string name="no_thanks" msgid="7286616980115687627">"వద్దు, ధన్యవాదం"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> గడియార ప్రివ్యూ"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"అయ్యో, ఏదో తప్పు జరిగింది."</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index cae0802..d061f5e 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"ใช้ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"ไม่เป็นไร"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"ตัวอย่างนาฬิกา <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"อ๊ะ! มีบางอย่างผิดปกติ"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index b6d174f..cdc7de1 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Gamitin ang <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Hindi, salamat"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> preview ng orasan"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Oops! May maling nangyari."</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index ca6089f..575f052 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> stilini kullan"</string>
<string name="no_thanks" msgid="7286616980115687627">"Hayır"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> saat önizleme"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hay aksi! Bir hata oluştu."</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 812a78b..9e04c90 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Вибрати стиль \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
<string name="no_thanks" msgid="7286616980115687627">"Ні, дякую"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Попередній перегляд годинника \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Сталася помилка."</string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index cce806c..e3b6823 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> استعمال کریں"</string>
<string name="no_thanks" msgid="7286616980115687627">"نہیں، شکریہ"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> گھڑی کا پیش منظر"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"افوہ! کچھ غلط ہوگیا۔"</string>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 88cd360..1d0c62b 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ishlatish"</string>
<string name="no_thanks" msgid="7286616980115687627">"Kerak emas"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> soatiga razm solish"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Ana xolos! Xatolik yuz berdi."</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 2fc7c83..f688d90 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Sử dụng <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Không, cảm ơn"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"Bản xem trước đồng hồ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Rất tiếc! Đã xảy ra lỗi."</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index f907108..52a0bda 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"使用<xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"不用了"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>时钟预览"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"糟糕!遇到了问题。"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 34ddf83..91ed965 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"使用「<xliff:g id="ID_1">%1$s</xliff:g>」"</string>
<string name="no_thanks" msgid="7286616980115687627">"不用了,謝謝"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"「<xliff:g id="ID_1">%1$s</xliff:g>」時鐘預覽"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"糟糕!發生錯誤。"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index b0d12a0..de8381a 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"使用「<xliff:g id="ID_1">%1$s</xliff:g>」"</string>
<string name="no_thanks" msgid="7286616980115687627">"不用了,謝謝"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"「<xliff:g id="ID_1">%1$s</xliff:g>」時鐘預覽畫面"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"糟糕!發生錯誤。"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 8bf2d53..2ead0b0 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -65,4 +65,5 @@
<string name="use_style_button" msgid="1754493078383627019">"Sebenzisa i-<xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="no_thanks" msgid="7286616980115687627">"Cha, ngiyabonga"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ukubuka kuqala iwashi"</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hawu! Kukhona okungahambile kahle."</string>
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index bc27623..3d646f9 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -16,9 +16,11 @@
limitations under the License.
-->
<resources>
+ <color name="icon_background">#FF4285f4</color>
<color name="black_14_alpha">#24000000</color>
<color name="white_14_alpha">#24FFFFFF</color>
<color name="google_grey700">#5f6368</color>
+ <color name="google_grey900">#202124</color>
<color name="status_bar_color">#ffffffff</color>
@@ -26,7 +28,9 @@
<color name="system_navigation_bar_divider">#1f000000</color>
<color name="shape_thumbnail_color">#b2b2b2</color>
- <color name="icon_thumbnail_color">@color/white_70_alpha</color>
+ <color name="icon_thumbnail_color">@color/black_87_alpha</color>
+
+ <color name="option_border_default">@color/edit_background_base</color>
<color name="clockface_preview_background">@android:color/black</color>
@@ -45,7 +49,7 @@
<color name="tile_disabled_icon_color">#2d2d2d</color>
<color name="tile_disabled_background_color">@color/light_grey</color>
- <color name="shape_option_tile_foreground_color">#f8f9fa</color>
+ <color name="shape_option_tile_foreground_color">@color/edit_background_base</color>
<color name="tip_dot_color">#34A853</color>
<color name="tip_dot_line_color">#FFFFFF</color>
@@ -58,4 +62,8 @@
<color name="divider_color">@color/black_14_alpha</color>
<color name="edit_background_base">@color/google_grey700</color>
+
+ <color name="cover_title_color">@color/black_87_alpha</color>
+
+ <color name="preview_pager_background">@color/secondary_color</color>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ed05ee5..b6aac0b 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>
@@ -39,7 +39,7 @@
<dimen name="component_preview_page_bottom_margin">16dp</dimen>
<!-- Dimensions for the customization option tiles -->
- <dimen name="options_container_height">100dp</dimen>
+ <dimen name="options_container_height">104dp</dimen>
<dimen name="options_container_width">0dp</dimen>
<dimen name="option_tile_width">72dp</dimen>
<dimen name="theme_option_icon_sample_height">18dp</dimen>
@@ -58,25 +58,35 @@
<dimen name="theme_option_font_text_size">16dp</dimen>
<dimen name="theme_option_title_font_text_size">12sp</dimen>
- <dimen name="option_tile_margin_horizontal">2dp</dimen>
+ <dimen name="option_tile_margin_horizontal">6dp</dimen>
<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>
- <dimen name="card_header_top_margin">16dp</dimen>
- <dimen name="preview_theme_content_margin">40dp</dimen>
+ <dimen name="card_header_icon_size">32dp</dimen>
+ <dimen name="card_header_top_margin">0dp</dimen>
+ <dimen name="preview_pager_max_height">450dp</dimen>
+ <dimen name="preview_pager_min_height">350dp</dimen>
+ <dimen name="preview_theme_max_height">400dp</dimen>
+ <dimen name="preview_theme_min_height">180dp</dimen>
+ <dimen name="theme_preview_header_drawable_padding">8dp</dimen>
+ <dimen name="preview_theme_content_margin">18dp</dimen>
<dimen name="preview_theme_content_max_height">192dp</dimen>
- <dimen name="preview_theme_content_min_height">152dp</dimen>
- <dimen name="preview_theme_icon_size">40dp</dimen>
- <dimen name="preview_theme_tile_size">20dp</dimen>
- <dimen name="preview_theme_shape_size">52dp</dimen>
- <dimen name="preview_theme_cover_topbar_icon_size">20dp</dimen>
- <dimen name="preview_theme_cover_content_extra_margin">8dp</dimen>
+ <dimen name="preview_theme_content_min_height">120dp</dimen>
+ <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>
+ <dimen name="font_preview_divider_gap">24dp</dimen>
<dimen name="custom_theme_nav_height">56dp</dimen>
@@ -85,14 +95,16 @@
<dimen name="component_icon_thumb_size">40dp</dimen>
- <dimen name="component_color_chip_size">42dp</dimen>
+ <dimen name="component_color_chip_size">32dp</dimen>
<dimen name="component_shape_thumb_size">72dp</dimen>
<dimen name="option_border_width">2dp</dimen>
<dimen name="option_selected_border_width">3dp</dimen>
+ <dimen name="component_options_title_size">18sp</dimen>
<!-- For a corner radius of this size or larger, we'll preview a rounded qsb widget. -->
<dimen name="roundCornerThreshold">16dp</dimen>
<dimen name="min_taptarget_height">48dp</dimen>
+
</resources>
diff --git a/res/values/override.xml b/res/values/override.xml
index 818f357..a01507e 100644
--- a/res/values/override.xml
+++ b/res/values/override.xml
@@ -31,10 +31,10 @@
typically GMS apps so they should be available in GMS devices. -->
<array name="icon_shape_preview_packages">
<item>com.google.android.gm</item>
- <item>com.google.android.apps.maps</item>
+ <item>com.google.android.googlequicksearchbox</item>
<item>com.google.android.apps.photos</item>
<item>com.google.android.apps.docs</item>
<item>com.google.android.youtube</item>
<item>com.android.vending</item>
</array>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 46de146..f571b6b 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -187,4 +187,7 @@
<!-- Content description for a screen showing the preview of a clock face. [CHAR_LIMIT=NONE] -->
<string name="clock_preview_content_description"><xliff:g name="clock_name">%1$s</xliff:g> clock preview</string>
+
+ <!-- Generic error message [CHAR_LIMIT=NONE] -->
+ <string name="something_went_wrong">Oops! Something went wrong.</string>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 800e99a..1289a87 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -15,6 +15,8 @@
limitations under the License.
-->
<resources>
+
+ <!-- Main themes -->
<style name="CustomizationTheme" parent="@android:style/Theme.DeviceDefault.Settings">
<item name="colorPrimary">?android:colorPrimary</item>
@@ -30,6 +32,7 @@
<item name="actionButtonStyle">?android:actionButtonStyle</item>
<item name="actionMenuTextColor">?android:actionMenuTextColor</item>
</style>
+
<style name="CustomizationTheme.NoActionBar">
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
@@ -37,10 +40,11 @@
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
+ <!-- Bottom nav -->
<style name="BottomNavStyle">
<item name="itemIconTint">@color/bottom_nav_item_color</item>
<item name="itemTextColor">@color/bottom_nav_item_color</item>
- <item name="itemTextAppearanceActive">@style/BottomNavTextAppearance</item>
+ <item name="itemTextAppearanceActive">@style/BottomNavTextAppearanceActive</item>
<item name="itemTextAppearanceInactive">@style/BottomNavTextAppearance</item>
<item name="itemBackground">?android:attr/selectableItemBackgroundBorderless</item>
<item name="android:background">?android:colorPrimary</item>
@@ -49,27 +53,26 @@
<style name="BottomNavTextAppearance" parent="HeaderTextAppearance">
<item name="android:textSize">@dimen/bottom_navbar_font_text_size</item>
</style>
- <style name="RegularToolbarStyle" parent="@android:style/Widget.DeviceDefault.Light.ActionBar.Solid">
- <item name="android:background">@color/toolbar_color</item>
- <item name="android:elevation">0dp</item>
- <item name="android:theme">@style/WallpaperTheme</item>
+
+ <style name="BottomNavTextAppearanceActive" parent="BottomNavTextAppearance">
+ <item name="android:textStyle">bold</item>
</style>
- <style name="HeaderTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
- <item name="android:textFontWeight">400</item>
- </style>
+ <!-- Common components and widgets -->
+ <style name="HeaderTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"/>
<style name="ActionPrimaryButton" parent="android:Widget.DeviceDefault.Button.Colored"/>
<style name="ActionSecondaryButton" parent="android:Widget.DeviceDefault.Button.Borderless.Colored"/>
+ <!-- Option tiles -->
<style name="OptionTitleTextAppearance" parent="HeaderTextAppearance">
<item name="android:textColor">@color/option_title_color</item>
<item name="android:textAlignment">center</item>
<item name="android:textSize">@dimen/theme_option_title_font_text_size</item>
</style>
-
+ <!-- Preview cards -->
<style name="PreviewCard" parent="CardView">
<item name="cardCornerRadius">?android:dialogCornerRadius</item>
<item name="android:clipChildren">true</item>
@@ -90,7 +93,7 @@
<style name="CoverTitleTextAppearance" parent="CardTitleTextAppearance">
<item name="android:textSize">@dimen/card_cover_title_text_size</item>
- <item name="android:textColor">@color/white_70_alpha</item>
+ <item name="android:textColor">@color/cover_title_color</item>
</style>
<style name="FontCardTitleStyle" parent="HeaderTextAppearance">
@@ -104,9 +107,11 @@
<item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault</item>
</style>
+ <!-- Custom theme editor -->
<style name="EditLabelStyle">
- <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault</item>
+ <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Widget.Button</item>
<item name="android:textColor">@color/material_white_100</item>
+ <item name="android:textAllCaps">false</item>
</style>
<style name="CustomThemeNameEditText" parent="@android:style/Widget.DeviceDefault.EditText">
diff --git a/src/com/android/customization/model/CustomizationManager.java b/src/com/android/customization/model/CustomizationManager.java
index 3296ca1..7b9f463 100644
--- a/src/com/android/customization/model/CustomizationManager.java
+++ b/src/com/android/customization/model/CustomizationManager.java
@@ -15,6 +15,9 @@
*/
package com.android.customization.model;
+import android.util.Log;
+import android.widget.Toast;
+
import androidx.annotation.Nullable;
import java.util.List;
@@ -49,6 +52,15 @@
* Called when the options have been retrieved.
*/
void onOptionsLoaded(List<T> options);
+
+ /**
+ * Called if there was an error loading grid options
+ */
+ default void onError(@Nullable Throwable throwable) {
+ if (throwable != null) {
+ Log.e("OptionsFecthedListener", "Error loading options", throwable);
+ }
+ }
}
/**
diff --git a/src/com/android/customization/model/ResourceConstants.java b/src/com/android/customization/model/ResourceConstants.java
index be3b548..0b1dec2 100644
--- a/src/com/android/customization/model/ResourceConstants.java
+++ b/src/com/android/customization/model/ResourceConstants.java
@@ -83,7 +83,9 @@
"ic_qs_dnd",
"ic_qs_flashlight",
"ic_qs_auto_rotate",
- "ic_qs_airplane"
+ "ic_qs_airplane",
+ "ic_signal_cellular_3_4_bar",
+ "ic_battery_80_24dp"
};
ArrayList<String> sTargetPackages = new ArrayList<>();
diff --git a/src/com/android/customization/model/clock/ClockManager.java b/src/com/android/customization/model/clock/ClockManager.java
index 3744317..4e77a49 100644
--- a/src/com/android/customization/model/clock/ClockManager.java
+++ b/src/com/android/customization/model/clock/ClockManager.java
@@ -17,9 +17,13 @@
import android.content.ContentResolver;
import android.provider.Settings.Secure;
+import android.text.TextUtils;
import com.android.customization.module.ThemesUserEventLogger;
+import org.json.JSONException;
+import org.json.JSONObject;
+
/**
* {@link CustomizationManager} for clock faces that implements apply by writing to secure settings.
*/
@@ -27,6 +31,8 @@
// TODO: use constant from Settings.Secure
static final String CLOCK_FACE_SETTING = "lock_screen_custom_clock_face";
+ private static final String CLOCK_FIELD = "clock";
+ private static final String TIMESTAMP_FIELD = "_applied_timestamp";
private final ContentResolver mContentResolver;
private final ThemesUserEventLogger mEventLogger;
@@ -39,7 +45,15 @@
@Override
protected void handleApply(Clockface option, Callback callback) {
- boolean stored = Secure.putString(mContentResolver, CLOCK_FACE_SETTING, option.getId());
+ boolean stored;
+ try {
+ final JSONObject json = new JSONObject();
+ json.put(CLOCK_FIELD, option.getId());
+ json.put(TIMESTAMP_FIELD, System.currentTimeMillis());
+ stored = Secure.putString(mContentResolver, CLOCK_FACE_SETTING, json.toString());
+ } catch (JSONException ex) {
+ stored = false;
+ }
if (stored) {
mEventLogger.logClockApplied(option);
callback.onSuccess();
@@ -50,6 +64,15 @@
@Override
protected String lookUpCurrentClock() {
- return Secure.getString(mContentResolver, CLOCK_FACE_SETTING);
+ final String value = Secure.getString(mContentResolver, CLOCK_FACE_SETTING);
+ if (TextUtils.isEmpty(value)) {
+ return value;
+ }
+ try {
+ final JSONObject json = new JSONObject(value);
+ return json.getString(CLOCK_FIELD);
+ } catch (JSONException ex) {
+ return value;
+ }
}
}
diff --git a/src/com/android/customization/model/clock/ContentProviderClockProvider.java b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
index 375f3c1..ad60ddc 100644
--- a/src/com/android/customization/model/clock/ContentProviderClockProvider.java
+++ b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
@@ -37,27 +37,35 @@
@Override
public boolean isAvailable() {
- return mProviderInfo != null;
+ return mProviderInfo != null && (mClocks == null || !mClocks.isEmpty());
}
@Override
public void fetch(OptionsFetchedListener<Clockface> callback, boolean reload) {
if (!isAvailable()) {
if (callback != null) {
- callback.onOptionsLoaded(null);
+ callback.onError(null);
}
return;
}
if (mClocks != null && !reload) {
if (callback != null) {
- callback.onOptionsLoaded(mClocks);
+ if (!mClocks.isEmpty()) {
+ callback.onOptionsLoaded(mClocks);
+ } else {
+ callback.onError(null);
+ }
}
return;
}
new ClocksFetchTask(mContext, mProviderInfo, options -> {
mClocks = options;
if (callback != null) {
- callback.onOptionsLoaded(mClocks);
+ if (!mClocks.isEmpty()) {
+ callback.onOptionsLoaded(mClocks);
+ } else {
+ callback.onError(null);
+ }
}
}).execute();
}
diff --git a/src/com/android/customization/model/grid/GridOptionsManager.java b/src/com/android/customization/model/grid/GridOptionsManager.java
index ba5968e..1599dde 100644
--- a/src/com/android/customization/model/grid/GridOptionsManager.java
+++ b/src/com/android/customization/model/grid/GridOptionsManager.java
@@ -78,8 +78,19 @@
@Override
protected void onPostExecute(List<GridOption> gridOptions) {
if (mCallback != null) {
- mCallback.onOptionsLoaded(gridOptions != null ? gridOptions
- : Collections.emptyList());
+ if (gridOptions != null && !gridOptions.isEmpty()) {
+ mCallback.onOptionsLoaded(gridOptions);
+ } else {
+ mCallback.onError(null);
+ }
+ }
+ }
+
+ @Override
+ protected void onCancelled() {
+ super.onCancelled();
+ if (mCallback != null) {
+ mCallback.onError(null);
}
}
}
diff --git a/src/com/android/customization/model/theme/DefaultThemeProvider.java b/src/com/android/customization/model/theme/DefaultThemeProvider.java
index 58b6daf..ce12d35 100644
--- a/src/com/android/customization/model/theme/DefaultThemeProvider.java
+++ b/src/com/android/customization/model/theme/DefaultThemeProvider.java
@@ -15,6 +15,8 @@
*/
package com.android.customization.model.theme;
+import static android.content.res.Resources.ID_NULL;
+
import static com.android.customization.model.ResourceConstants.ANDROID_PACKAGE;
import static com.android.customization.model.ResourceConstants.ICONS_FOR_PREVIEW;
import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR;
@@ -50,6 +52,7 @@
import com.android.wallpaper.model.LiveWallpaperInfo;
import com.bumptech.glide.request.RequestOptions;
+import com.google.android.apps.wallpaper.asset.ThemeBundleThumbAsset;
import org.json.JSONArray;
import org.json.JSONException;
@@ -83,12 +86,17 @@
private static final String WALLPAPER_PREFIX = "theme_wallpaper_";
private static final String WALLPAPER_TITLE_PREFIX = "theme_wallpaper_title_";
private static final String WALLPAPER_ATTRIBUTION_PREFIX = "theme_wallpaper_attribution_";
+ private static final String WALLPAPER_THUMB_PREFIX = "theme_wallpaper_thumbnail_";
private static final String WALLPAPER_ACTION_PREFIX = "theme_wallpaper_action_";
+ private static final String WALLPAPER_OPTIONS_PREFIX = "theme_wallpaper_options_";
private static final String DEFAULT_THEME_NAME= "default";
private static final String THEME_TITLE_FIELD = "_theme_title";
private static final String THEME_ID_FIELD = "_theme_id";
+ // Maximum number of themes allowed (including default, pre-bundled and custom)
+ private static final int MAX_TOTAL_THEMES = 10;
+
private final OverlayThemeExtractor mOverlayProvider;
private List<ThemeBundle> mThemes;
private final CustomizationPreferences mCustomizationPreferences;
@@ -181,7 +189,11 @@
String wallpaperResName = WALLPAPER_PREFIX + themeName;
int wallpaperResId = mStubApkResources.getIdentifier(wallpaperResName,
"drawable", mStubPackageName);
- if (wallpaperResId > 0) {
+ // Check in case the theme has a separate thumbnail for the wallpaper
+ String wallpaperThumbnailResName = WALLPAPER_THUMB_PREFIX + themeName;
+ int wallpaperThumbnailResId = mStubApkResources.getIdentifier(wallpaperThumbnailResName,
+ "drawable", mStubPackageName);
+ if (wallpaperResId != ID_NULL) {
builder.setWallpaperInfo(mStubPackageName, wallpaperResName,
themeName, wallpaperResId,
mStubApkResources.getIdentifier(WALLPAPER_TITLE_PREFIX + themeName,
@@ -191,19 +203,26 @@
mStubPackageName),
mStubApkResources.getIdentifier(WALLPAPER_ACTION_PREFIX + themeName,
"string", mStubPackageName))
- .setWallpaperAsset(
- getDrawableResourceAsset(WALLPAPER_PREFIX, themeName));
+ .setWallpaperAsset(wallpaperThumbnailResId != ID_NULL ?
+ getThumbAsset(WALLPAPER_THUMB_PREFIX, themeName)
+ : getDrawableResourceAsset(WALLPAPER_PREFIX, themeName));
} else {
// Try to see if it's a live wallpaper reference
wallpaperResId = mStubApkResources.getIdentifier(wallpaperResName,
"string", mStubPackageName);
- if (wallpaperResId > 0) {
+ if (wallpaperResId != ID_NULL) {
String wpComponent = mStubApkResources.getString(wallpaperResId);
+
+ int wallpaperOptionsResId = mStubApkResources.getIdentifier(
+ WALLPAPER_OPTIONS_PREFIX + themeName, "string", mStubPackageName);
+ String wallpaperOptions = wallpaperOptionsResId != ID_NULL
+ ? mStubApkResources.getString(wallpaperOptionsResId) : null;
+
String[] componentParts = wpComponent.split("/");
Intent liveWpIntent = new Intent(WallpaperService.SERVICE_INTERFACE);
liveWpIntent.setComponent(
- new ComponentName(componentParts[0],
- componentParts[0] + componentParts[1]));
+ new ComponentName(componentParts[0], componentParts[1]));
+
Context appContext = mContext.getApplicationContext();
PackageManager pm = appContext.getPackageManager();
ResolveInfo resolveInfo =
@@ -213,8 +232,11 @@
try {
wallpaperInfo = new android.app.WallpaperInfo(appContext, resolveInfo);
LiveWallpaperInfo liveInfo = new LiveWallpaperInfo(wallpaperInfo);
- builder.setLiveWallpaperInfo(liveInfo)
- .setWallpaperAsset(liveInfo.getThumbAsset(mContext));
+ builder.setLiveWallpaperInfo(liveInfo).setWallpaperAsset(
+ wallpaperThumbnailResId != ID_NULL ?
+ getThumbAsset(WALLPAPER_THUMB_PREFIX, themeName)
+ : liveInfo.getThumbAsset(mContext))
+ .setWallpaperOptions(wallpaperOptions);
} catch (XmlPullParserException | IOException e) {
Log.w(TAG, "Skipping wallpaper " + resolveInfo.serviceInfo, e);
}
@@ -327,7 +349,7 @@
}
private void addThemeBundleToArray(JSONArray themesArray, ThemeBundle themeBundle) {
- JSONObject jsonPackages = themeBundle.getJsonPackages();
+ JSONObject jsonPackages = themeBundle.getJsonPackages(false);
try {
jsonPackages.put(THEME_TITLE_FIELD, themeBundle.getTitle());
if (themeBundle instanceof CustomTheme) {
@@ -384,9 +406,11 @@
}
}
- // Add an empty one at the end.
- mThemes.add(new CustomTheme(CustomTheme.newId(), mContext.getString(
- R.string.custom_theme_title, customThemesCount + 1), new HashMap<>(), null));
+ if (mThemes.size() < MAX_TOTAL_THEMES) {
+ // Add an empty one at the end.
+ mThemes.add(new CustomTheme(CustomTheme.newId(), mContext.getString(
+ R.string.custom_theme_title, customThemesCount + 1), new HashMap<>(), null));
+ }
}
@@ -460,4 +484,11 @@
return drawableResId == 0 ? null : new ResourceAsset(mStubApkResources, drawableResId,
RequestOptions.fitCenterTransform());
}
+
+ private ThemeBundleThumbAsset getThumbAsset(String prefix, String themeName) {
+ int drawableResId = mStubApkResources.getIdentifier(prefix + themeName,
+ "drawable", mStubPackageName);
+ return drawableResId == 0 ? null : new ThemeBundleThumbAsset(mStubApkResources,
+ drawableResId);
+ }
}
diff --git a/src/com/android/customization/model/theme/ThemeBundle.java b/src/com/android/customization/model/theme/ThemeBundle.java
index 12ec32c..2fc5d90 100644
--- a/src/com/android/customization/model/theme/ThemeBundle.java
+++ b/src/com/android/customization/model/theme/ThemeBundle.java
@@ -31,7 +31,9 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.PathShape;
+import android.icu.text.SimpleDateFormat;
import android.text.TextUtils;
+import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
@@ -52,14 +54,17 @@
import com.android.wallpaper.model.LiveWallpaperInfo;
import com.android.wallpaper.model.WallpaperInfo;
+import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -70,22 +75,28 @@
*/
public class ThemeBundle implements CustomizationOption<ThemeBundle> {
+ private static final String TAG = "ThemeBundle";
+ private final static String EMPTY_JSON = "{}";
+ private final static String TIMESTAMP_FIELD = "_applied_timestamp";
+
private final String mTitle;
private final PreviewInfo mPreviewInfo;
private final boolean mIsDefault;
protected final Map<String, String> mPackagesByCategory;
@Nullable private final WallpaperInfo mWallpaperInfo;
+ @Nullable private final String mWallpaperOptions;
private WallpaperInfo mOverrideWallpaper;
private Asset mOverrideWallpaperAsset;
private CharSequence mContentDescription;
protected ThemeBundle(String title, Map<String, String> overlayPackages,
boolean isDefault, @Nullable WallpaperInfo wallpaperInfo,
- PreviewInfo previewInfo) {
+ @Nullable String wallpaperOptions, PreviewInfo previewInfo) {
mTitle = title;
mIsDefault = isDefault;
mPreviewInfo = previewInfo;
mWallpaperInfo = wallpaperInfo;
+ mWallpaperOptions = wallpaperOptions;
mPackagesByCategory = Collections.unmodifiableMap(overlayPackages);
}
@@ -118,10 +129,10 @@
@Override
public boolean isActive(CustomizationManager<ThemeBundle> manager) {
ThemeManager themeManager = (ThemeManager) manager;
- String serializedOverlays = themeManager.getStoredOverlays();
if (mIsDefault) {
- return TextUtils.isEmpty(serializedOverlays);
+ String serializedOverlays = themeManager.getStoredOverlays();
+ return TextUtils.isEmpty(serializedOverlays) || EMPTY_JSON.equals(serializedOverlays);
} else {
Map<String, String> currentOverlays = themeManager.getCurrentOverlays();
return mPackagesByCategory.equals(currentOverlays);
@@ -142,7 +153,8 @@
return false;
}
if (mIsDefault) {
- return other.isDefault() || TextUtils.isEmpty(other.getSerializedPackages());
+ return other.isDefault() || TextUtils.isEmpty(other.getSerializedPackages())
+ || EMPTY_JSON.equals(other.getSerializedPackages());
}
// Map#equals ensures keys and values are compared.
return mPackagesByCategory.equals(other.mPackagesByCategory);
@@ -179,6 +191,11 @@
return mWallpaperInfo;
}
+ @Nullable
+ public String getWallpaperOptions() {
+ return mWallpaperOptions;
+ }
+
boolean isDefault() {
return mIsDefault;
}
@@ -188,19 +205,27 @@
}
public String getSerializedPackages() {
- if (isDefault()) {
- return "";
- }
- return getJsonPackages().toString();
+ return getJsonPackages(false).toString();
}
- JSONObject getJsonPackages() {
+ public String getSerializedPackagesWithTimestamp() {
+ return getJsonPackages(true).toString();
+ }
+
+ JSONObject getJsonPackages(boolean insertTimestamp) {
if (isDefault()) {
return new JSONObject();
}
JSONObject json = new JSONObject(mPackagesByCategory);
// Remove items with null values to avoid deserialization issues.
removeNullValues(json);
+ if (insertTimestamp) {
+ try {
+ json.put(TIMESTAMP_FIELD, System.currentTimeMillis());
+ } catch (JSONException e) {
+ Log.e(TAG, "Couldn't add timestamp to serialized themebundle");
+ }
+ }
return json;
}
@@ -300,11 +325,12 @@
@Dimension private int mCornerRadius;
private Asset mWallpaperAsset;
private WallpaperInfo mWallpaperInfo;
+ private String mWallpaperOptions;
protected Map<String, String> mPackages = new HashMap<>();
private List<Drawable> mAppIcons = new ArrayList<>();
public ThemeBundle build(Context context) {
- return new ThemeBundle(mTitle, mPackages, mIsDefault, mWallpaperInfo,
+ return new ThemeBundle(mTitle, mPackages, mIsDefault, mWallpaperInfo, mWallpaperOptions,
createPreviewInfo(context));
}
@@ -409,6 +435,11 @@
return this;
}
+ public Builder setWallpaperOptions(String wallpaperOptions) {
+ mWallpaperOptions = wallpaperOptions;
+ return this;
+ }
+
public Builder asDefault() {
mIsDefault = true;
return this;
diff --git a/src/com/android/customization/model/theme/ThemeManager.java b/src/com/android/customization/model/theme/ThemeManager.java
index f7bbd00..e4981b0 100644
--- a/src/com/android/customization/model/theme/ThemeManager.java
+++ b/src/com/android/customization/model/theme/ThemeManager.java
@@ -23,11 +23,10 @@
import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_ICON_SYSUI;
import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_ICON_THEMEPICKER;
import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SHAPE;
-
import android.graphics.Point;
import android.provider.Settings;
-
import android.text.TextUtils;
+
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
@@ -37,11 +36,11 @@
import com.android.customization.module.ThemesUserEventLogger;
import com.android.wallpaper.R;
import com.android.wallpaper.asset.Asset;
-import com.android.wallpaper.module.WallpaperPersister;
+import com.android.wallpaper.model.LiveWallpaperInfo;
import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback;
import com.android.wallpaper.module.WallpaperSetter;
-import com.android.wallpaper.picker.SetWallpaperDialogFragment.Listener;
import com.android.wallpaper.util.WallpaperCropUtils;
+
import org.json.JSONObject;
import java.util.HashSet;
@@ -67,7 +66,7 @@
private final OverlayManagerCompat mOverlayManagerCompat;
private final WallpaperSetter mWallpaperSetter;
- private final FragmentActivity mActivity;
+ protected final FragmentActivity mActivity;
private final ThemesUserEventLogger mEventLogger;
private Map<String, String> mCurrentOverlays;
@@ -92,26 +91,12 @@
// Set wallpaper
if (theme.shouldUseThemeWallpaper()) {
mWallpaperSetter.requestDestination(mActivity, mActivity.getSupportFragmentManager(),
- R.string.set_theme_wallpaper_dialog_message, theme.getWallpaperInfo(),
- new Listener() {
- @Override
- public void onSetHomeScreen() {
- applyWallpaper(theme, WallpaperPersister.DEST_HOME_SCREEN,
- createSetWallpaperCallback(theme, callback));
- }
-
- @Override
- public void onSetLockScreen() {
- applyWallpaper(theme, WallpaperPersister.DEST_LOCK_SCREEN,
- createSetWallpaperCallback(theme, callback));
- }
-
- @Override
- public void onSetBoth() {
- applyWallpaper(theme, WallpaperPersister.DEST_BOTH,
- createSetWallpaperCallback(theme, callback));
- }
- });
+ R.string.set_theme_wallpaper_dialog_message,
+ destination -> applyWallpaper(
+ theme,
+ destination,
+ createSetWallpaperCallback(theme, callback)),
+ theme.getWallpaperInfo() instanceof LiveWallpaperInfo);
} else {
applyOverlays(theme, callback);
@@ -122,6 +107,7 @@
return new SetWallpaperCallback() {
@Override
public void onSuccess() {
+ applyWallpaperOptions(theme);
applyOverlays(theme, callback);
}
@@ -132,6 +118,10 @@
};
}
+ protected void applyWallpaperOptions(ThemeBundle theme) {
+ //Do nothing.
+ }
+
private void applyWallpaper(ThemeBundle theme, int destination,
SetWallpaperCallback callback) {
Point defaultCropSurfaceSize = WallpaperCropUtils.getDefaultCropSurfaceSize(
@@ -163,7 +153,7 @@
private void applyOverlays(ThemeBundle theme, Callback callback) {
boolean allApplied = Settings.Secure.putString(mActivity.getContentResolver(),
- ResourceConstants.THEME_SETTING, theme.getSerializedPackages());
+ ResourceConstants.THEME_SETTING, theme.getSerializedPackagesWithTimestamp());
if (theme instanceof CustomTheme) {
storeCustomTheme((CustomTheme) theme);
}
diff --git a/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java b/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java
index 020e3ef..a37f250 100644
--- a/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java
+++ b/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java
@@ -81,9 +81,6 @@
}
for (String iconName : ICONS_FOR_PREVIEW) {
try {
- if (previewIcons.size() == COLOR_TILES_ICON_IDS.length) {
- break;
- }
previewIcons.add(loadIconPreviewDrawable(iconName, iconPackage));
} catch (NameNotFoundException | NotFoundException e) {
Log.w(TAG, String.format("Couldn't load icon in %s for color preview, will skip it",
diff --git a/src/com/android/customization/model/theme/custom/CustomTheme.java b/src/com/android/customization/model/theme/custom/CustomTheme.java
index 97a1876..8a7ca05 100644
--- a/src/com/android/customization/model/theme/custom/CustomTheme.java
+++ b/src/com/android/customization/model/theme/custom/CustomTheme.java
@@ -41,7 +41,7 @@
public CustomTheme(@NonNull String id, String title, Map<String, String> overlayPackages,
@Nullable PreviewInfo previewInfo) {
- super(title, overlayPackages, false, null, previewInfo);
+ super(title, overlayPackages, false, null, null, previewInfo);
mId = id;
}
diff --git a/src/com/android/customization/model/theme/custom/IconOptionsProvider.java b/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
index 73a4a22..f7b669b 100644
--- a/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
+++ b/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
@@ -86,7 +86,7 @@
}
for (String overlayPackage : mSysUiIconsOverlayPackages) {
- addOrUpdateOption(optionsByPrefix, overlayPackage, OVERLAY_CATEGORY_ICON_SYSUI);
+ addOrUpdateOption(optionsByPrefix, overlayPackage, OVERLAY_CATEGORY_ICON_SYSUI);
}
for (String overlayPackage : mSettingsIconsOverlayPackages) {
@@ -142,6 +142,11 @@
} catch (NameNotFoundException | NotFoundException e) {
Log.w(TAG, "Didn't find SystemUi package icons, will skip option", e);
}
+ option.addOverlayPackage(OVERLAY_CATEGORY_ICON_ANDROID, null);
+ option.addOverlayPackage(OVERLAY_CATEGORY_ICON_SYSUI, null);
+ option.addOverlayPackage(OVERLAY_CATEGORY_ICON_SETTINGS, null);
+ option.addOverlayPackage(OVERLAY_CATEGORY_ICON_LAUNCHER, null);
+ option.addOverlayPackage(OVERLAY_CATEGORY_ICON_THEMEPICKER, null);
mOptions.add(option);
}
diff --git a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
index 994b5f3..f918d8e 100644
--- a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
+++ b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
@@ -29,12 +29,12 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
import android.graphics.Path;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.ShapeDrawable;
-import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
@@ -47,7 +47,10 @@
import androidx.annotation.ColorInt;
import androidx.annotation.Dimension;
+import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.core.graphics.ColorUtils;
import com.android.customization.model.CustomizationManager;
import com.android.customization.model.CustomizationOption;
@@ -59,7 +62,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Objects;
/**
@@ -90,11 +92,7 @@
public abstract void bindPreview(ViewGroup container);
public Builder buildStep(Builder builder) {
- getOverlayPackages().forEach((category, packageName) -> {
- if (!TextUtils.isEmpty(packageName)) {
- builder.addOverlayPackage(category, packageName);
- }
- });
+ getOverlayPackages().forEach(builder::addOverlayPackage);
return builder;
}
@@ -138,9 +136,7 @@
@Override
public void bindPreview(ViewGroup container) {
- TextView header = container.findViewById(R.id.theme_preview_card_header);
- header.setText(R.string.preview_name_font);
- header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_font, 0, 0);
+ bindPreviewHeader(container, R.string.preview_name_font, R.drawable.ic_font);
ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
if (cardBody.getChildCount() == 0) {
@@ -152,6 +148,8 @@
title.setTypeface(mHeadlineFont);
TextView bodyText = container.findViewById(R.id.font_card_body);
bodyText.setTypeface(mBodyFont);
+ container.findViewById(R.id.font_card_divider).setBackgroundColor(
+ title.getCurrentTextColor());
}
@Override
@@ -161,6 +159,21 @@
}
}
+ void bindPreviewHeader(ViewGroup container, @StringRes int headerTextResId,
+ @DrawableRes int headerIcon) {
+ TextView header = container.findViewById(R.id.theme_preview_card_header);
+ header.setText(headerTextResId);
+
+ Context context = container.getContext();
+ Drawable icon = context.getResources().getDrawable(headerIcon, context.getTheme());
+ int size = context.getResources().getDimensionPixelSize(R.dimen.card_header_icon_size);
+ icon.setBounds(0, 0, size, size);
+
+ header.setCompoundDrawables(null, icon, null, null);
+ header.setCompoundDrawableTintList(ColorStateList.valueOf(
+ header.getCurrentTextColor()));
+ }
+
public static class IconOption extends ThemeComponentOption {
public static final int THUMBNAIL_ICON_POSITION = 0;
@@ -210,9 +223,7 @@
@Override
public void bindPreview(ViewGroup container) {
- TextView header = container.findViewById(R.id.theme_preview_card_header);
- header.setText(R.string.preview_name_icon);
- header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_wifi_24px, 0, 0);
+ bindPreviewHeader(container, R.string.preview_name_icon, R.drawable.ic_wifi_24px);
ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
if (cardBody.getChildCount() == 0) {
@@ -258,9 +269,15 @@
private static int[] COLOR_TILE_IDS = {
R.id.preview_color_qs_0_bg, R.id.preview_color_qs_1_bg, R.id.preview_color_qs_2_bg
};
- static int[] COLOR_TILES_ICON_IDS = {
- R.id.preview_color_qs_0_icon, R.id.preview_color_qs_1_icon,
- R.id.preview_color_qs_2_icon
+
+ /**
+ * Ids of the views for the foreground of the icon, mapping to the corresponding index of
+ * the actual icon drawable.
+ */
+ static int[][] COLOR_TILES_ICON_IDS = {
+ new int[]{ R.id.preview_color_qs_0_icon, 0},
+ new int[]{ R.id.preview_color_qs_1_icon, 1},
+ new int[] { R.id.preview_color_qs_2_icon, 3}
};
/**
@@ -296,11 +313,13 @@
@Override
public void bindThumbnailTile(View view) {
- int color = resolveColor(view.getResources());
- ((ImageView) view.findViewById(R.id.option_tile)).getDrawable().setTint(color);
+ @ColorInt int color = resolveColor(view.getResources());
+ ((ImageView) view.findViewById(R.id.option_tile)).setImageTintList(
+ ColorStateList.valueOf(color));
view.setContentDescription(mLabel);
}
+ @ColorInt
private int resolveColor(Resources res) {
Configuration configuration = res.getConfiguration();
return (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK)
@@ -321,9 +340,7 @@
@Override
public void bindPreview(ViewGroup container) {
- TextView header = container.findViewById(R.id.theme_preview_card_header);
- header.setText(R.string.preview_name_color);
- header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_colorize_24px, 0, 0);
+ bindPreviewHeader(container, R.string.preview_name_color, R.drawable.ic_colorize_24px);
ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
if (cardBody.getChildCount() == 0) {
@@ -364,14 +381,15 @@
seekbar.setOnTouchListener((view, motionEvent) -> true);
if (!mIcons.isEmpty() && mShapeDrawable != null) {
for (int i = 0; i < COLOR_TILE_IDS.length; i++) {
- Drawable icon = mIcons.get(i).getConstantState().newDrawable();
+ Drawable icon = mIcons.get(COLOR_TILES_ICON_IDS[i][1]).getConstantState()
+ .newDrawable();
//TODO: load and set the shape.
Drawable bgShape = mShapeDrawable.getConstantState().newDrawable();
bgShape.setTint(accentColor);
ImageView bg = container.findViewById(COLOR_TILE_IDS[i]);
bg.setImageDrawable(bgShape);
- ImageView fg = container.findViewById(COLOR_TILES_ICON_IDS[i]);
+ ImageView fg = container.findViewById(COLOR_TILES_ICON_IDS[i][0]);
fg.setImageDrawable(icon);
}
}
@@ -433,7 +451,13 @@
foreground.setIntrinsicHeight(background.getIntrinsicHeight() - borderWidth);
foreground.setIntrinsicWidth(background.getIntrinsicWidth() - borderWidth);
- foreground.setTint(res.getColor(R.color.shape_option_tile_foreground_color, theme));
+ TypedArray ta = view.getContext().obtainStyledAttributes(
+ new int[]{android.R.attr.colorPrimary});
+ int primaryColor = ta.getColor(0, 0);
+ ta.recycle();
+ int foregroundColor = res.getColor(R.color.shape_option_tile_foreground_color, theme);
+
+ foreground.setTint(ColorUtils.blendARGB(primaryColor, foregroundColor, .05f));
thumb.setImageDrawable(mShape);
view.setContentDescription(mLabel);
@@ -453,9 +477,7 @@
@Override
public void bindPreview(ViewGroup container) {
- TextView header = container.findViewById(R.id.theme_preview_card_header);
- header.setText(R.string.preview_name_shape);
- header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_shapes_24px, 0, 0);
+ bindPreviewHeader(container, R.string.preview_name_shape, R.drawable.ic_shapes_24px);
ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
if (cardBody.getChildCount() == 0) {
diff --git a/src/com/android/customization/module/CustomizationInjector.java b/src/com/android/customization/module/CustomizationInjector.java
index 90333f0..d25f925 100644
--- a/src/com/android/customization/module/CustomizationInjector.java
+++ b/src/com/android/customization/module/CustomizationInjector.java
@@ -17,9 +17,19 @@
import android.content.Context;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.customization.model.theme.OverlayManagerCompat;
+import com.android.customization.model.theme.ThemeBundleProvider;
+import com.android.customization.model.theme.ThemeManager;
import com.android.wallpaper.module.Injector;
+import com.android.wallpaper.module.WallpaperSetter;
public interface CustomizationInjector extends Injector {
CustomizationPreferences getCustomizationPreferences(Context context);
+
+ ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
+ WallpaperSetter wallpaperSetter, OverlayManagerCompat overlayManagerCompat,
+ ThemesUserEventLogger logger);
}
diff --git a/src/com/android/customization/module/DefaultCustomizationInjector.java b/src/com/android/customization/module/DefaultCustomizationInjector.java
index 7af90a3..a0d435b 100644
--- a/src/com/android/customization/module/DefaultCustomizationInjector.java
+++ b/src/com/android/customization/module/DefaultCustomizationInjector.java
@@ -18,16 +18,19 @@
import android.content.Context;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import com.android.customization.model.theme.OverlayManagerCompat;
+import com.android.customization.model.theme.ThemeBundleProvider;
+import com.android.customization.model.theme.ThemeManager;
import com.android.wallpaper.model.CategoryProvider;
import com.android.wallpaper.model.WallpaperInfo;
import com.android.wallpaper.module.BaseWallpaperInjector;
import com.android.wallpaper.module.DefaultCategoryProvider;
import com.android.wallpaper.module.LoggingOptInStatusProvider;
-import com.android.wallpaper.module.NoOpUserEventLogger;
-import com.android.wallpaper.module.UserEventLogger;
import com.android.wallpaper.module.WallpaperPreferences;
import com.android.wallpaper.module.WallpaperRotationRefresher;
+import com.android.wallpaper.module.WallpaperSetter;
import com.android.wallpaper.monitor.PerformanceMonitor;
import com.android.wallpaper.picker.PreviewFragment;
@@ -85,6 +88,7 @@
@Override
public Fragment getPreviewFragment(
+ Context context,
WallpaperInfo wallpaperInfo,
int mode,
boolean testingModeEnabled) {
@@ -109,4 +113,11 @@
return null;
}
+ @Override
+ public ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
+ WallpaperSetter wallpaperSetter, OverlayManagerCompat overlayManagerCompat,
+ ThemesUserEventLogger logger) {
+ return new ThemeManager(provider, activity, wallpaperSetter, overlayManagerCompat, logger);
+ }
+
}
diff --git a/src/com/android/customization/module/StatsLogUserEventLogger.java b/src/com/android/customization/module/StatsLogUserEventLogger.java
index 8762b20..b77d7dc 100644
--- a/src/com/android/customization/module/StatsLogUserEventLogger.java
+++ b/src/com/android/customization/module/StatsLogUserEventLogger.java
@@ -20,6 +20,7 @@
import androidx.annotation.Nullable;
+import com.android.systemui.shared.system.StatsLogCompat;
import com.android.customization.model.clock.Clockface;
import com.android.customization.model.grid.GridOption;
import com.android.customization.model.theme.ThemeBundle;
@@ -40,71 +41,41 @@
private static final String TAG = "StatsLogUserEventLogger";
@Override
- public void logResumed() {
- Log.d(TAG, String.format("logResumed: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.ONRESUME,
- 0, 0, 0, 0, 0, 0, 0));
-// StatsLogCompat.write(StyleEnums.ONRESUME,
-// 0, 0, 0, 0, 0, 0, 0);
+ public void logResumed(boolean provisioned, boolean wallpaper) {
+ StatsLogCompat.write(StyleEnums.ONRESUME, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
@Override
public void logStopped() {
- Log.d(TAG, String.format("logStopped: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.ONSTOP,
- 0, 0, 0, 0, 0, 0, 0));
-// StatsLogCompat.write(StyleEnums.ONSTOP,
-// 0, 0, 0, 0, 0, 0, 0);
+ StatsLogCompat.write(StyleEnums.ONSTOP, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
@Override
public void logActionClicked(String collectionId, int actionLabelResId) {
- Log.d(TAG, String.format("logActionClicked: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.WALLPAPER_EXPLORE,
- 0, 0, 0, 0, 0,
- collectionId.hashCode(),
- 0));
-// StatsLogCompat.write(StyleEnums.WALLPAPER_EXPLORE,
-// 0, 0, 0, 0, 0,
-// collectionId.hashCode(),
-// 0));
+ StatsLogCompat.write(StyleEnums.WALLPAPER_EXPLORE, 0, 0, 0, 0, 0, collectionId.hashCode(),
+ 0, 0, 0);
}
@Override
public void logIndividualWallpaperSelected(String collectionId) {
- Log.d(TAG, String.format("logIndividualWallpaperSelected: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.WALLPAPER_SELECT,
- 0, 0, 0, 0, 0, 0,
- collectionId.hashCode()));
-// StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
-// 0, 0, 0, 0, 0, 0,
-// collectionId.hashCode());
+ StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT, 0, 0, 0, 0, 0, 0,
+ collectionId.hashCode(), 0, 0);
}
@Override
public void logCategorySelected(String collectionId) {
- Log.d(TAG, String.format("logCategorySelected: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.WALLPAPER_SELECT,
+ StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
0, 0, 0, 0, 0,
collectionId.hashCode(),
- 0));
-// StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
-// 0, 0, 0, 0, 0,
-// collectionId.hashCode(),
-// 0);
+ 0, 0, 0);
}
@Override
public void logWallpaperSet(String collectionId, @Nullable String wallpaperId) {
- Log.d(TAG, String.format("logWallpaperSet: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.WALLPAPER_APPLIED,
+ StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
0, 0, 0, 0, 0,
collectionId.hashCode(),
- Objects.hashCode(wallpaperId)));
-// StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
-// 0, 0, 0, 0, 0,
-// collectionId.hashCode(),
-// 0);
+ 0, 0, 0);
}
@Nullable
@@ -115,83 +86,51 @@
@Override
public void logThemeSelected(ThemeBundle theme, boolean isCustomTheme) {
- Log.d(TAG, String.format("logThemeSelected: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.PICKER_SELECT,
+ StatsLogCompat.write(StyleEnums.PICKER_SELECT,
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
- 0, 0, 0, 0));
-// StatsLogCompat.write(StyleEnums.PICKER_SELECT,
-// Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
-// Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
-// Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-// 0, 0, 0, 0);
+ 0, 0, 0, 0, 0, 0);
}
@Override
public void logThemeApplied(ThemeBundle theme, boolean isCustomTheme) {
- Log.d(TAG, String.format("logThemeApplied: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.PICKER_APPLIED,
+ StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
- 0, 0, 0, 0));
-// StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
-// Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
-// Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
-// Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-// 0, 0, 0, 0);
+ 0, 0, 0, 0, 0, 0);
}
@Override
public void logClockSelected(Clockface clock) {
- Log.d(TAG, String.format("logClockSelected: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.PICKER_SELECT,
+ StatsLogCompat.write(StyleEnums.PICKER_SELECT,
0, 0, 0,
Objects.hashCode(clock.getId()),
- 0, 0, 0));
-// StatsLogCompat.write(StyleEnums.PICKER_SELECT,
-// 0, 0, 0,
-// Objects.hashCode(clock.getId()),
-// 0, 0, 0));
+ 0, 0, 0, 0, 0);
}
@Override
public void logClockApplied(Clockface clock) {
- Log.d(TAG, String.format("logClockApplied: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.PICKER_APPLIED,
+ StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
0, 0, 0,
Objects.hashCode(clock.getId()),
- 0, 0, 0));
-// StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
-// 0, 0, 0,
-// Objects.hashCode(clock.getId()),
-// 0, 0, 0));
+ 0, 0, 0, 0, 0);
}
@Override
public void logGridSelected(GridOption grid) {
- Log.d(TAG, String.format("logGridSelected: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.PICKER_SELECT,
+ StatsLogCompat.write(StyleEnums.PICKER_SELECT,
0, 0, 0, 0,
grid.cols,
- 0, 0));
-// StatsLogCompat.write(StyleEnums.PICKER_SELECT,
-// 0, 0, 0, 0,
-// Objects.hashCode(clock.getId()),
-// 0, 0));
+ 0, 0, 0, 0);
}
@Override
public void logGridApplied(GridOption grid) {
- Log.d(TAG, String.format("logGridApplied: %d, %d, %d, %d, %d, %d, %d, %d",
- StyleEnums.PICKER_APPLIED,
+ StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
0, 0, 0, 0,
grid.cols,
- 0, 0));
-// StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
-// 0, 0, 0, 0,
-// Objects.hashCode(clock.getId()),
-// 0, 0));
+ 0, 0, 0, 0);
}
}
diff --git a/src/com/android/customization/picker/BasePreviewAdapter.java b/src/com/android/customization/picker/BasePreviewAdapter.java
index e87fb71..53f750a 100644
--- a/src/com/android/customization/picker/BasePreviewAdapter.java
+++ b/src/com/android/customization/picker/BasePreviewAdapter.java
@@ -88,7 +88,11 @@
@Override
public void destroyItem(@NonNull ViewGroup container, int position,
@NonNull Object object) {
- ((T) object).card = null;
+ View card = ((PreviewPage) object).card;
+ ((PreviewPage) object).card = null;
+ if (card.getParent() == container) {
+ container.removeView(card);
+ }
}
/**
diff --git a/src/com/android/customization/picker/ClockFacePickerActivity.java b/src/com/android/customization/picker/ClockFacePickerActivity.java
index 261f794..5065aef 100644
--- a/src/com/android/customization/picker/ClockFacePickerActivity.java
+++ b/src/com/android/customization/picker/ClockFacePickerActivity.java
@@ -56,6 +56,7 @@
result.putExtra(EXTRA_CLOCK_FACE_NAME, option.getId());
setResult(RESULT_OK, result);
callback.onSuccess();
+ finish();
}
@Override
@@ -63,12 +64,16 @@
return getIntent().getStringExtra(EXTRA_CLOCK_FACE_NAME);
}
};
-
- final FragmentManager fm = getSupportFragmentManager();
- final FragmentTransaction fragmentTransaction = fm.beginTransaction();
- final ClockFragment clockFragment = ClockFragment.newInstance(getString(R.string.clock_title));
- fragmentTransaction.replace(R.id.fragment_container, clockFragment);
- fragmentTransaction.commitNow();
+ if (!mClockManager.isAvailable()) {
+ finish();
+ } else {
+ final FragmentManager fm = getSupportFragmentManager();
+ final FragmentTransaction fragmentTransaction = fm.beginTransaction();
+ final ClockFragment clockFragment = ClockFragment.newInstance(
+ getString(R.string.clock_title));
+ fragmentTransaction.replace(R.id.fragment_container, clockFragment);
+ fragmentTransaction.commitNow();
+ }
}
@Override
diff --git a/src/com/android/customization/picker/CustomizationPickerActivity.java b/src/com/android/customization/picker/CustomizationPickerActivity.java
index b85948d..80cd7d9 100644
--- a/src/com/android/customization/picker/CustomizationPickerActivity.java
+++ b/src/com/android/customization/picker/CustomizationPickerActivity.java
@@ -19,14 +19,15 @@
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
-import android.os.Build;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
@@ -138,7 +139,12 @@
@Override
protected void onResume() {
super.onResume();
- mUserEventLogger.logResumed();
+ boolean wallpaperOnly =
+ WALLPAPER_ONLY.equals(getIntent().getStringExtra(WALLPAPER_FLAVOR_EXTRA));
+ boolean provisioned = Settings.Global.getInt(getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+
+ mUserEventLogger.logResumed(provisioned, wallpaperOnly);
// refresh the sections as the preview may have changed
initSections();
if (mBottomNav == null) {
@@ -159,6 +165,7 @@
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (WALLPAPER_ONLY.equals(intent.getStringExtra(WALLPAPER_FLAVOR_EXTRA))) {
+ Log.d(TAG, "WALLPAPER_ONLY intent, reverting to Wallpaper Picker");
skipToWallpaperPicker();
}
}
@@ -177,15 +184,11 @@
private void initSections() {
mSections.clear();
if (!BuildCompat.isAtLeastQ()) {
- return;
- }
- //if (!BuildCompat.isAtLeastQ()) {
- // return;
- //}
- if (Build.TYPE.equals("user")) {
+ Log.d(TAG, "Build version < Q detected");
return;
}
if (WALLPAPER_ONLY.equals(getIntent().getStringExtra(WALLPAPER_FLAVOR_EXTRA))) {
+ Log.d(TAG, "WALLPAPER_ONLY intent");
return;
}
//Theme
@@ -194,18 +197,22 @@
injector.getPreferences(this), mUserEventLogger, false);
ThemesUserEventLogger eventLogger = (ThemesUserEventLogger) injector.getUserEventLogger(
this);
- ThemeManager themeManager = new ThemeManager(
+ ThemeManager themeManager = injector.getThemeManager(
new DefaultThemeProvider(this, injector.getCustomizationPreferences(this)),
this,
mWallpaperSetter, new OverlayManagerCompat(this), eventLogger);
if (themeManager.isAvailable()) {
mSections.put(R.id.nav_theme, new ThemeSection(R.id.nav_theme, themeManager));
+ } else {
+ Log.d(TAG, "ThemeManager not available, removing Style section");
}
//Clock
ClockManager clockManager = new ClockManager(getContentResolver(),
new ContentProviderClockProvider(this), eventLogger);
if (clockManager.isAvailable()) {
mSections.put(R.id.nav_clock, new ClockSection(R.id.nav_clock, clockManager));
+ } else {
+ Log.d(TAG, "ClockManager not available, removing Clock section");
}
//Grid
GridOptionsManager gridManager = new GridOptionsManager(
@@ -214,9 +221,10 @@
eventLogger);
if (gridManager.isAvailable()) {
mSections.put(R.id.nav_grid, new GridSection(R.id.nav_grid, gridManager));
+ } else {
+ Log.d(TAG, "GridOptionsManager not available, removing Grid section");
}
mSections.put(R.id.nav_wallpaper, new WallpaperSection(R.id.nav_wallpaper));
- //TODO (santie): add other sections if supported by the device
}
private void setUpBottomNavView() {
@@ -347,6 +355,12 @@
}
@Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+ @NonNull int[] grantResults) {
+ mDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+
+ @Override
public MyPhotosStarter getMyPhotosStarter() {
return mDelegate;
}
diff --git a/src/com/android/customization/picker/TimeTicker.java b/src/com/android/customization/picker/TimeTicker.java
new file mode 100644
index 0000000..2cf5dbf
--- /dev/null
+++ b/src/com/android/customization/picker/TimeTicker.java
@@ -0,0 +1,41 @@
+package com.android.customization.picker;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.annotation.Nullable;
+
+/**
+ * BroadcastReceiver that can notify a listener when the system time (minutes) changes.
+ * Use {@link #registerNewReceiver(Context, TimeListener)} to create a new instance that will be
+ * automatically registered using the given Context.
+ */
+public class TimeTicker extends BroadcastReceiver {
+
+ public interface TimeListener {
+ void onCurrentTimeChanged();
+ }
+
+ public static TimeTicker registerNewReceiver(Context context, TimeListener listener) {
+ TimeTicker receiver = new TimeTicker(listener);
+ // Register broadcast receiver for time tick
+ final IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);
+ context.registerReceiver(receiver, filter);
+ return receiver;
+ }
+
+ @Nullable private TimeListener mListener;
+
+ private TimeTicker(TimeListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (mListener != null) {
+ mListener.onCurrentTimeChanged();
+ }
+ }
+}
diff --git a/src/com/android/customization/picker/clock/ClockFragment.java b/src/com/android/customization/picker/clock/ClockFragment.java
index c3e1c97..14dbc16 100644
--- a/src/com/android/customization/picker/clock/ClockFragment.java
+++ b/src/com/android/customization/picker/clock/ClockFragment.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -26,9 +27,11 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.widget.ContentLoadingProgressBar;
import androidx.recyclerview.widget.RecyclerView;
import com.android.customization.model.CustomizationManager.Callback;
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
import com.android.customization.model.clock.BaseClockManager;
import com.android.customization.model.clock.Clockface;
import com.android.customization.module.ThemesUserEventLogger;
@@ -41,11 +44,15 @@
import com.android.wallpaper.module.InjectorProvider;
import com.android.wallpaper.picker.ToolbarFragment;
+import java.util.List;
+
/**
* Fragment that contains the main UI for selecting and applying a Clockface.
*/
public class ClockFragment extends ToolbarFragment {
+ private static final String TAG = "ClockFragment";
+
/**
* Interface to be implemented by an Activity hosting a {@link ClockFragment}
*/
@@ -64,6 +71,9 @@
private Clockface mSelectedOption;
private BaseClockManager mClockManager;
private PreviewPager mPreviewPager;
+ private ContentLoadingProgressBar mLoading;
+ private View mContent;
+ private View mError;
private ThemesUserEventLogger mEventLogger;
@Override
@@ -81,8 +91,11 @@
View view = inflater.inflate(
R.layout.fragment_clock_picker, container, /* attachToRoot */ false);
setUpToolbar(view);
+ mContent = view.findViewById(R.id.content_section);
mPreviewPager = view.findViewById(R.id.clock_preview_pager);
mOptionsContainer = view.findViewById(R.id.options_container);
+ mLoading = view.findViewById(R.id.loading_indicator);
+ mError = view.findViewById(R.id.error_section);
setUpOptions();
view.findViewById(R.id.apply_button).setOnClickListener(v -> {
mClockManager.apply(mSelectedOption, new Callback() {
@@ -95,6 +108,9 @@
@Override
public void onError(@Nullable Throwable throwable) {
+ if (throwable != null) {
+ Log.e(TAG, "Error loading clockfaces", throwable);
+ }
//TODO(santie): handle
}
});
@@ -108,26 +124,50 @@
}
private void setUpOptions() {
- mClockManager.fetchOptions(options -> {
- mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
+ hideError();
+ mLoading.show();
+ mClockManager.fetchOptions(new OptionsFetchedListener<Clockface>() {
+ @Override
+ public void onOptionsLoaded(List<Clockface> options) {
+ mLoading.hide();
+ mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
- mOptionsController.addListener(selected -> {
- mSelectedOption = (Clockface) selected;
- mEventLogger.logClockSelected(mSelectedOption);
- createAdapter();
- });
- mOptionsController.initOptions(mClockManager);
- for (Clockface option : options) {
- if (option.isActive(mClockManager)) {
- mSelectedOption = option;
+ mOptionsController.addListener(selected -> {
+ mSelectedOption = (Clockface) selected;
+ mEventLogger.logClockSelected(mSelectedOption);
+ createAdapter();
+ });
+ mOptionsController.initOptions(mClockManager);
+ for (Clockface option : options) {
+ if (option.isActive(mClockManager)) {
+ mSelectedOption = option;
+ }
+ }
+ // For development only, as there should always be a grid set.
+ if (mSelectedOption == null) {
+ mSelectedOption = options.get(0);
+ }
+ createAdapter();
+ }
+ @Override
+ public void onError(@Nullable Throwable throwable) {
+ if (throwable != null) {
+ Log.e(TAG, "Error loading clockfaces", throwable);
}
+ showError();
}
- // For development only, as there should always be a grid set.
- if (mSelectedOption == null) {
- mSelectedOption = options.get(0);
- }
- createAdapter();
- }, false);
+ }, false);
+ }
+
+ private void hideError() {
+ mContent.setVisibility(View.VISIBLE);
+ mError.setVisibility(View.GONE);
+ }
+
+ private void showError() {
+ mLoading.hide();
+ mContent.setVisibility(View.GONE);
+ mError.setVisibility(View.VISIBLE);
}
private static class ClockfacePreviewPage extends PreviewPage {
diff --git a/src/com/android/customization/picker/grid/GridFragment.java b/src/com/android/customization/picker/grid/GridFragment.java
index d50c7a8..3c395a1 100644
--- a/src/com/android/customization/picker/grid/GridFragment.java
+++ b/src/com/android/customization/picker/grid/GridFragment.java
@@ -22,6 +22,7 @@
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
@@ -31,9 +32,11 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
+import androidx.core.widget.ContentLoadingProgressBar;
import androidx.recyclerview.widget.RecyclerView;
import com.android.customization.model.CustomizationManager.Callback;
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
import com.android.customization.model.grid.GridOption;
import com.android.customization.model.grid.GridOptionsManager;
import com.android.customization.module.ThemesUserEventLogger;
@@ -51,6 +54,8 @@
import com.bumptech.glide.request.RequestOptions;
+import java.util.List;
+
/**
* Fragment that contains the UI for selecting and applying a GridOption.
*/
@@ -58,6 +63,8 @@
private static final int PREVIEW_FADE_DURATION_MS = 100;
+ private static final String TAG = "GridFragment";
+
/**
* Interface to be implemented by an Activity hosting a {@link GridFragment}
*/
@@ -82,6 +89,9 @@
private GridOptionsManager mGridManager;
private GridOption mSelectedOption;
private PreviewPager mPreviewPager;
+ private ContentLoadingProgressBar mLoading;
+ private View mContent;
+ private View mError;
private ThemesUserEventLogger mEventLogger;
@Override
@@ -99,8 +109,11 @@
View view = inflater.inflate(
R.layout.fragment_grid_picker, container, /* attachToRoot */ false);
setUpToolbar(view);
+ mContent = view.findViewById(R.id.content_section);
mPreviewPager = view.findViewById(R.id.grid_preview_pager);
mOptionsContainer = view.findViewById(R.id.options_container);
+ mLoading = view.findViewById(R.id.loading_indicator);
+ mError = view.findViewById(R.id.error_section);
final Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
mScreenAspectRatio = (float) dm.heightPixels / dm.widthPixels;
@@ -161,28 +174,53 @@
}
private void setUpOptions() {
- mGridManager.fetchOptions(options -> {
- mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
+ hideError();
+ mLoading.show();
+ mGridManager.fetchOptions(new OptionsFetchedListener<GridOption>() {
+ @Override
+ public void onOptionsLoaded(List<GridOption> options) {
+ mLoading.hide();
+ mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
- mOptionsController.addListener(selected -> {
- mSelectedOption = (GridOption) selected;
- mEventLogger.logGridSelected(mSelectedOption);
- createAdapter();
- });
- mOptionsController.initOptions(mGridManager);
- for (GridOption option : options) {
- if (option.isActive(mGridManager)) {
- mSelectedOption = option;
+ mOptionsController.addListener(selected -> {
+ mSelectedOption = (GridOption) selected;
+ mEventLogger.logGridSelected(mSelectedOption);
+ createAdapter();
+ });
+ mOptionsController.initOptions(mGridManager);
+ for (GridOption option : options) {
+ if (option.isActive(mGridManager)) {
+ mSelectedOption = option;
+ }
}
+ // For development only, as there should always be a grid set.
+ if (mSelectedOption == null) {
+ mSelectedOption = options.get(0);
+ }
+ createAdapter();
}
- // For development only, as there should always be a grid set.
- if (mSelectedOption == null) {
- mSelectedOption = options.get(0);
+
+ @Override
+ public void onError(@Nullable Throwable throwable) {
+ if (throwable != null) {
+ Log.e(TAG, "Error loading grid options", throwable);
+ }
+ showError();
}
- createAdapter();
}, false);
}
+ private void hideError() {
+ mContent.setVisibility(View.VISIBLE);
+ mError.setVisibility(View.GONE);
+ }
+
+ private void showError() {
+ mLoading.hide();
+ mContent.setVisibility(View.GONE);
+ mError.setVisibility(View.VISIBLE);
+ }
+
private class GridPreviewPage extends PreviewPage {
private final int mPageId;
private final Asset mPreviewAsset;
diff --git a/src/com/android/customization/picker/theme/CustomThemeActivity.java b/src/com/android/customization/picker/theme/CustomThemeActivity.java
index 2bc371d..fe537ba 100644
--- a/src/com/android/customization/picker/theme/CustomThemeActivity.java
+++ b/src/com/android/customization/picker/theme/CustomThemeActivity.java
@@ -15,7 +15,6 @@
*/
package com.android.customization.picker.theme;
-import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Intent;
import android.os.Bundle;
@@ -104,7 +103,7 @@
}
}
- mThemeManager = new ThemeManager(
+ mThemeManager = injector.getThemeManager(
new DefaultThemeProvider(this, injector.getCustomizationPreferences(this)),
this,
new WallpaperSetter(injector.getWallpaperPersister(this),
diff --git a/src/com/android/customization/picker/theme/CustomThemeNameFragment.java b/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
index 04aac7d..e21fc80 100644
--- a/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
+++ b/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
@@ -20,7 +20,6 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
@@ -36,6 +35,7 @@
import androidx.cardview.widget.CardView;
import com.android.customization.model.theme.ThemeBundle.PreviewInfo;
+import com.android.customization.picker.TimeTicker;
import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
import com.android.wallpaper.R;
import com.android.wallpaper.asset.Asset;
@@ -63,8 +63,10 @@
private int[] mColorTileIds = {
R.id.preview_color_qs_0_bg, R.id.preview_color_qs_1_bg, R.id.preview_color_qs_2_bg
};
- private int[] mColorTileIconIds = {
- R.id.preview_color_qs_0_icon, R.id.preview_color_qs_1_icon, R.id.preview_color_qs_2_icon
+ private int[][] mColorTileIconIds = {
+ new int[]{ R.id.preview_color_qs_0_icon, 0},
+ new int[]{ R.id.preview_color_qs_1_icon, 1},
+ new int[] { R.id.preview_color_qs_2_icon, 3}
};
private int[] mShapeIconIds = {
@@ -74,7 +76,7 @@
private Asset mWallpaperAsset;
private ThemeCoverPage mCoverPage;
-
+ private TimeTicker mTicker;
private EditText mNameEditor;
@Override
@@ -106,6 +108,27 @@
return view;
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ mTicker = TimeTicker.registerNewReceiver(getContext(), this::updateTime);
+ updateTime();
+ }
+
+ private void updateTime() {
+ if (mCoverPage != null) {
+ mCoverPage.updateTime();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (getContext() != null) {
+ getContext().unregisterReceiver(mTicker);
+ }
+ }
+
private void bindCover(CardView card) {
Context context = getContext();
PreviewInfo previewInfo = mCustomThemeManager.buildCustomThemePreviewInfo(context);
@@ -114,7 +137,7 @@
previewInfo.headlineFontFamily, previewInfo.bottomSheeetCornerRadius,
previewInfo.shapeDrawable, previewInfo.shapeAppIcons, null,
mColorButtonIds, mColorTileIds, mColorTileIconIds, mShapeIconIds,
- new WallpaperLayoutListener(context));
+ new WallpaperLayoutListener());
mCoverPage.setCard(card);
mCoverPage.bindPreviewContent();
mNameEditor.addTextChangedListener(new TextWatcher() {
@@ -136,12 +159,7 @@
}
private class WallpaperLayoutListener implements OnLayoutChangeListener {
- private final Drawable mScrim;
- WallpaperLayoutListener(Context context) {
- mScrim = context.getResources()
- .getDrawable(R.drawable.theme_cover_scrim, context.getTheme());
- }
@Override
public void onLayoutChange(View view, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
@@ -160,9 +178,8 @@
private void setWallpaperBitmap(View view, Bitmap bitmap) {
Resources res = view.getContext().getResources();
Drawable background = new BitmapDrawable(res, bitmap);
- if (mScrim != null) {
- background = new LayerDrawable(new Drawable[]{background, mScrim});
- }
+ background.setAlpha(ThemeCoverPage.COVER_PAGE_WALLPAPER_ALPHA);
+
view.findViewById(R.id.theme_preview_card_background).setBackground(background);
}
}
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index 22fa1d4..f584dec 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -22,6 +22,7 @@
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
@@ -42,16 +43,20 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.widget.ContentLoadingProgressBar;
import androidx.recyclerview.widget.RecyclerView;
import com.android.customization.model.CustomizationManager.Callback;
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
import com.android.customization.model.theme.ThemeBundle;
import com.android.customization.model.theme.ThemeBundle.PreviewInfo;
import com.android.customization.model.theme.ThemeManager;
import com.android.customization.model.theme.custom.CustomTheme;
import com.android.customization.module.ThemesUserEventLogger;
import com.android.customization.picker.BasePreviewAdapter;
+import com.android.customization.picker.TimeTicker;
import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
+import com.android.customization.picker.theme.ThemePreviewPage.TimeContainer;
import com.android.customization.widget.OptionSelectorController;
import com.android.customization.widget.PreviewPager;
import com.android.wallpaper.R;
@@ -91,9 +96,13 @@
private ThemeBundle mSelectedTheme;
private ThemePreviewAdapter mAdapter;
private PreviewPager mPreviewPager;
+ private ContentLoadingProgressBar mLoading;
+ private View mContent;
+ private View mError;
private boolean mUseMyWallpaper;
private WallpaperInfo mCurrentHomeWallpaper;
private CurrentWallpaperInfoFactory mCurrentWallpaperFactory;
+ private TimeTicker mTicker;
@Override
public void onAttach(Context context) {
@@ -111,6 +120,9 @@
R.layout.fragment_theme_picker, container, /* attachToRoot */ false);
setUpToolbar(view);
+ mContent = view.findViewById(R.id.content_section);
+ mLoading = view.findViewById(R.id.loading_indicator);
+ mError = view.findViewById(R.id.error_section);
mCurrentWallpaperFactory = InjectorProvider.getInjector()
.getCurrentWallpaperFactory(getActivity().getApplicationContext());
mPreviewPager = view.findViewById(R.id.theme_preview_pager);
@@ -120,7 +132,6 @@
});
mUseMyWallpaperButton = view.findViewById(R.id.use_my_wallpaper);
mUseMyWallpaperButton.setOnCheckedChangeListener(this::onUseMyWallpaperCheckChanged);
-
setUpOptions(savedInstanceState);
return view;
@@ -148,7 +159,23 @@
@Override
public void onResume() {
super.onResume();
+ mTicker = TimeTicker.registerNewReceiver(getContext(), this::updateTime);
reloadWallpaper();
+ updateTime();
+ }
+
+ private void updateTime() {
+ if (mAdapter != null) {
+ mAdapter.updateTime();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (getContext() != null) {
+ getContext().unregisterReceiver(mTicker);
+ }
}
@Override
@@ -215,48 +242,73 @@
private void updateButtonsVisibility() {
mUseMyWallpaperButton.setVisibility(mSelectedTheme instanceof CustomTheme
- ? View.GONE : View.VISIBLE);
+ ? View.INVISIBLE : View.VISIBLE);
+ }
+
+ private void hideError() {
+ mContent.setVisibility(View.VISIBLE);
+ mError.setVisibility(View.GONE);
+ }
+
+ private void showError() {
+ mLoading.hide();
+ mContent.setVisibility(View.GONE);
+ mError.setVisibility(View.VISIBLE);
}
private void setUpOptions(@Nullable Bundle savedInstanceState) {
- mThemeManager.fetchOptions(options -> {
- mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
- mOptionsController.addListener(selected -> {
- if (selected instanceof CustomTheme && !((CustomTheme) selected).isDefined()) {
- navigateToCustomTheme((CustomTheme) selected);
- } else {
- mSelectedTheme = (ThemeBundle) selected;
- if (mUseMyWallpaper || mSelectedTheme instanceof CustomTheme) {
- mSelectedTheme.setOverrideThemeWallpaper(mCurrentHomeWallpaper);
+ hideError();
+ mLoading.show();
+ mThemeManager.fetchOptions(new OptionsFetchedListener<ThemeBundle>() {
+ @Override
+ public void onOptionsLoaded(List<ThemeBundle> options) {
+ mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
+ mOptionsController.addListener(selected -> {
+ mLoading.hide();
+ if (selected instanceof CustomTheme && !((CustomTheme) selected).isDefined()) {
+ navigateToCustomTheme((CustomTheme) selected);
} else {
- mSelectedTheme.setOverrideThemeWallpaper(null);
+ mSelectedTheme = (ThemeBundle) selected;
+ if (mUseMyWallpaper || mSelectedTheme instanceof CustomTheme) {
+ mSelectedTheme.setOverrideThemeWallpaper(mCurrentHomeWallpaper);
+ } else {
+ mSelectedTheme.setOverrideThemeWallpaper(null);
+ }
+ mEventLogger.logThemeSelected(mSelectedTheme,
+ selected instanceof CustomTheme);
+ createAdapter(options);
+ updateButtonsVisibility();
}
- mEventLogger.logThemeSelected(mSelectedTheme, selected instanceof CustomTheme);
- createAdapter(options);
- updateButtonsVisibility();
+ });
+ mOptionsController.initOptions(mThemeManager);
+ String previouslySelected = savedInstanceState != null
+ ? savedInstanceState.getString(KEY_SELECTED_THEME) : null;
+ for (ThemeBundle theme : options) {
+ if (previouslySelected != null
+ && previouslySelected.equals(theme.getSerializedPackages())) {
+ mSelectedTheme = theme;
+ } else if (theme.isActive(mThemeManager)) {
+ mSelectedTheme = theme;
+ break;
+ }
}
- });
- mOptionsController.initOptions(mThemeManager);
- String previouslySelected = savedInstanceState != null
- ? savedInstanceState.getString(KEY_SELECTED_THEME) : null;
- for (ThemeBundle theme : options) {
- if (previouslySelected != null
- && previouslySelected.equals(theme.getSerializedPackages())) {
- mSelectedTheme = theme;
- } else if (theme.isActive(mThemeManager)) {
- mSelectedTheme = theme;
- break;
+ if (mSelectedTheme == null) {
+ // Select the default theme if there is no matching custom enabled theme
+ // TODO(b/124796742): default to custom if there is no matching theme bundle
+ mSelectedTheme = options.get(0);
+ } else {
+ // Only show show checkmark if we found a matching theme
+ mOptionsController.setAppliedOption(mSelectedTheme);
}
+ mOptionsController.setSelectedOption(mSelectedTheme);
}
- if (mSelectedTheme == null) {
- // Select the default theme if there is no matching custom enabled theme
- // TODO(b/124796742): default to custom if there is no matching theme bundle
- mSelectedTheme = options.get(0);
- } else {
- // Only show show checkmark if we found a matching theme
- mOptionsController.setAppliedOption(mSelectedTheme);
+ @Override
+ public void onError(@Nullable Throwable throwable) {
+ if (throwable != null) {
+ Log.e(TAG, "Error loading theme bundles", throwable);
+ }
+ showError();
}
- mOptionsController.setSelectedOption(mSelectedTheme);
}, false);
}
@@ -307,8 +359,10 @@
private int[] mColorTileIds = {
R.id.preview_color_qs_0_bg, R.id.preview_color_qs_1_bg, R.id.preview_color_qs_2_bg
};
- private int[] mColorTileIconIds = {
- R.id.preview_color_qs_0_icon, R.id.preview_color_qs_1_icon, R.id.preview_color_qs_2_icon
+ private int[][] mColorTileIconIds = {
+ new int[]{ R.id.preview_color_qs_0_icon, 0},
+ new int[]{ R.id.preview_color_qs_1_icon, 1},
+ new int[] { R.id.preview_color_qs_2_icon, 3}
};
private int[] mShapeIconIds = {
@@ -322,16 +376,20 @@
super(activity, R.layout.theme_preview_card);
final Resources res = activity.getResources();
final PreviewInfo previewInfo = theme.getPreviewInfo();
+
Drawable coverScrim = theme instanceof CustomTheme
- ? res.getDrawable(R.drawable.theme_cover_scrim_custom, activity.getTheme())
- : res.getDrawable(R.drawable.theme_cover_scrim, activity.getTheme());
+ ? res.getDrawable(R.drawable.theme_cover_scrim, activity.getTheme())
+ : null;
+
+ WallpaperPreviewLayoutListener wallpaperListener = new WallpaperPreviewLayoutListener(
+ theme, previewInfo, coverScrim, true);
addPage(new ThemeCoverPage(activity, theme.getTitle(),
previewInfo.resolveAccentColor(res), previewInfo.icons,
previewInfo.headlineFontFamily, previewInfo.bottomSheeetCornerRadius,
previewInfo.shapeDrawable, previewInfo.shapeAppIcons, editClickListener,
mColorButtonIds, mColorTileIds, mColorTileIconIds, mShapeIconIds,
- new WallpaperPreviewLayoutListener(theme, previewInfo, coverScrim)));
+ wallpaperListener, coverCardLayoutListener));
addPage(new ThemePreviewPage(activity, R.string.preview_name_font, R.drawable.ic_font,
R.layout.preview_card_font_content,
previewInfo.resolveAccentColor(res)) {
@@ -397,7 +455,7 @@
for (int i = 0; i < mColorTileIds.length && i < previewInfo.icons.size();
i++) {
- Drawable icon = previewInfo.icons.get(i)
+ Drawable icon = previewInfo.icons.get(mColorTileIconIds[i][1])
.getConstantState().newDrawable().mutate();
Drawable bgShape =
previewInfo.shapeDrawable.getConstantState().newDrawable();
@@ -405,7 +463,7 @@
ImageView bg = card.findViewById(mColorTileIds[i]);
bg.setImageDrawable(bgShape);
- ImageView fg = card.findViewById(mColorTileIconIds[i]);
+ ImageView fg = card.findViewById(mColorTileIconIds[i][0]);
fg.setImageDrawable(icon);
}
}
@@ -432,7 +490,7 @@
previewInfo.resolveAccentColor(res)) {
private final WallpaperPreviewLayoutListener mListener =
- new WallpaperPreviewLayoutListener(theme, previewInfo, null);
+ new WallpaperPreviewLayoutListener(theme, previewInfo, null, false);
@Override
protected boolean containsWallpaper() {
@@ -461,16 +519,26 @@
}
}
+ public void updateTime() {
+ for (ThemePreviewPage page : mPages) {
+ if (page instanceof TimeContainer) {
+ ((TimeContainer)page).updateTime();
+ }
+ }
+ }
+
private static class WallpaperPreviewLayoutListener implements OnLayoutChangeListener {
private final ThemeBundle mTheme;
private final PreviewInfo mPreviewInfo;
private final Drawable mScrim;
+ private final boolean mIsTranslucent;
public WallpaperPreviewLayoutListener(ThemeBundle theme, PreviewInfo previewInfo,
- Drawable scrim) {
+ Drawable scrim, boolean translucent) {
mTheme = theme;
mPreviewInfo = previewInfo;
mScrim = scrim;
+ mIsTranslucent = translucent;
}
@Override
@@ -493,12 +561,23 @@
private void setWallpaperBitmap(View view, Bitmap bitmap) {
Resources res = view.getContext().getResources();
Drawable background = new BitmapDrawable(res, bitmap);
+ if (mIsTranslucent) {
+ background.setAlpha(ThemeCoverPage.COVER_PAGE_WALLPAPER_ALPHA);
+ }
if (mScrim != null) {
background = new LayerDrawable(new Drawable[]{background, mScrim});
}
view.findViewById(R.id.theme_preview_card_background).setBackground(background);
- if (mScrim == null) {
+ if (mScrim == null && !mIsTranslucent) {
+ boolean shouldRecycle = false;
+ if (bitmap.getConfig() == Config.HARDWARE) {
+ bitmap = bitmap.copy(Config.ARGB_8888, false);
+ shouldRecycle = true;
+ }
int colorsHint = WallpaperColors.fromBitmap(bitmap).getColorHints();
+ if (shouldRecycle) {
+ bitmap.recycle();
+ }
TextView header = view.findViewById(R.id.theme_preview_card_header);
if ((colorsHint & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0) {
int colorLight = res.getColor(R.color.text_color_light, null);
diff --git a/src/com/android/customization/picker/theme/ThemePreviewPage.java b/src/com/android/customization/picker/theme/ThemePreviewPage.java
index 3c58079..0543b24 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;
@@ -30,10 +31,14 @@
import java.util.TimeZone;
abstract class ThemePreviewPage extends PreviewPage {
+
+ public interface TimeContainer {
+ void updateTime();
+ }
+
@StringRes
final int nameResId;
- @DrawableRes
- final int iconSrc;
+ final Drawable icon;
@LayoutRes
final int contentLayoutRes;
@ColorInt
@@ -45,7 +50,13 @@
@ColorInt int accentColor) {
super(null);
this.nameResId = titleResId;
- this.iconSrc = iconSrc;
+ if (iconSrc != Resources.ID_NULL) {
+ this.icon = context.getResources().getDrawable(iconSrc, context.getTheme());
+ int size = context.getResources().getDimensionPixelSize(R.dimen.card_header_icon_size);
+ icon.setBounds(0, 0, size, size);
+ } else {
+ this.icon = null;
+ }
this.contentLayoutRes = contentLayoutRes;
this.accentColor = accentColor;
this.inflater = LayoutInflater.from(context);
@@ -55,7 +66,7 @@
public void bindPreviewContent() {
TextView header = card.findViewById(R.id.theme_preview_card_header);
header.setText(nameResId);
- header.setCompoundDrawablesWithIntrinsicBounds(0, iconSrc, 0, 0);
+ header.setCompoundDrawables(null, icon, null, null);
header.setCompoundDrawableTintList(ColorStateList.valueOf(accentColor));
card.findViewById(R.id.theme_preview_top_bar).setVisibility(View.GONE);
card.findViewById(R.id.edit_label).setVisibility(View.GONE);
@@ -71,7 +82,14 @@
protected abstract void bindBody(boolean forceRebind);
- static class ThemeCoverPage extends ThemePreviewPage {
+ static class ThemeCoverPage extends ThemePreviewPage implements TimeContainer {
+
+ public static final int COVER_PAGE_WALLPAPER_ALPHA = 0x66;
+ /**
+ * Maps which icon from ResourceConstants#ICONS_FOR_PREVIEW to use for each icon in the
+ * top bar (fake "status bar") of the cover page.
+ */
+ private static final int [] sTopBarIconToPreviewIcon = new int [] { 0, 6, 7 };
private final Typeface mHeadlineFont;
private final List<Drawable> mIcons;
@@ -79,12 +97,12 @@
private Drawable mShapeDrawable;
private final int[] mColorButtonIds;
private final int[] mColorTileIds;
- private final int[] mColorTileIconIds;
+ private final int[][] mColorTileIconIds;
private final int[] mShapeIconIds;
private final Resources mRes;
private String mTitle;
private OnClickListener mEditClickListener;
- private final OnLayoutChangeListener mListener;
+ private final OnLayoutChangeListener[] mListeners;
private final int mCornerRadius;
private final ColorStateList mTintList;
@@ -93,8 +111,8 @@
Drawable shapeDrawable,
List<Drawable> shapeAppIcons,
OnClickListener editClickListener,
- int[] colorButtonIds, int[] colorTileIds, int[] colorTileIconIds,
- int[] shapeIconIds, OnLayoutChangeListener wallpaperListener) {
+ int[] colorButtonIds, int[] colorTileIds, int[][] colorTileIconIds,
+ int[] shapeIconIds, OnLayoutChangeListener... wallpaperListeners) {
super(context, 0, 0, R.layout.preview_card_cover_content, accentColor);
mRes = context.getResources();
mTitle = title;
@@ -108,7 +126,7 @@
mColorTileIds = colorTileIds;
mColorTileIconIds = colorTileIconIds;
mShapeIconIds = shapeIconIds;
- mListener = wallpaperListener;
+ mListeners = wallpaperListeners;
// Color QS icons:
int controlGreyColor = mRes.getColor(R.color.control_grey, null);
mTintList = new ColorStateList(
@@ -130,8 +148,14 @@
if (card == null) {
return;
}
+ if (mListeners != null) {
+ for (OnLayoutChangeListener listener : mListeners) {
+ if (listener != null) {
+ card.addOnLayoutChangeListener(listener);
+ }
+ }
+ }
- card.addOnLayoutChangeListener(mListener);
if (forceRebind) {
card.requestLayout();
}
@@ -143,14 +167,14 @@
}
}
for (int i = 0; i < 3 && i < mIcons.size(); i++) {
- Drawable icon =
- mIcons.get(i).getConstantState().newDrawable().mutate();
+ Drawable icon = mIcons.get(mColorTileIconIds[i][1]).getConstantState()
+ .newDrawable().mutate();
Drawable bgShape = mShapeDrawable.getConstantState().newDrawable();
bgShape.setTint(accentColor);
ImageView bg = card.findViewById(mColorTileIds[i]);
bg.setImageDrawable(bgShape);
- ImageView fg = card.findViewById(mColorTileIconIds[i]);
+ ImageView fg = card.findViewById(mColorTileIconIds[i][0]);
fg.setImageDrawable(icon);
}
@@ -176,9 +200,15 @@
ViewGroup iconsContainer = card.findViewById(R.id.theme_preview_top_bar_icons);
- for (int i = 0; i < iconsContainer.getChildCount() && i < mIcons.size(); i++) {
- ((ImageView) iconsContainer.getChildAt(i))
- .setImageDrawable(mIcons.get(i).getConstantState().newDrawable().mutate());
+ for (int i = 0; i < iconsContainer.getChildCount(); i++) {
+ int iconIndex = sTopBarIconToPreviewIcon[i];
+ if (iconIndex < mIcons.size()) {
+ ((ImageView) iconsContainer.getChildAt(i))
+ .setImageDrawable(mIcons.get(iconIndex).getConstantState()
+ .newDrawable().mutate());
+ } else {
+ iconsContainer.getChildAt(i).setVisibility(View.GONE);
+ }
}
ViewGroup body = card.findViewById(R.id.theme_preview_card_body_container);
@@ -204,6 +234,20 @@
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
+ public void updateTime() {
+ if (card != null) {
+ ((TextView) card.findViewById(R.id.theme_preview_clock)).setText(
+ getFormattedTime());
+ }
}
private boolean useRoundedQSB(int cornerRadius) {
diff --git a/src/com/android/customization/widget/OptionSelectorController.java b/src/com/android/customization/widget/OptionSelectorController.java
index b2a81aa..9c92079 100644
--- a/src/com/android/customization/widget/OptionSelectorController.java
+++ b/src/com/android/customization/widget/OptionSelectorController.java
@@ -15,17 +15,17 @@
*/
package com.android.customization.widget;
+import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
+import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
import android.view.WindowManager;
-import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -35,7 +35,6 @@
import com.android.customization.model.CustomizationManager;
import com.android.customization.model.CustomizationOption;
-import com.android.customization.model.theme.custom.ThemeComponentOption;
import com.android.wallpaper.R;
import java.util.HashSet;
@@ -130,28 +129,24 @@
if (holder instanceof TileViewHolder) {
TileViewHolder tileHolder = (TileViewHolder) holder;
- if (tileHolder.labelView != null) {
- if (isActivated) {
- if (option == mAppliedOption) {
- CharSequence cd = mContainer.getContext().getString(
- R.string.option_applied_previewed_description,
- option.getTitle());
- tileHolder.labelView.setContentDescription(cd);
- } else {
- CharSequence cd = mContainer.getContext().getString(
- R.string.option_previewed_description, option.getTitle());
- tileHolder.labelView.setContentDescription(cd);
- }
- } else if (option == mAppliedOption) {
- CharSequence cd = mContainer.getContext().getString(
- R.string.option_applied_description, option.getTitle());
- tileHolder.labelView.setContentDescription(cd);
+ if (isActivated) {
+ if (option == mAppliedOption && mShowCheckmark) {
+ tileHolder.setContentDescription(mContainer.getContext(), option,
+ R.string.option_applied_previewed_description);
} else {
- // Remove content description
- tileHolder.labelView.setContentDescription(null);
+ tileHolder.setContentDescription(mContainer.getContext(), option,
+ R.string.option_previewed_description);
}
+ } else if (option == mAppliedOption && mShowCheckmark) {
+ tileHolder.setContentDescription(mContainer.getContext(), option,
+ R.string.option_applied_description);
+ } else {
+ tileHolder.resetContentDescription();
}
}
+ } else {
+ // Item is not visible, make sure the item is re-bound when it becomes visible
+ mAdapter.notifyItemChanged(index);
}
}
@@ -191,7 +186,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};
@@ -201,20 +196,23 @@
// 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);
+ holder.setContentDescription(mContainer.getContext(), option,
+ R.string.option_applied_previewed_description);
+ } else if (option.equals(mAppliedOption)) {
+ // Initialize with "previewed" description if we don't show checkmark
+ holder.setContentDescription(mContainer.getContext(), option,
+ R.string.option_previewed_description);
} else if (mShowCheckmark) {
- holder.itemView.setForeground(null);
+ holder.tileView.setForeground(null);
}
}
@@ -287,11 +285,44 @@
private static class TileViewHolder extends RecyclerView.ViewHolder {
TextView labelView;
View tileView;
+ CharSequence title;
TileViewHolder(@NonNull View itemView) {
super(itemView);
labelView = itemView.findViewById(R.id.option_label);
tileView = itemView.findViewById(R.id.option_tile);
+ title = null;
+ }
+
+ /**
+ * Set the content description for this holder using the given string id.
+ * If the option does not have a label, the description will be set on the tile view.
+ * @param context The view's context
+ * @param option The customization option
+ * @param id Resource ID of the string to use for the content description
+ */
+ public void setContentDescription(Context context, CustomizationOption option, int id) {
+ title = option.getTitle();
+ if (TextUtils.isEmpty(title) && tileView != null) {
+ title = tileView.getContentDescription();
+ }
+
+ CharSequence cd = context.getString(id, title);
+ if (labelView != null && !TextUtils.isEmpty(labelView.getText())) {
+ labelView.setContentDescription(cd);
+ } else if (tileView != null) {
+ tileView.setAccessibilityPaneTitle(cd);
+ tileView.setContentDescription(cd);
+ }
+ }
+
+ public void resetContentDescription() {
+ if (labelView != null && !TextUtils.isEmpty(labelView.getText())) {
+ labelView.setContentDescription(title);
+ } else if (tileView != null) {
+ tileView.setAccessibilityPaneTitle(title);
+ tileView.setContentDescription(title);
+ }
}
}
}
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);
diff --git a/src/com/android/customization/widget/PreviewPager.java b/src/com/android/customization/widget/PreviewPager.java
index 9bf7651..73a5554 100644
--- a/src/com/android/customization/widget/PreviewPager.java
+++ b/src/com/android/customization/widget/PreviewPager.java
@@ -117,7 +117,7 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- if (mPageStyle == STYLE_ASPECT_RATIO && mViewPager.getMeasuredWidth() == 0) {
+ if (mPageStyle == STYLE_ASPECT_RATIO) {
int availableWidth = MeasureSpec.getSize(widthMeasureSpec);
int availableHeight = MeasureSpec.getSize(heightMeasureSpec);
int indicatorHeight = mPageIndicator.getVisibility() == VISIBLE
diff --git a/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java b/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java
new file mode 100644
index 0000000..bc5f309
--- /dev/null
+++ b/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 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.google.android.apps.wallpaper.asset;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.os.AsyncTask;
+
+import androidx.annotation.Nullable;
+
+import com.android.wallpaper.asset.Asset;
+import com.android.wallpaper.module.DrawableLayerResolver;
+import com.android.wallpaper.module.InjectorProvider;
+
+public class ThemeBundleThumbAsset extends Asset {
+ private final Resources mRes;
+ private final int mResId;
+ private final DrawableLayerResolver mLayerResolver;
+
+ public ThemeBundleThumbAsset(Resources res, int resId) {
+ mRes = res;
+ mResId = resId;
+ mLayerResolver = InjectorProvider.getInjector().getDrawableLayerResolver();
+ }
+
+ @Override
+ public void decodeBitmap(int targetWidth, int targetHeight, BitmapReceiver receiver) {
+ // No scaling is needed, as the thumbnail is already a thumbnail.
+ LoadThumbnailTask task = new LoadThumbnailTask(mRes, mResId, mLayerResolver, receiver);
+ task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ @Override
+ public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
+ BitmapReceiver receiver) {
+
+ }
+
+ @Override
+ public void decodeRawDimensions(@Nullable Activity activity, DimensionsReceiver receiver) {
+
+ }
+
+ @Override
+ public boolean supportsTiling() {
+ return false;
+ }
+
+ /**
+ * AsyncTask subclass which loads the live wallpaper's thumbnail bitmap off the main UI thread.
+ * Resolves with null if live wallpaper thumbnail is not a bitmap.
+ */
+ private static class LoadThumbnailTask extends AsyncTask<Void, Void, Bitmap> {
+ private final DrawableLayerResolver mLayerResolver;
+ private final Resources mResources;
+ private final int mResId;
+ private BitmapReceiver mReceiver;
+
+ public LoadThumbnailTask(Resources res, int resId, DrawableLayerResolver resolver,
+ BitmapReceiver receiver) {
+ mLayerResolver = resolver;
+ mReceiver = receiver;
+ mResources = res;
+ mResId = resId;
+ }
+
+ @Override
+ protected Bitmap doInBackground(Void... unused) {
+ Drawable thumb = mResources.getDrawable(mResId, null);
+
+ // Live wallpaper components may or may not specify a thumbnail drawable.
+ if (thumb instanceof BitmapDrawable) {
+ return ((BitmapDrawable) thumb).getBitmap();
+ } else if (thumb instanceof LayerDrawable) {
+ Drawable layer = mLayerResolver.resolveLayer((LayerDrawable) thumb);
+ if (layer instanceof BitmapDrawable) {
+ return ((BitmapDrawable) layer).getBitmap();
+ }
+ }
+
+ // If no thumbnail was specified, return a null bitmap.
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Bitmap bitmap) {
+ mReceiver.onBitmapDecoded(bitmap);
+ }
+ }
+}
diff --git a/src_override/com/android/wallpaper/module/WallpapersInjector.java b/src_override/com/android/wallpaper/module/WallpapersInjector.java
index 67b07fd..1ffca80 100755
--- a/src_override/com/android/wallpaper/module/WallpapersInjector.java
+++ b/src_override/com/android/wallpaper/module/WallpapersInjector.java
@@ -65,6 +65,7 @@
@Override
public Fragment getPreviewFragment(
+ Context context,
WallpaperInfo wallpaperInfo,
int mode,
boolean testingModeEnabled) {