[automerger skipped] DO NOT MERGE - Empty merge qt-qpr1-dev-plus-aosp into stag-aosp-master am: 075431a3e0 -s ours
am skip reason: subject contains skip directive
Change-Id: Ia5ba151bee977f0cd21b785c9f192216f9c94d76
diff --git a/Android.mk b/Android.mk
index eb83a9f..987c875 100644
--- a/Android.mk
+++ b/Android.mk
@@ -26,7 +26,7 @@
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_ANDROID_LIBRARIES := WallpaperPicker2CommonDepsLib
-LOCAL_STATIC_JAVA_LIBRARIES := styleprotosnano
+LOCAL_STATIC_JAVA_LIBRARIES := styleprotosnano SystemUI-statsd SystemUISharedLib
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_PACKAGE_NAME := ThemePicker
diff --git a/res/anim/major_a_b_dot_01_animation.xml b/res/anim/major_a_b_dot_01_animation.xml
deleted file mode 100644
index 89fc4c7..0000000
--- a/res/anim/major_a_b_dot_01_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 3.25,4.0 c 0.79167,0.0 3.95833,0.0 4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/major_a_b_dot_animation.xml b/res/anim/major_a_b_dot_animation.xml
deleted file mode 100644
index f24534f..0000000
--- a/res/anim/major_a_b_dot_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueTo="M -4.75,-2.75 l 9.5,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l -9.5,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/major_b_a_dot_01_animation.xml b/res/anim/major_b_a_dot_01_animation.xml
deleted file mode 100644
index a53ad37..0000000
--- a/res/anim/major_b_a_dot_01_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 8.0,4.0 c -0.79167,0.0 -3.95833,0.0 -4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/major_b_a_dot_animation.xml b/res/anim/major_b_a_dot_animation.xml
deleted file mode 100644
index d89512e..0000000
--- a/res/anim/major_b_a_dot_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="pathData"
- android:valueFrom="M -4.75,-2.75 l 9.5,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l -9.5,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueTo="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/major_b_c_dot_01_animation.xml b/res/anim/major_b_c_dot_01_animation.xml
deleted file mode 100644
index e84994f..0000000
--- a/res/anim/major_b_c_dot_01_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 8.0,4.0 c 0.79167,0.0 3.95833,0.0 4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/major_b_c_dot_animation.xml b/res/anim/major_b_c_dot_animation.xml
deleted file mode 100644
index d89512e..0000000
--- a/res/anim/major_b_c_dot_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="pathData"
- android:valueFrom="M -4.75,-2.75 l 9.5,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l -9.5,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueTo="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/major_c_b_dot_01_animation.xml b/res/anim/major_c_b_dot_01_animation.xml
deleted file mode 100644
index 9df1f01..0000000
--- a/res/anim/major_c_b_dot_01_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 12.75,4.0 c -0.79167,0.0 -3.95833,0.0 -4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/major_c_b_dot_animation.xml b/res/anim/major_c_b_dot_animation.xml
deleted file mode 100644
index f24534f..0000000
--- a/res/anim/major_c_b_dot_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="pathData"
- android:valueFrom="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueTo="M -4.75,-2.75 l 9.5,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l -9.5,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/minor_a_b_dot_02_animation.xml b/res/anim/minor_a_b_dot_02_animation.xml
deleted file mode 100644
index 89fc4c7..0000000
--- a/res/anim/minor_a_b_dot_02_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 3.25,4.0 c 0.79167,0.0 3.95833,0.0 4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/minor_b_a_dot_02_animation.xml b/res/anim/minor_b_a_dot_02_animation.xml
deleted file mode 100644
index a53ad37..0000000
--- a/res/anim/minor_b_a_dot_02_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 8.0,4.0 c -0.79167,0.0 -3.95833,0.0 -4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/minor_b_c_dot_02_animation.xml b/res/anim/minor_b_c_dot_02_animation.xml
deleted file mode 100644
index e84994f..0000000
--- a/res/anim/minor_b_c_dot_02_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 8.0,4.0 c 0.79167,0.0 3.95833,0.0 4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/anim/minor_c_b_dot_02_animation.xml b/res/anim/minor_c_b_dot_02_animation.xml
deleted file mode 100644
index 9df1f01..0000000
--- a/res/anim/minor_c_b_dot_02_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 12.75,4.0 c -0.79167,0.0 -3.95833,0.0 -4.75,0.0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/color/indicator_arrow_color.xml b/res/color/indicator_arrow_color.xml
deleted file mode 100644
index 198d002..0000000
--- a/res/color/indicator_arrow_color.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_enabled="false"
- android:color="@color/preview_pager_arrow_disabled" />
- <item
- android:state_enabled="true"
- android:color="?android:attr/colorAccent" />
-</selector>
diff --git a/res/color/option_border_color.xml b/res/color/option_border_color.xml
deleted file mode 100644
index ec5ab97..0000000
--- a/res/color/option_border_color.xml
+++ /dev/null
@@ -1,28 +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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_activated="true"
- android:color="?android:colorAccent" />
- <item
- android:state_activated="false"
- android:alpha="0.24"
- android:color="?android:colorAccent" />
- <item
- android:alpha="0.05"
- android:color="@color/option_border_default"/>
-</selector>
diff --git a/res/color/option_title_color.xml b/res/color/option_title_color.xml
deleted file mode 100644
index 2809247..0000000
--- a/res/color/option_title_color.xml
+++ /dev/null
@@ -1,27 +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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_activated="true"
- android:color="?android:colorAccent" />
- <item
- android:state_activated="false"
- android:alpha="0.54"
- android:color="?android:colorForeground" />
- <item
- android:color="?android:colorForeground"/>
-</selector>
diff --git a/res/drawable/ic_arrow_back_24px.xml b/res/drawable/ic_arrow_back_24px.xml
deleted file mode 100644
index 3eb00c7..0000000
--- a/res/drawable/ic_arrow_back_24px.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
- Copyright (C) 2018 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 xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="?android:attr/colorForeground"
- android:pathData="M16.41,5.41l-1.41,-1.41l-8,8l8,8l1.41,-1.41l-6.58,-6.59"/>
-</vector>
diff --git a/res/drawable/ic_arrow_forward_24px.xml b/res/drawable/ic_arrow_forward_24px.xml
deleted file mode 100644
index a7284b2..0000000
--- a/res/drawable/ic_arrow_forward_24px.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
- Copyright (C) 2018 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 xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="?android:attr/colorForeground"
- android:pathData="M7.59,18.59l1.41,1.41l8,-8l-8,-8l-1.41,1.41l6.58,6.59"/>
-</vector>
diff --git a/res/drawable/major_a_b.xml b/res/drawable/major_a_b.xml
deleted file mode 100644
index 3878fbd..0000000
--- a/res/drawable/major_a_b.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="major_a_b"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8"
- android:tint="?android:attr/colorControlNormal">
- <group
- android:name="dot_01"
- android:translateX="3.25"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/major_a_b_animation.xml b/res/drawable/major_a_b_animation.xml
deleted file mode 100644
index d9f0c80..0000000
--- a/res/drawable/major_a_b_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/major_a_b" >
- <target
- android:name="dot_01"
- android:animation="@anim/major_a_b_dot_01_animation" />
- <target
- android:name="dot"
- android:animation="@anim/major_a_b_dot_animation" />
-</animated-vector>
diff --git a/res/drawable/major_b_a.xml b/res/drawable/major_b_a.xml
deleted file mode 100644
index 6fc80ad..0000000
--- a/res/drawable/major_b_a.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="major_b_a"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8"
- android:tint="?android:attr/colorControlNormal" >
- <group
- android:name="dot_01"
- android:translateX="8"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M -4.75,-2.75 l 9.5,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l -9.5,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/major_b_a_animation.xml b/res/drawable/major_b_a_animation.xml
deleted file mode 100644
index 2e0900a..0000000
--- a/res/drawable/major_b_a_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/major_b_a" >
- <target
- android:name="dot_01"
- android:animation="@anim/major_b_a_dot_01_animation" />
- <target
- android:name="dot"
- android:animation="@anim/major_b_a_dot_animation" />
-</animated-vector>
diff --git a/res/drawable/major_b_c.xml b/res/drawable/major_b_c.xml
deleted file mode 100644
index 8d51e20..0000000
--- a/res/drawable/major_b_c.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="major_b_c"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8"
- android:tint="?android:attr/colorControlNormal" >
- <group
- android:name="dot_01"
- android:translateX="8"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M -4.75,-2.75 l 9.5,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l -9.5,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/major_b_c_animation.xml b/res/drawable/major_b_c_animation.xml
deleted file mode 100644
index ccf1608..0000000
--- a/res/drawable/major_b_c_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/major_b_c" >
- <target
- android:name="dot_01"
- android:animation="@anim/major_b_c_dot_01_animation" />
- <target
- android:name="dot"
- android:animation="@anim/major_b_c_dot_animation" />
-</animated-vector>
diff --git a/res/drawable/major_c_b.xml b/res/drawable/major_c_b.xml
deleted file mode 100644
index 9930187..0000000
--- a/res/drawable/major_c_b.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="major_c_b"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8"
- android:tint="?android:attr/colorControlNormal" >
- <group
- android:name="dot_01"
- android:translateX="12.75"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/major_c_b_animation.xml b/res/drawable/major_c_b_animation.xml
deleted file mode 100644
index 21ea528..0000000
--- a/res/drawable/major_c_b_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/major_c_b" >
- <target
- android:name="dot_01"
- android:animation="@anim/major_c_b_dot_01_animation" />
- <target
- android:name="dot"
- android:animation="@anim/major_c_b_dot_animation" />
-</animated-vector>
diff --git a/res/drawable/minor_a_b.xml b/res/drawable/minor_a_b.xml
deleted file mode 100644
index 522d2e9..0000000
--- a/res/drawable/minor_a_b.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="minor_a_b"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8" >
- <group
- android:name="dot_02"
- android:translateX="3.25"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/minor_a_b_animation.xml b/res/drawable/minor_a_b_animation.xml
deleted file mode 100644
index 9784b84..0000000
--- a/res/drawable/minor_a_b_animation.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/minor_a_b" >
- <target
- android:name="dot_02"
- android:animation="@anim/minor_a_b_dot_02_animation" />
-</animated-vector>
diff --git a/res/drawable/minor_b_a.xml b/res/drawable/minor_b_a.xml
deleted file mode 100644
index 4f3029a..0000000
--- a/res/drawable/minor_b_a.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="minor_b_a"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8" >
- <group
- android:name="dot_02"
- android:translateX="8"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/minor_b_a_animation.xml b/res/drawable/minor_b_a_animation.xml
deleted file mode 100644
index 4cb26c1..0000000
--- a/res/drawable/minor_b_a_animation.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/minor_b_a" >
- <target
- android:name="dot_02"
- android:animation="@anim/minor_b_a_dot_02_animation" />
-</animated-vector>
diff --git a/res/drawable/minor_b_c.xml b/res/drawable/minor_b_c.xml
deleted file mode 100644
index 0757071..0000000
--- a/res/drawable/minor_b_c.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="minor_b_c"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8" >
- <group
- android:name="dot_02"
- android:translateX="8"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/minor_b_c_animation.xml b/res/drawable/minor_b_c_animation.xml
deleted file mode 100644
index c2aa8b7..0000000
--- a/res/drawable/minor_b_c_animation.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/minor_b_c" >
- <target
- android:name="dot_02"
- android:animation="@anim/minor_b_c_dot_02_animation" />
-</animated-vector>
diff --git a/res/drawable/minor_c_b.xml b/res/drawable/minor_c_b.xml
deleted file mode 100644
index ba056fb..0000000
--- a/res/drawable/minor_c_b.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="minor_c_b"
- android:width="16dp"
- android:viewportWidth="16"
- android:height="8dp"
- android:viewportHeight="8" >
- <group
- android:name="dot_02"
- android:translateX="12.75"
- android:translateY="4" >
- <group
- android:name="dot_group" >
- <path
- android:name="dot"
- android:fillColor="#FFFFFFFF"
- android:pathData="M 0.0,-2.75 l 0.0,0.0 c 1.51878306195,0.0 2.75,1.23121693805 2.75,2.75 l 0.0,0.0 c 0.0,1.51878306195 -1.23121693805,2.75 -2.75,2.75 l 0.0,0.0 c -1.51878306195,0.0 -2.75,-1.23121693805 -2.75,-2.75 l 0.0,0.0 c 0.0,-1.51878306195 1.23121693805,-2.75 2.75,-2.75 Z" />
- </group>
- </group>
-</vector>
diff --git a/res/drawable/minor_c_b_animation.xml b/res/drawable/minor_c_b_animation.xml
deleted file mode 100644
index 9c9a8cc..0000000
--- a/res/drawable/minor_c_b_animation.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<animated-vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/minor_c_b" >
- <target
- android:name="dot_02"
- android:animation="@anim/minor_c_b_dot_02_animation" />
-</animated-vector>
diff --git a/res/drawable/option_border.xml b/res/drawable/option_border.xml
deleted file mode 100644
index 6ce76c7..0000000
--- a/res/drawable/option_border.xml
+++ /dev/null
@@ -1,25 +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.
--->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="?android:attr/colorControlHighlight">
- <item android:id="@android:id/mask">
- <shape android:shape="rectangle">
- <solid android:color="@android:color/white"/>
- <corners android:radius="4dp" />
- </shape>
- </item>
- <item android:drawable="@drawable/option_border_edge" />
-</ripple>
diff --git a/res/drawable/option_border_edge.xml b/res/drawable/option_border_edge.xml
deleted file mode 100644
index 943920e..0000000
--- a/res/drawable/option_border_edge.xml
+++ /dev/null
@@ -1,34 +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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_activated="true">
- <shape android:shape="rectangle">
- <stroke
- android:color="@color/option_border_color"
- android:width="@dimen/option_selected_border_width" />
- <corners android:radius="4dp" />
- </shape>
- </item>
- <item android:state_activated="false">
- <shape android:shape="rectangle">
- <stroke
- android:color="@color/option_border_color"
- android:width="@dimen/option_border_width" />
- <corners android:radius="4dp" />
- </shape>
- </item>
-</selector>
diff --git a/res/layout-land/fragment_clock_picker.xml b/res/layout-land/fragment_clock_picker.xml
index b5044b7..e2c5d34 100644
--- a/res/layout-land/fragment_clock_picker.xml
+++ b/res/layout-land/fragment_clock_picker.xml
@@ -33,7 +33,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
- <com.android.customization.widget.PreviewPager
+ <com.android.wallpaper.widget.PreviewPager
android:id="@+id/clock_preview_pager"
android:layout_width="0dp"
android:layout_height="match_parent"
@@ -86,7 +86,7 @@
android:visibility="gone">
<TextView
android:id="@+id/error_message"
- style="@style/HeaderTextAppearance"
+ style="@style/TitleTextAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
diff --git a/res/layout-land/fragment_custom_theme_component.xml b/res/layout-land/fragment_custom_theme_component.xml
index cc834e3..6883d63 100644
--- a/res/layout-land/fragment_custom_theme_component.xml
+++ b/res/layout-land/fragment_custom_theme_component.xml
@@ -62,7 +62,7 @@
android:layout_gravity="center"
android:layout_margin="10dp"
android:textAlignment="center"
- android:textAppearance="@style/HeaderTextAppearance"/>
+ android:textAppearance="@style/TitleTextAppearance"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/options_container"
diff --git a/res/layout-land/fragment_custom_theme_name.xml b/res/layout-land/fragment_custom_theme_name.xml
index 0f190a8..3c85f35 100644
--- a/res/layout-land/fragment_custom_theme_name.xml
+++ b/res/layout-land/fragment_custom_theme_name.xml
@@ -59,7 +59,7 @@
android:layout_gravity="center"
android:layout_margin="10dp"
android:textAlignment="center"
- android:textAppearance="@style/HeaderTextAppearance"/>
+ android:textAppearance="@style/TitleTextAppearance"/>
<FrameLayout
android:layout_width="match_parent"
diff --git a/res/layout-land/fragment_grid_picker.xml b/res/layout-land/fragment_grid_picker.xml
index 6fc5933..77330a8 100644
--- a/res/layout-land/fragment_grid_picker.xml
+++ b/res/layout-land/fragment_grid_picker.xml
@@ -31,7 +31,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
- <com.android.customization.widget.PreviewPager
+ <com.android.wallpaper.widget.PreviewPager
android:id="@+id/grid_preview_pager"
android:layout_width="0dp"
android:layout_height="match_parent"
@@ -84,7 +84,7 @@
android:visibility="gone">
<TextView
android:id="@+id/error_message"
- style="@style/HeaderTextAppearance"
+ style="@style/TitleTextAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
diff --git a/res/layout-land/fragment_theme_picker.xml b/res/layout-land/fragment_theme_picker.xml
index cd3cdbd..f2083f3 100644
--- a/res/layout-land/fragment_theme_picker.xml
+++ b/res/layout-land/fragment_theme_picker.xml
@@ -31,7 +31,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
- <com.android.customization.widget.PreviewPager
+ <com.android.wallpaper.widget.PreviewPager
android:id="@+id/theme_preview_pager"
android:layout_width="0dp"
android:layout_height="match_parent"
@@ -98,7 +98,7 @@
android:visibility="gone">
<TextView
android:id="@+id/error_message"
- style="@style/HeaderTextAppearance"
+ style="@style/TitleTextAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
diff --git a/res/layout/activity_customization_picker_main.xml b/res/layout/activity_customization_picker_main.xml
index 5910ab6..40af303 100755
--- a/res/layout/activity_customization_picker_main.xml
+++ b/res/layout/activity_customization_picker_main.xml
@@ -36,4 +36,6 @@
app:labelVisibilityMode="labeled"
app:menu="@menu/bottom_navigation_menu"/>
+ <include layout="@layout/bottom_action_bar" />
+
</FrameLayout>
diff --git a/res/layout/fragment_clock_picker.xml b/res/layout/fragment_clock_picker.xml
index e7530f3..6b9f94c 100644
--- a/res/layout/fragment_clock_picker.xml
+++ b/res/layout/fragment_clock_picker.xml
@@ -32,7 +32,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <com.android.customization.widget.PreviewPager
+ <com.android.wallpaper.widget.PreviewPager
android:id="@+id/clock_preview_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -100,7 +100,7 @@
android:visibility="gone">
<TextView
android:id="@+id/error_message"
- style="@style/HeaderTextAppearance"
+ style="@style/TitleTextAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
diff --git a/res/layout/fragment_clock_scalable_picker.xml b/res/layout/fragment_clock_scalable_picker.xml
new file mode 100644
index 0000000..db31dc5
--- /dev/null
+++ b/res/layout/fragment_clock_scalable_picker.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+ 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:background="?android:colorPrimary"
+ android:orientation="vertical">
+
+ <include layout="@layout/section_header" />
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_behavior="@string/scalable_container_behavior">
+
+ <com.android.wallpaper.widget.PreviewPager
+ android:id="@+id/clock_preview_pager"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/preview_pager_background" />
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/scalable_content_container"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/content_container_maximum_height"
+ app:behavior_peekHeight="@dimen/content_container_minimum_height"
+ app:layout_behavior="@string/bottom_sheet_behavior">
+
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/content_section"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <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_toTopOf="parent"
+ 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_gravity="end"
+ android:layout_marginVertical="10dp"
+ android:layout_marginEnd="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>
+ </FrameLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <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_gravity="center_horizontal|top"
+ android:layout_marginTop="200dp"
+ 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/TitleTextAppearance"
+ 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>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/res/layout/fragment_custom_theme_component.xml b/res/layout/fragment_custom_theme_component.xml
index fb9c36c..cf80192 100644
--- a/res/layout/fragment_custom_theme_component.xml
+++ b/res/layout/fragment_custom_theme_component.xml
@@ -76,7 +76,7 @@
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:textAlignment="center"
- android:textAppearance="@style/HeaderTextAppearance"
+ android:textAppearance="@style/TitleTextAppearance"
android:textSize="@dimen/component_options_title_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/res/layout/fragment_custom_theme_name.xml b/res/layout/fragment_custom_theme_name.xml
index 6a3d1ba..0a18aab 100644
--- a/res/layout/fragment_custom_theme_name.xml
+++ b/res/layout/fragment_custom_theme_name.xml
@@ -67,7 +67,7 @@
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:textAlignment="center"
- android:textAppearance="@style/HeaderTextAppearance"
+ android:textAppearance="@style/TitleTextAppearance"
android:textSize="@dimen/component_options_title_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/res/layout/fragment_grid_picker.xml b/res/layout/fragment_grid_picker.xml
index 182d795..f664568 100644
--- a/res/layout/fragment_grid_picker.xml
+++ b/res/layout/fragment_grid_picker.xml
@@ -32,7 +32,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <com.android.customization.widget.PreviewPager
+ <com.android.wallpaper.widget.PreviewPager
android:id="@+id/grid_preview_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -99,7 +99,7 @@
android:visibility="gone">
<TextView
android:id="@+id/error_message"
- style="@style/HeaderTextAppearance"
+ style="@style/TitleTextAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
diff --git a/res/layout/fragment_grid_scalable_picker.xml b/res/layout/fragment_grid_scalable_picker.xml
new file mode 100644
index 0000000..de44923
--- /dev/null
+++ b/res/layout/fragment_grid_scalable_picker.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+ 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:background="?android:colorPrimary"
+ android:orientation="vertical">
+
+ <include layout="@layout/section_header" />
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_behavior="@string/scalable_container_behavior">
+
+ <com.android.wallpaper.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" />
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/scalable_content_container"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/content_container_maximum_height"
+ app:behavior_peekHeight="@dimen/content_container_minimum_height"
+ app:layout_behavior="@string/bottom_sheet_behavior">
+
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/content_section"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <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_toTopOf="parent"
+ 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_gravity="end"
+ android:layout_marginVertical="10dp"
+ android:layout_marginEnd="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>
+ </FrameLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <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_gravity="center_horizontal|top"
+ android:layout_marginTop="200dp"
+ 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/TitleTextAppearance"
+ 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>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/res/layout/fragment_theme_picker.xml b/res/layout/fragment_theme_picker.xml
index 8272bde..1de5a3c 100644
--- a/res/layout/fragment_theme_picker.xml
+++ b/res/layout/fragment_theme_picker.xml
@@ -32,7 +32,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <com.android.customization.widget.PreviewPager
+ <com.android.wallpaper.widget.PreviewPager
android:id="@+id/theme_preview_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -105,7 +105,7 @@
android:visibility="gone">
<TextView
android:id="@+id/error_message"
- style="@style/HeaderTextAppearance"
+ style="@style/TitleTextAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
diff --git a/res/layout/fragment_theme_scalable_picker.xml b/res/layout/fragment_theme_scalable_picker.xml
new file mode 100644
index 0000000..e03df3e
--- /dev/null
+++ b/res/layout/fragment_theme_scalable_picker.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+ 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:background="?android:colorPrimary"
+ android:orientation="vertical">
+
+ <include layout="@layout/section_header" />
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_behavior="@string/scalable_container_behavior">
+
+ <com.android.wallpaper.widget.PreviewPager
+ android:id="@+id/theme_preview_pager"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/preview_pager_background" />
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/scalable_content_container"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/content_container_maximum_height"
+ app:behavior_peekHeight="@dimen/content_container_minimum_height"
+ app:layout_behavior="@string/bottom_sheet_behavior">
+
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/content_section"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <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_toTopOf="parent"
+ app:layout_constraintVertical_bias="1.0" />
+
+ <CheckBox
+ android:id="@+id/use_my_wallpaper"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/min_taptarget_height"
+ android:layout_marginStart="10dp"
+ android:ellipsize="end"
+ android:gravity="start|center_vertical"
+ android:paddingLeft="4dp"
+ 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_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>
+ </FrameLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <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_gravity="center_horizontal|top"
+ android:layout_marginTop="200dp"
+ 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/TitleTextAppearance"
+ 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>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/res/layout/grid_preview_card.xml b/res/layout/grid_preview_card.xml
index ae66b83..90b5578 100644
--- a/res/layout/grid_preview_card.xml
+++ b/res/layout/grid_preview_card.xml
@@ -24,6 +24,12 @@
android:id="@+id/grid_preview_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/primary_color"/>
+ android:background="@color/primary_color" />
+
+ <SurfaceView
+ android:id="@+id/grid_preview_surface"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/primary_color" />
</androidx.cardview.widget.CardView>
\ No newline at end of file
diff --git a/res/layout/preview_pager.xml b/res/layout/preview_pager.xml
deleted file mode 100644
index 43f8fb6..0000000
--- a/res/layout/preview_pager.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Copyright (C) 2018 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.
--->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <androidx.viewpager.widget.ViewPager
- android:id="@+id/preview_viewpager"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"/>
-
- <FrameLayout
- android:id="@+id/indicator_container"
- android:layout_width="match_parent"
- android:layout_height="@dimen/indicator_container_height"
- android:layout_gravity="bottom">
-
- <com.android.customization.widget.PageIndicator
- android:id="@+id/page_indicator"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center" />
-
- <FrameLayout
- android:id="@+id/arrow_previous"
- android:layout_width="@dimen/indicator_arrow_touch_area_size"
- android:layout_height="@dimen/indicator_arrow_touch_area_size"
- android:layout_gravity="center_vertical|left"
- android:layout_marginStart="@dimen/indicator_arrow_container_margin_horizontal"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:contentDescription="@string/previous_page_content_description"
- android:visibility="gone"
- tools:ignore="RtlHardcoded">
-
- <ImageView
- android:layout_width="@dimen/indicator_arrow_size"
- android:layout_height="@dimen/indicator_arrow_size"
- android:layout_gravity="center"
- android:contentDescription="@null"
- android:tint="@color/indicator_arrow_color"
- android:src="@drawable/ic_arrow_back_24px" />
- </FrameLayout>
-
- <FrameLayout
- android:id="@+id/arrow_next"
- android:layout_width="@dimen/indicator_arrow_touch_area_size"
- android:layout_height="@dimen/indicator_arrow_touch_area_size"
- android:layout_gravity="center_vertical|right"
- android:layout_marginEnd="@dimen/indicator_arrow_container_margin_horizontal"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:contentDescription="@string/next_page_content_description"
- android:visibility="gone"
- tools:ignore="RtlHardcoded">
-
- <ImageView
- android:layout_width="@dimen/indicator_arrow_size"
- android:layout_height="@dimen/indicator_arrow_size"
- android:layout_gravity="center"
- android:contentDescription="@null"
- android:tint="@color/indicator_arrow_color"
- android:src="@drawable/ic_arrow_forward_24px" />
- </FrameLayout>
- </FrameLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/menu/bottom_navigation_menu.xml b/res/menu/bottom_navigation_menu.xml
index d477aaf..b64bf8d 100644
--- a/res/menu/bottom_navigation_menu.xml
+++ b/res/menu/bottom_navigation_menu.xml
@@ -17,19 +17,19 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- TODO (santie): replace icons with real ones when available -->
<item
+ android:id="@+id/nav_wallpaper"
+ android:title="@string/wallpaper_title"
+ android:icon="@drawable/ic_nav_wallpaper" />
+ <item
android:id="@+id/nav_theme"
android:title="@string/theme_title"
android:icon="@drawable/ic_nav_theme" />
<item
- android:id="@+id/nav_clock"
- android:title="@string/clock_title"
- android:icon="@drawable/ic_nav_clock" />
- <item
android:id="@+id/nav_grid"
android:title="@string/grid_title"
android:icon="@drawable/ic_nav_grid" />
<item
- android:id="@+id/nav_wallpaper"
- android:title="@string/wallpaper_title"
- android:icon="@drawable/ic_nav_wallpaper" />
+ android:id="@+id/nav_clock"
+ android:title="@string/clock_title"
+ android:icon="@drawable/ic_nav_clock" />
</menu>
\ No newline at end of file
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
deleted file mode 100644
index 756ad00..0000000
--- a/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 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 xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="6995669566699638946">"Styles & wallpapers"</string>
- <string name="theme_title" msgid="2144932106319405101">"Style"</string>
- <string name="clock_title" msgid="2126046720254613991">"Clock"</string>
- <string name="grid_title" msgid="2825094404523390773">"Grid"</string>
- <string name="wallpaper_title" msgid="6952635398953194544">"Wallpaper"</string>
- <string name="apply_theme_btn" msgid="6293081192321303991">"Apply"</string>
- <string name="edit_custom_theme_lbl" msgid="5211377705710775224">"Tap to edit"</string>
- <string name="keep_my_wallpaper" msgid="8012385376769568517">"Keep current wallpaper"</string>
- <string name="apply_btn" msgid="7965877231041987336">"Apply"</string>
- <string name="accessibility_preview_pager" msgid="3548503287402185430">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string>
- <string name="next_page_content_description" msgid="5290226604542300962">"Next"</string>
- <string name="previous_page_content_description" msgid="6025726405430262788">"Previous"</string>
- <string name="option_applied_description" msgid="5022305212078053534">"<xliff:g id="ID_1">%1$s</xliff:g>, currently applied"</string>
- <string name="option_applied_previewed_description" msgid="5269654286638446858">"<xliff:g id="ID_1">%1$s</xliff:g>, currently applied and previewed"</string>
- <string name="option_previewed_description" msgid="3467217598865047661">"<xliff:g id="ID_1">%1$s</xliff:g>, currently previewed"</string>
- <string name="theme_description" msgid="3697012391785254635">"Font: <xliff:g id="ID_1">%1$s</xliff:g>, icons: <xliff:g id="ID_2">%2$s</xliff:g>, shape: <xliff:g id="ID_3">%3$s</xliff:g>, colour: <xliff:g id="ID_4">%4$s</xliff:g>"</string>
- <string name="default_theme_title" msgid="2555741736622366797">"Default"</string>
- <string name="preview_name_font" msgid="4465423899630037038">"Font"</string>
- <string name="preview_name_icon" msgid="6818927315316316440">"Icon"</string>
- <string name="preview_name_color" msgid="8776203144994416172">"Colour"</string>
- <string name="preview_name_shape" msgid="5676971146080968721">"Shape"</string>
- <string name="preview_name_wallpaper" msgid="1738652462949531828">"Wallpaper"</string>
- <string name="font_card_title" msgid="2343292653502548685">"ABC • abc • 123"</string>
- <string name="font_card_body" msgid="6790525594503904468">"Add your favourite fonts to every screen"</string>
- <string name="grid_title_pattern" msgid="9188866567612607806">"<xliff:g id="ID_1">%1$d</xliff:g>x<xliff:g id="ID_2">%2$d</xliff:g>"</string>
- <string name="applied_theme_msg" msgid="7348498271552054431">"Style applied"</string>
- <string name="applied_clock_msg" msgid="1938218786265793285">"Clock applied"</string>
- <string name="apply_theme_error_msg" msgid="791364062636538317">"There was a problem applying the style"</string>
- <string name="custom_theme_next" msgid="6235420097213197301">"Next"</string>
- <string name="custom_theme_previous" msgid="4941132112640503022">"Previous"</string>
- <string name="custom_theme_title" msgid="2192300350332693631">"Custom <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="custom_theme_fragment_title" msgid="6615547284702040280">"Custom Style"</string>
- <string name="custom_theme_delete" msgid="4744494663184126202">"Delete"</string>
- <string name="font_component_title" msgid="8800340833695292049">"Choose font"</string>
- <string name="icon_component_title" msgid="5779787138399083903">"Choose icons"</string>
- <string name="color_component_title" msgid="1194089273921078816">"Choose colour"</string>
- <string name="shape_component_title" msgid="8366847436022025538">"Choose shape"</string>
- <string name="name_component_title" msgid="532425087968663437">"Name your style"</string>
- <string name="icon_component_label" msgid="2625784884001407944">"Icons <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="delete_custom_theme_confirmation" msgid="4452137183628769394">"Delete Custom style?"</string>
- <string name="delete_custom_theme_button" msgid="5102462988130208824">"Delete"</string>
- <string name="cancel" msgid="4651030493668562067">"Cancel"</string>
- <string name="set_theme_wallpaper_dialog_message" msgid="2179661027350908003">"Set style wallpaper"</string>
- <string name="use_style_instead_title" msgid="1578754995763917502">"Use <xliff:g id="ID_1">%1$s</xliff:g> instead?"</string>
- <string name="use_style_instead_body" msgid="3051937045807471496">"The components you chose match the <xliff:g id="ID_1">%1$s</xliff:g> style. Do you want to use <xliff:g id="ID_2">%1$s</xliff:g> instead?"</string>
- <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-rXC/strings.xml b/res/values-en-rXC/strings.xml
deleted file mode 100644
index c92902f..0000000
--- a/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 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 xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="6995669566699638946">"Styles & wallpapers"</string>
- <string name="theme_title" msgid="2144932106319405101">"Style"</string>
- <string name="clock_title" msgid="2126046720254613991">"Clock"</string>
- <string name="grid_title" msgid="2825094404523390773">"Grid"</string>
- <string name="wallpaper_title" msgid="6952635398953194544">"Wallpaper"</string>
- <string name="apply_theme_btn" msgid="6293081192321303991">"Apply"</string>
- <string name="edit_custom_theme_lbl" msgid="5211377705710775224">"Tap to edit"</string>
- <string name="keep_my_wallpaper" msgid="8012385376769568517">"Keep current wallpaper"</string>
- <string name="apply_btn" msgid="7965877231041987336">"Apply"</string>
- <string name="accessibility_preview_pager" msgid="3548503287402185430">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string>
- <string name="next_page_content_description" msgid="5290226604542300962">"Next"</string>
- <string name="previous_page_content_description" msgid="6025726405430262788">"Previous"</string>
- <string name="option_applied_description" msgid="5022305212078053534">"<xliff:g id="ID_1">%1$s</xliff:g>, currently applied"</string>
- <string name="option_applied_previewed_description" msgid="5269654286638446858">"<xliff:g id="ID_1">%1$s</xliff:g>, currently applied and previewed"</string>
- <string name="option_previewed_description" msgid="3467217598865047661">"<xliff:g id="ID_1">%1$s</xliff:g>, currently previewed"</string>
- <string name="theme_description" msgid="3697012391785254635">"Font: <xliff:g id="ID_1">%1$s</xliff:g>, icons: <xliff:g id="ID_2">%2$s</xliff:g>, shape: <xliff:g id="ID_3">%3$s</xliff:g>, color: <xliff:g id="ID_4">%4$s</xliff:g>"</string>
- <string name="default_theme_title" msgid="2555741736622366797">"Default"</string>
- <string name="preview_name_font" msgid="4465423899630037038">"Font"</string>
- <string name="preview_name_icon" msgid="6818927315316316440">"Icon"</string>
- <string name="preview_name_color" msgid="8776203144994416172">"Color"</string>
- <string name="preview_name_shape" msgid="5676971146080968721">"Shape"</string>
- <string name="preview_name_wallpaper" msgid="1738652462949531828">"Wallpaper"</string>
- <string name="font_card_title" msgid="2343292653502548685">"ABC • abc • 123"</string>
- <string name="font_card_body" msgid="6790525594503904468">"Add your favorite fonts to every screen"</string>
- <string name="grid_title_pattern" msgid="9188866567612607806">"<xliff:g id="ID_1">%1$d</xliff:g>x<xliff:g id="ID_2">%2$d</xliff:g>"</string>
- <string name="applied_theme_msg" msgid="7348498271552054431">"Style applied"</string>
- <string name="applied_clock_msg" msgid="1938218786265793285">"Clock applied"</string>
- <string name="apply_theme_error_msg" msgid="791364062636538317">"There was a problem applying the style"</string>
- <string name="custom_theme_next" msgid="6235420097213197301">"Next"</string>
- <string name="custom_theme_previous" msgid="4941132112640503022">"Previous"</string>
- <string name="custom_theme_title" msgid="2192300350332693631">"Custom <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="custom_theme_fragment_title" msgid="6615547284702040280">"Custom Style"</string>
- <string name="custom_theme_delete" msgid="4744494663184126202">"Delete"</string>
- <string name="font_component_title" msgid="8800340833695292049">"Choose font"</string>
- <string name="icon_component_title" msgid="5779787138399083903">"Choose icons"</string>
- <string name="color_component_title" msgid="1194089273921078816">"Choose color"</string>
- <string name="shape_component_title" msgid="8366847436022025538">"Choose shape"</string>
- <string name="name_component_title" msgid="532425087968663437">"Name your style"</string>
- <string name="icon_component_label" msgid="2625784884001407944">"Icons <xliff:g id="ID_1">%1$d</xliff:g>"</string>
- <string name="delete_custom_theme_confirmation" msgid="4452137183628769394">"Delete Custom style?"</string>
- <string name="delete_custom_theme_button" msgid="5102462988130208824">"Delete"</string>
- <string name="cancel" msgid="4651030493668562067">"Cancel"</string>
- <string name="set_theme_wallpaper_dialog_message" msgid="2179661027350908003">"Set style wallpaper"</string>
- <string name="use_style_instead_title" msgid="1578754995763917502">"Use <xliff:g id="ID_1">%1$s</xliff:g> instead?"</string>
- <string name="use_style_instead_body" msgid="3051937045807471496">"The components you chose match the <xliff:g id="ID_1">%1$s</xliff:g> style. Do you want to use <xliff:g id="ID_2">%1$s</xliff:g> instead?"</string>
- <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-fi/strings.xml b/res/values-fi/strings.xml
index afba860..696b5d3 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -65,5 +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! Jotain meni pieleen.."</string>
+ <string name="something_went_wrong" msgid="529840112449799117">"Hups! Jokin meni vikaan."</string>
</resources>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 985987f..bd37bae 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -20,10 +20,7 @@
<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_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">8dp</dimen>
<dimen name="preview_theme_content_max_height">140dp</dimen>
<dimen name="preview_theme_content_min_height">100dp</dimen>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index b567d0d..c6b2a3f 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -40,9 +40,5 @@
<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/attrs.xml b/res/values/attrs.xml
deleted file mode 100644
index ce995cc..0000000
--- a/res/values/attrs.xml
+++ /dev/null
@@ -1,29 +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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- PreviewPager specific attributes. -->
- <declare-styleable name="PreviewPager">
- <attr name="card_style" format="integer">
- <!-- The cards are sized so that a small part of the next card in the pager can be seen
- peeking from the side. -->
- <enum name="peeking" value="0" />
- <!-- Cards are sized to match the screen's aspect ratio (based on available height) -->
- <enum name="screen_aspect_ratio" value="1" />
- </attr>
- </declare-styleable>
-</resources>
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 3d646f9..437e4ea 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -19,8 +19,6 @@
<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>
@@ -30,14 +28,10 @@
<color name="shape_thumbnail_color">#b2b2b2</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>
<color name="theme_preview_icon_color">@color/google_grey700</color>
- <color name="preview_pager_arrow_disabled">@android:color/darker_gray</color>
-
<color name="text_color_dark">#2d2d2d</color>
<color name="text_color_light">@color/material_white_text</color>
@@ -61,9 +55,5 @@
<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 f7d435c..49daee4 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -16,7 +16,6 @@
limitations under the License.
-->
<resources>
- <dimen name="bottom_navbar_height">56dp</dimen>
<dimen name="bottom_navbar_font_text_size">12sp</dimen>
<dimen name="tip_dot_size">8dp</dimen>
@@ -25,17 +24,6 @@
<dimen name="check_size">20dp</dimen>
<dimen name="check_offset">-4dp</dimen>
- <dimen name="preview_indicator_width">16dp</dimen>
- <dimen name="preview_indicator_height">8dp</dimen>
- <dimen name="indicator_container_height">48dp</dimen>
- <dimen name="indicator_arrow_size">24dp</dimen>
- <dimen name="indicator_arrow_touch_area_size">48dp</dimen>
-
- <dimen name="indicator_arrow_container_margin_horizontal">4dp</dimen>
- <dimen name="preview_page_gap">16dp</dimen>
- <dimen name="preview_page_horizontal_margin">56dp</dimen>
- <dimen name="preview_page_top_margin">16dp</dimen>
- <dimen name="preview_page_bottom_margin">2dp</dimen>
<dimen name="component_preview_page_bottom_margin">16dp</dimen>
<!-- Dimensions for the customization option tiles -->
@@ -57,20 +45,16 @@
<!-- Note, using dp instead of sp as this text is more like a "snapshot" of the font -->
<dimen name="theme_option_font_text_size">16dp</dimen>
<dimen name="theme_option_font_min_text_size">15dp</dimen>
- <dimen name="theme_option_title_font_text_size">12sp</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_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>
@@ -100,8 +84,6 @@
<dimen name="component_color_chip_container_size">33dp</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. -->
diff --git a/res/values/override.xml b/res/values/override.xml
index a01507e..a070dbe 100644
--- a/res/values/override.xml
+++ b/res/values/override.xml
@@ -17,14 +17,10 @@
-->
<resources>
<string name="themes_stub_package" translatable="false"/>
+ <string name="clocks_stub_package" translatable="false"/>
<!-- Authority of a provider in System UI that will provide preview info for available clockfaces. -->
<string name="clocks_provider_authority" translatable="false">com.android.keyguard.clock</string>
- <!--Name of metadata in the main launcher Activity which values contains the authority
- corresponding to a ContentProvider in launcher to provide available grids and
- allow for changing them -->
- <string name="grid_control_metadata_name" translatable="false">com.android.launcher3.grid.control</string>
-
<string name="launcher_overlayable_package" translatable="false">com.android.launcher3</string>
<!-- List of packages whose icons are used to preview the icon shape for a theme. These are
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f571b6b..c940efd 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -50,13 +50,6 @@
[CHAR LIMIT=20] -->
<string name="apply_btn">Apply</string>
- <!-- Accessibility label for paging indicator in theme picker preview [CHAR LIMIT=NONE] -->
- <string name="accessibility_preview_pager">Page <xliff:g name="current_page" example="1">%1$d</xliff:g> of <xliff:g name="num_pages" example="2">%2$d</xliff:g></string>
- <!-- Content description of the next button to bring user to the next preview page.[CHAR LIMIT=NONE] -->
- <string name="next_page_content_description">Next</string>
- <!-- Content description of the previous button to bring user to the previous preview page. [CHAR LIMIT=NONE] -->
- <string name="previous_page_content_description">Previous</string>
-
<!-- Content description indicating that the selected option is currently applied to the device. [CHAR_LIMIT=NONE] -->
<string name="option_applied_description"><xliff:g name="style_name">%1$s</xliff:g>, currently applied</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 1289a87..0b61fe4 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -38,6 +38,10 @@
<item name="android:windowNoTitle">true</item>
<item name="android:fitsSystemWindows">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
+
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowDisablePreview">true</item>
</style>
<!-- Bottom nav -->
@@ -50,7 +54,7 @@
<item name="android:background">?android:colorPrimary</item>
</style>
- <style name="BottomNavTextAppearance" parent="HeaderTextAppearance">
+ <style name="BottomNavTextAppearance" parent="TitleTextAppearance">
<item name="android:textSize">@dimen/bottom_navbar_font_text_size</item>
</style>
@@ -59,34 +63,13 @@
</style>
<!-- Common components and widgets -->
- <style name="HeaderTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"/>
+ <style name="TitleTextAppearance" 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>
- <item name="contentPadding">@dimen/preview_card_padding</item>
- <item name="cardBackgroundColor">?android:colorPrimary</item>
- </style>
-
- <style name="FullContentPreviewCard" parent="PreviewCard">
- <item name="android:clipChildren">true</item>
- <item name="contentPadding">0dp</item>
- <item name="cardBackgroundColor">?android:colorPrimary</item>
- </style>
-
- <style name="CardTitleTextAppearance" parent="HeaderTextAppearance">
+ <style name="CardTitleTextAppearance" parent="TitleTextAppearance">
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/card_title_text_size</item>
</style>
@@ -96,7 +79,7 @@
<item name="android:textColor">@color/cover_title_color</item>
</style>
- <style name="FontCardTitleStyle" parent="HeaderTextAppearance">
+ <style name="FontCardTitleStyle" parent="TitleTextAppearance">
<item name="android:textAlignment">center</item>
</style>
diff --git a/robolectric_tests/Android.mk b/robolectric_tests/Android.mk
index 3037a47..b879418 100644
--- a/robolectric_tests/Android.mk
+++ b/robolectric_tests/Android.mk
@@ -48,7 +48,7 @@
LOCAL_TEST_PACKAGE := ThemePicker
-LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src \
+LOCAL_INSTRUMENT_SOURCE_DIRS := packages/apps/ThemePicker/src \
LOCAL_ROBOTEST_TIMEOUT := 36000
diff --git a/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java b/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java
index d2ab43f..f431006 100644
--- a/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java
+++ b/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java
@@ -19,14 +19,18 @@
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.provider.Settings.Secure;
+
import androidx.annotation.Nullable;
import com.android.customization.model.CustomizationManager.Callback;
-
import com.android.customization.module.ThemesUserEventLogger;
+
+import org.json.JSONException;
+import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -39,11 +43,15 @@
public class ClockManagerTest {
private static final String CLOCK_ID = "id";
+ private static final String CLOCK_FIELD = "clock";
+ private static final String CLOCK_FACE_SETTING = "fake_clock_face_setting";
@Mock ClockProvider mProvider;
@Mock ThemesUserEventLogger mLogger;
private ContentResolver mContentResolver;
private ClockManager mManager;
+ @Mock private Clockface mMockClockface;
+ @Mock private Callback mMockCallback;
@Before
public void setUp() {
@@ -53,7 +61,7 @@
}
@Test
- public void testApply() {
+ public void testApply() throws JSONException {
Clockface clock = new Clockface.Builder().setId(CLOCK_ID).build();
mManager.apply(clock, new Callback() {
@@ -69,16 +77,56 @@
});
// THEN the clock id is written to secure settings.
- assertEquals(CLOCK_ID, Secure.getString(mContentResolver, ClockManager.CLOCK_FACE_SETTING));
+ JSONObject json =
+ new JSONObject(Secure.getString(mContentResolver, ClockManager.CLOCK_FACE_SETTING));
+ assertEquals(CLOCK_ID, json.getString(CLOCK_FIELD));
// AND the event is logged
verify(mLogger).logClockApplied(clock);
}
@Test
- public void testGetCurrentClock() {
- // GIVEN that secure settings contains a clock id
- Secure.putString(mContentResolver, ClockManager.CLOCK_FACE_SETTING, CLOCK_ID);
- // THEN the current clock is that id
+ public void testApply_whenJSONExceptionOccurs_callsOnError() {
+ when(mMockClockface.getId()).thenThrow(JSONException.class);
+
+ mManager.apply(mMockClockface, mMockCallback);
+
+ verify(mMockCallback).onError(null);
+ }
+
+ @Test
+ public void testGetCurrentClock_returnsClockId() throws JSONException {
+ // Secure settings contains a clock id
+ JSONObject json = new JSONObject().put(CLOCK_FIELD, CLOCK_ID);
+ Secure.putString(mContentResolver, ClockManager.CLOCK_FACE_SETTING, json.toString());
+
+ // The current clock is that id
assertEquals(CLOCK_ID, mManager.getCurrentClock());
}
+
+ @Test
+ public void testGetCurrentClock_whenJSONExceptionOccurs_returnsClockFaceSetting() {
+ // Secure settings contains a clock face setting with invalid format to cause JSONException.
+ Secure.putString(mContentResolver, ClockManager.CLOCK_FACE_SETTING, CLOCK_FACE_SETTING);
+
+ // The current clock is the clock face setting which is saved in secure settings.
+ assertEquals(CLOCK_FACE_SETTING, mManager.getCurrentClock());
+ }
+
+ @Test
+ public void testGetCurrentClock_withNullIdInSecureSettings_returnsNullId() {
+ // Secure settings contains a null clock id
+ Secure.putString(mContentResolver, ClockManager.CLOCK_FACE_SETTING, /* value= */ null);
+
+ // The current clock is null
+ assertEquals(null, mManager.getCurrentClock());
+ }
+
+ @Test
+ public void testGetCurrentClock_withEmptyIdInSecureSettings_returnsEmptyId() {
+ // Secure settings contains an empty clock id
+ Secure.putString(mContentResolver, ClockManager.CLOCK_FACE_SETTING, /* value= */ "");
+
+ // The current clock is empty
+ assertEquals("", mManager.getCurrentClock());
+ }
}
diff --git a/robolectric_tests/src/com/android/customization/model/theme/ThemeManagerTest.java b/robolectric_tests/src/com/android/customization/model/theme/ThemeManagerTest.java
index 0a17b5b..6f1f95e 100644
--- a/robolectric_tests/src/com/android/customization/model/theme/ThemeManagerTest.java
+++ b/robolectric_tests/src/com/android/customization/model/theme/ThemeManagerTest.java
@@ -26,25 +26,28 @@
import static com.android.customization.model.ResourceConstants.SYSUI_PACKAGE;
import static com.android.customization.model.ResourceConstants.THEME_SETTING;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertTrue;
-import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.provider.Settings;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
import com.android.customization.model.CustomizationManager.Callback;
+import com.android.customization.model.theme.custom.CustomTheme;
import com.android.customization.module.ThemesUserEventLogger;
import com.android.customization.testutils.OverlayManagerMocks;
-import com.android.customization.testutils.Wait;
import com.android.wallpaper.module.WallpaperSetter;
+import org.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -60,6 +63,7 @@
@Mock OverlayManagerCompat mMockOm;
@Mock WallpaperSetter mMockWallpaperSetter;
@Mock ThemesUserEventLogger mThemesUserEventLogger;
+ @Mock ThemeBundleProvider mThemeBundleProvider;
private OverlayManagerMocks mMockOmHelper;
private ThemeManager mThemeManager;
private FragmentActivity mActivity;
@@ -71,9 +75,8 @@
mActivity = spy(activity);
mMockOmHelper = new OverlayManagerMocks();
mMockOmHelper.setUpMock(mMockOm);
- ThemeBundleProvider provider = mock(ThemeBundleProvider.class);
- mThemeManager = new ThemeManager(
- provider, activity, mMockWallpaperSetter, mMockOm, mThemesUserEventLogger);
+ mThemeManager = new ThemeManager(mThemeBundleProvider, activity, mMockWallpaperSetter,
+ mMockOm, mThemesUserEventLogger);
}
@After
@@ -82,7 +85,7 @@
}
@Test
- public void testApply_DefaultTheme() {
+ public void apply_WithDefaultTheme_StoresEmptyJsonString() {
mMockOmHelper.addOverlay("test.package.name_color", ANDROID_PACKAGE,
OVERLAY_CATEGORY_COLOR, true, 0);
mMockOmHelper.addOverlay("test.package.name_font", ANDROID_PACKAGE,
@@ -102,13 +105,94 @@
applyTheme(defaultTheme);
- assertEquals("Secure Setting should be emtpy after applying default theme",
- "",
+ assertEquals("Secure Setting should be empty JSON string after applying default theme",
+ new JSONObject().toString(),
Settings.Secure.getString(mActivity.getContentResolver(), THEME_SETTING));
}
@Test
- public void testApply_NonDefault() {
+ public void apply_WithOverlayTheme_StoresSerializedPackagesWithTimestamp() {
+ ThemeBundle theme = getOverlayTheme();
+ final String serializedPackagesWithTimestamp = theme.getSerializedPackagesWithTimestamp();
+
+ theme = spy(theme);
+ // Makes it return the fixed serializedPackagesWithTimestamp to test. Since we will get
+ // fresh time every time, it's hard to compare for testing.
+ when(theme.getSerializedPackagesWithTimestamp())
+ .thenReturn(serializedPackagesWithTimestamp);
+
+ applyTheme(theme);
+
+ assertEquals("Secure Setting should be the overlay packages after applying theme",
+ serializedPackagesWithTimestamp,
+ Settings.Secure.getString(mActivity.getContentResolver(), THEME_SETTING));
+ }
+
+ @Test
+ public void isAvailable_ThemeBundleProviderAndOverlayManagerAreAvailable_ReturnsTrue() {
+ when(mThemeBundleProvider.isAvailable()).thenReturn(true);
+ when(mMockOm.isAvailable()).thenReturn(true);
+
+ assertTrue(mThemeManager.isAvailable());
+ }
+
+ @Test
+ public void isAvailable_ThemeBundleProviderOrOverlayManagerIsAvailable_ReturnsFalse() {
+ when(mThemeBundleProvider.isAvailable()).thenReturn(false);
+ when(mMockOm.isAvailable()).thenReturn(true);
+ assertFalse(mThemeManager.isAvailable());
+
+ when(mThemeBundleProvider.isAvailable()).thenReturn(true);
+ when(mMockOm.isAvailable()).thenReturn(false);
+ assertFalse(mThemeManager.isAvailable());
+ }
+
+ @Test
+ public void fetchOptions_ThemeBundleProviderFetches() {
+ OptionsFetchedListener listener = mock(OptionsFetchedListener.class);
+
+ mThemeManager.fetchOptions(listener, false);
+
+ verify(mThemeBundleProvider).fetch(listener, false);
+ }
+
+ @Test
+ public void removeCustomTheme_ThemeBundleProviderRemovesCustomTheme() {
+ CustomTheme customTheme = mock(CustomTheme.class);
+ mThemeManager.removeCustomTheme(customTheme);
+
+ verify(mThemeBundleProvider).removeCustomTheme(customTheme);
+ }
+
+ @Test
+ public void findThemeByPackages_ThemeBundleProviderFindsEquivalent() {
+ CustomTheme theme = mock(CustomTheme.class);
+ mThemeManager.findThemeByPackages(theme);
+
+ verify(mThemeBundleProvider).findEquivalent(theme);
+ }
+
+ @Test
+ public void storeEmptyTheme_SettingsSecureStoresEmptyTheme() {
+ mThemeManager.storeEmptyTheme();
+
+ assertEquals(
+ new JSONObject().toString(),
+ Settings.Secure.getString(mActivity.getContentResolver(), THEME_SETTING));
+ }
+
+ @Test
+ public void getStoredOverlays_GetsFromSettingsSecureWithExpectedName() {
+ ThemeBundle theme = getOverlayTheme();
+
+ applyTheme(theme);
+
+ assertEquals(
+ Settings.Secure.getString(mActivity.getContentResolver(), THEME_SETTING),
+ mThemeManager.getStoredOverlays());
+ }
+
+ private ThemeBundle getOverlayTheme() {
final String bundleColorPackage = "test.package.name_color";
final String bundleFontPackage = "test.package.name_font";
final String otherPackage = "other.package.name_font";
@@ -120,16 +204,10 @@
mMockOmHelper.addOverlay(otherPackage, ANDROID_PACKAGE,
OVERLAY_CATEGORY_FONT, false, 0);
- ThemeBundle theme = new ThemeBundle.Builder()
+ return new ThemeBundle.Builder()
.addOverlayPackage(OVERLAY_CATEGORY_COLOR, bundleColorPackage)
.addOverlayPackage(OVERLAY_CATEGORY_FONT, bundleFontPackage)
.build(mActivity);
-
- applyTheme(theme);
-
- assertEquals("Secure Setting was not properly set after applying theme",
- theme.getSerializedPackages(),
- Settings.Secure.getString(mActivity.getContentResolver(), THEME_SETTING));
}
private void applyTheme(ThemeBundle theme) {
diff --git a/src/com/android/customization/model/clock/ContentProviderClockProvider.java b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
index ad60ddc..8f4c031 100644
--- a/src/com/android/customization/model/clock/ContentProviderClockProvider.java
+++ b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
@@ -2,7 +2,9 @@
import android.content.ContentResolver;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
import android.net.Uri;
@@ -25,6 +27,7 @@
private final Context mContext;
private final ProviderInfo mProviderInfo;
private List<Clockface> mClocks;
+ private boolean mClockContentAvailable;
public ContentProviderClockProvider(Context context) {
mContext = context;
@@ -33,11 +36,25 @@
mProviderInfo = TextUtils.isEmpty(providerAuthority) ? null
: mContext.getPackageManager().resolveContentProvider(providerAuthority,
PackageManager.MATCH_SYSTEM_ONLY);
+
+ if (TextUtils.isEmpty(mContext.getString(R.string.clocks_stub_package))) {
+ mClockContentAvailable = false;
+ } else {
+ try {
+ ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(
+ mContext.getString(R.string.clocks_stub_package),
+ PackageManager.MATCH_SYSTEM_ONLY);
+ mClockContentAvailable = applicationInfo != null;
+ } catch (NameNotFoundException e) {
+ mClockContentAvailable = false;
+ }
+ }
}
@Override
public boolean isAvailable() {
- return mProviderInfo != null && (mClocks == null || !mClocks.isEmpty());
+ return mProviderInfo != null && mClockContentAvailable
+ && (mClocks == null || !mClocks.isEmpty());
}
@Override
diff --git a/src/com/android/customization/model/grid/GridOptionsManager.java b/src/com/android/customization/model/grid/GridOptionsManager.java
index 1599dde..a334f5e 100644
--- a/src/com/android/customization/model/grid/GridOptionsManager.java
+++ b/src/com/android/customization/model/grid/GridOptionsManager.java
@@ -16,6 +16,8 @@
package com.android.customization.model.grid;
import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -23,7 +25,6 @@
import com.android.customization.model.CustomizationManager;
import com.android.customization.module.ThemesUserEventLogger;
-import java.util.Collections;
import java.util.List;
/**
@@ -60,7 +61,17 @@
new FetchTask(mProvider, callback).execute();
}
- private static class FetchTask extends AsyncTask<Void, Void, List<GridOption>> {
+ /** See if using surface view to render grid options */
+ public boolean usesSurfaceView() {
+ return mProvider.usesSurfaceView();
+ }
+
+ /** Call through content provider API to render preview */
+ public void renderPreview(Bundle bundle, String gridName) {
+ mProvider.renderPreview(gridName, bundle);
+ }
+
+ private static class FetchTask extends AsyncTask<Void, Void, Pair<List<GridOption>, String>> {
private final LauncherGridOptionsProvider mProvider;
@Nullable private final OptionsFetchedListener<GridOption> mCallback;
@@ -71,15 +82,16 @@
}
@Override
- protected List<GridOption> doInBackground(Void[] params) {
+ protected Pair<List<GridOption>, String> doInBackground(Void[] params) {
return mProvider.fetch(false);
}
@Override
- protected void onPostExecute(List<GridOption> gridOptions) {
+ protected void onPostExecute(Pair<List<GridOption>, String> gridOptionsResult) {
if (mCallback != null) {
- if (gridOptions != null && !gridOptions.isEmpty()) {
- mCallback.onOptionsLoaded(gridOptions);
+ if (gridOptionsResult != null && gridOptionsResult.first != null
+ && !gridOptionsResult.first.isEmpty()) {
+ mCallback.onOptionsLoaded(gridOptionsResult.first);
} else {
mCallback.onError(null);
}
diff --git a/src/com/android/customization/model/grid/LauncherGridOptionsProvider.java b/src/com/android/customization/model/grid/LauncherGridOptionsProvider.java
index 7c7f8d4..7d1d5cd 100644
--- a/src/com/android/customization/model/grid/LauncherGridOptionsProvider.java
+++ b/src/com/android/customization/model/grid/LauncherGridOptionsProvider.java
@@ -18,20 +18,20 @@
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.database.Cursor;
-import android.net.Uri;
+import android.os.Bundle;
import android.text.TextUtils;
+import android.util.Pair;
+import android.view.SurfaceView;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.android.customization.model.ResourceConstants;
+import com.android.systemui.shared.system.SurfaceViewRequestUtils;
import com.android.wallpaper.R;
+import com.android.wallpaper.util.PreviewUtils;
import com.bumptech.glide.Glide;
@@ -53,29 +53,25 @@
private static final String COL_PREVIEW_COUNT = "preview_count";
private static final String COL_IS_DEFAULT = "is_default";
+ private static final String METADATA_KEY_PREVIEW_VERSION = "preview_version";
+
private final Context mContext;
- private final String mGridProviderAuthority;
- private final ProviderInfo mProviderInfo;
+ private final PreviewUtils mPreviewUtils;
private List<GridOption> mOptions;
+ private String mVersion;
public LauncherGridOptionsProvider(Context context, String authorityMetadataKey) {
+ mPreviewUtils = new PreviewUtils(context, authorityMetadataKey);
mContext = context;
- Intent homeIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME);
-
- ResolveInfo info = context.getPackageManager().resolveActivity(homeIntent,
- PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA);
- if (info != null && info.activityInfo != null && info.activityInfo.metaData != null) {
- mGridProviderAuthority = info.activityInfo.metaData.getString(authorityMetadataKey);
- } else {
- mGridProviderAuthority = null;
- }
- // TODO: check permissions if needed
- mProviderInfo = TextUtils.isEmpty(mGridProviderAuthority) ? null
- : mContext.getPackageManager().resolveContentProvider(mGridProviderAuthority, 0);
}
boolean areGridsAvailable() {
- return mProviderInfo != null;
+ return mPreviewUtils.supportsPreview();
+ }
+
+ boolean usesSurfaceView() {
+ // If no version code is returned, fall back to V1.
+ return TextUtils.equals(mVersion, "V2");
}
/**
@@ -84,22 +80,19 @@
*/
@WorkerThread
@Nullable
- List<GridOption> fetch(boolean reload) {
+ Pair<List<GridOption>, String> fetch(boolean reload) {
if (!areGridsAvailable()) {
return null;
}
if (mOptions != null && !reload) {
- return mOptions;
+ return Pair.create(mOptions, mVersion);
}
- Uri optionsUri = new Uri.Builder()
- .scheme(ContentResolver.SCHEME_CONTENT)
- .authority(mProviderInfo.authority)
- .appendPath(LIST_OPTIONS)
- .build();
ContentResolver resolver = mContext.getContentResolver();
String iconPath = mContext.getResources().getString(Resources.getSystem().getIdentifier(
ResourceConstants.CONFIG_ICON_MASK, "string", ResourceConstants.ANDROID_PACKAGE));
- try (Cursor c = resolver.query(optionsUri, null, null, null, null)) {
+ try (Cursor c = resolver.query(mPreviewUtils.getUri(LIST_OPTIONS), null, null, null,
+ null)) {
+ mVersion = c.getExtras().getString(METADATA_KEY_PREVIEW_VERSION);
mOptions = new ArrayList<>();
while(c.moveToNext()) {
String name = c.getString(c.getColumnIndex(COL_NAME));
@@ -107,31 +100,33 @@
int cols = c.getInt(c.getColumnIndex(COL_COLS));
int previewCount = c.getInt(c.getColumnIndex(COL_PREVIEW_COUNT));
boolean isSet = Boolean.valueOf(c.getString(c.getColumnIndex(COL_IS_DEFAULT)));
- Uri preview = new Uri.Builder()
- .scheme(ContentResolver.SCHEME_CONTENT)
- .authority(mProviderInfo.authority)
- .appendPath(PREVIEW)
- .appendPath(name)
- .build();
String title = mContext.getString(R.string.grid_title_pattern, cols, rows);
- mOptions.add(new GridOption(title, name, isSet, rows, cols, preview, previewCount,
- iconPath));
+ mOptions.add(new GridOption(title, name, isSet, rows, cols,
+ mPreviewUtils.getUri(PREVIEW), previewCount, iconPath));
}
Glide.get(mContext).clearDiskCache();
} catch (Exception e) {
mOptions = null;
+ mVersion = null;
}
- return mOptions;
+ return Pair.create(mOptions, mVersion);
+ }
+
+ /**
+ * Request rendering of home screen preview via Launcher to Wallpaper using SurfaceView
+ * @param name the grid option name
+ * @param bundle surface view request bundle generated from
+ * {@link SurfaceViewRequestUtils#createSurfaceBundle(SurfaceView)}.
+ */
+ void renderPreview(String name, Bundle bundle) {
+ bundle.putString("name", name);
+ mPreviewUtils.renderPreview(bundle);
}
int applyGrid(String name) {
- Uri updateDefaultUri = new Uri.Builder()
- .scheme(ContentResolver.SCHEME_CONTENT)
- .authority(mProviderInfo.authority)
- .appendPath(DEFAULT_GRID)
- .build();
ContentValues values = new ContentValues();
values.put("name", name);
- return mContext.getContentResolver().update(updateDefaultUri, values, null, null);
+ return mContext.getContentResolver().update(mPreviewUtils.getUri(DEFAULT_GRID), values,
+ null, null);
}
}
diff --git a/src/com/android/customization/model/theme/ThemeManager.java b/src/com/android/customization/model/theme/ThemeManager.java
index e4981b0..79b45fd 100644
--- a/src/com/android/customization/model/theme/ThemeManager.java
+++ b/src/com/android/customization/model/theme/ThemeManager.java
@@ -23,6 +23,7 @@
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;
@@ -37,6 +38,7 @@
import com.android.wallpaper.R;
import com.android.wallpaper.asset.Asset;
import com.android.wallpaper.model.LiveWallpaperInfo;
+import com.android.wallpaper.model.WallpaperInfo;
import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback;
import com.android.wallpaper.module.WallpaperSetter;
import com.android.wallpaper.util.WallpaperCropUtils;
@@ -106,7 +108,7 @@
private SetWallpaperCallback createSetWallpaperCallback(ThemeBundle theme, Callback callback) {
return new SetWallpaperCallback() {
@Override
- public void onSuccess() {
+ public void onSuccess(WallpaperInfo wallpaperInfo) {
applyWallpaperOptions(theme);
applyOverlays(theme, callback);
}
diff --git a/src/com/android/customization/module/StatsLogUserEventLogger.java b/src/com/android/customization/module/StatsLogUserEventLogger.java
index a13d420..5649c5e 100644
--- a/src/com/android/customization/module/StatsLogUserEventLogger.java
+++ b/src/com/android/customization/module/StatsLogUserEventLogger.java
@@ -18,6 +18,7 @@
import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR;
import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_FONT;
import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SHAPE;
+import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UI_CHANGED;
import android.stats.style.nano.StyleEnums;
@@ -26,6 +27,7 @@
import com.android.customization.model.clock.Clockface;
import com.android.customization.model.grid.GridOption;
import com.android.customization.model.theme.ThemeBundle;
+import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.wallpaper.module.NoOpUserEventLogger;
import java.util.Map;
@@ -39,41 +41,59 @@
public class StatsLogUserEventLogger extends NoOpUserEventLogger implements ThemesUserEventLogger {
private static final String TAG = "StatsLogUserEventLogger";
- private static final int CODE = 179;
@Override
public void logResumed(boolean provisioned, boolean wallpaper) {
- WallpaperStatsLog.write(CODE, StyleEnums.ONRESUME, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.ONRESUME, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
@Override
public void logStopped() {
- WallpaperStatsLog.write(CODE, StyleEnums.ONSTOP, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.ONSTOP, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
@Override
public void logActionClicked(String collectionId, int actionLabelResId) {
- WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_EXPLORE, 0, 0, 0, 0, 0,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_EXPLORE, 0, 0, 0, 0, 0,
collectionId.hashCode(), 0, 0, 0);
}
@Override
public void logIndividualWallpaperSelected(String collectionId) {
- WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_SELECT, 0, 0, 0, 0, 0, 0,
- collectionId.hashCode(), 0, 0);
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_SELECT, 0, 0, 0, 0, 0,
+ collectionId.hashCode(), 0, 0, 0);
}
@Override
public void logCategorySelected(String collectionId) {
- WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_OPEN_CATEGORY,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_OPEN_CATEGORY,
0, 0, 0, 0, 0,
collectionId.hashCode(),
0, 0, 0);
}
@Override
+ public void logLiveWallpaperInfoSelected(String collectionId, @Nullable String wallpaperId) {
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.LIVE_WALLPAPER_INFO_SELECT,
+ 0, 0, 0, 0, 0,
+ collectionId.hashCode(),
+ wallpaperId != null ? wallpaperId.hashCode() : 0,
+ 0, 0);
+ }
+
+ @Override
+ public void logLiveWallpaperCustomizeSelected(String collectionId,
+ @Nullable String wallpaperId) {
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.LIVE_WALLPAPER_CUSTOMIZE_SELECT,
+ 0, 0, 0, 0, 0,
+ collectionId.hashCode(),
+ wallpaperId != null ? wallpaperId.hashCode() : 0,
+ 0, 0);
+ }
+
+ @Override
public void logWallpaperSet(String collectionId, @Nullable String wallpaperId) {
- WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_APPLIED,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_APPLIED,
0, 0, 0, 0, 0,
collectionId.hashCode(),
wallpaperId != null ? wallpaperId.hashCode() : 0,
@@ -88,7 +108,7 @@
@Override
public void logThemeSelected(ThemeBundle theme, boolean isCustomTheme) {
- WallpaperStatsLog.write(CODE, StyleEnums.PICKER_SELECT,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_SELECT,
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
@@ -97,7 +117,7 @@
@Override
public void logThemeApplied(ThemeBundle theme, boolean isCustomTheme) {
- WallpaperStatsLog.write(CODE, StyleEnums.PICKER_APPLIED,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_APPLIED,
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
@@ -106,7 +126,7 @@
@Override
public void logClockSelected(Clockface clock) {
- WallpaperStatsLog.write(CODE, StyleEnums.PICKER_SELECT,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_SELECT,
0, 0, 0,
Objects.hashCode(clock.getId()),
0, 0, 0, 0, 0);
@@ -114,7 +134,7 @@
@Override
public void logClockApplied(Clockface clock) {
- WallpaperStatsLog.write(CODE, StyleEnums.PICKER_APPLIED,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_APPLIED,
0, 0, 0,
Objects.hashCode(clock.getId()),
0, 0, 0, 0, 0);
@@ -122,7 +142,7 @@
@Override
public void logGridSelected(GridOption grid) {
- WallpaperStatsLog.write(CODE, StyleEnums.PICKER_SELECT,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_SELECT,
0, 0, 0, 0,
grid.cols,
0, 0, 0, 0);
@@ -130,7 +150,7 @@
@Override
public void logGridApplied(GridOption grid) {
- WallpaperStatsLog.write(CODE, StyleEnums.PICKER_APPLIED,
+ SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_APPLIED,
0, 0, 0, 0,
grid.cols,
0, 0, 0, 0);
diff --git a/src/com/android/customization/module/WallpaperStatsLog.java b/src/com/android/customization/module/WallpaperStatsLog.java
deleted file mode 100644
index 9f5761f..0000000
--- a/src/com/android/customization/module/WallpaperStatsLog.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// This file is autogenerated
-
-package com.android.customization.module;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import android.util.StatsLog;
-import android.os.SystemClock;
-
-import java.util.ArrayList;
-
-
-/**
- * Utility class for logging statistics events.
- */
-public class WallpaperStatsLog {
- private static final int LOGGER_ENTRY_MAX_PAYLOAD = 4068;
- private static final int MAX_EVENT_PAYLOAD = LOGGER_ENTRY_MAX_PAYLOAD - 4;
- private static final byte INT_TYPE = 0;
- private static final byte LONG_TYPE = 1;
- private static final byte STRING_TYPE = 2;
- private static final byte LIST_TYPE = 3;
- private static final byte FLOAT_TYPE = 4;
- private static final int INT_TYPE_SIZE = 5;
- private static final int FLOAT_TYPE_SIZE = 5;
- private static final int LONG_TYPE_SIZE = 9;
- private static final int STRING_TYPE_OVERHEAD = 5;
- private static final int LIST_TYPE_OVERHEAD = 2;
- // Constants for atom codes.
-
- /**
- * StyleUIChanged style_ui_changed<br>
- * Usage: StatsLog.write(StatsLog.STYLE_UI_CHANGED, int action, int color_package_hash, int font_package_hash, int shape_package_hash, int clock_package_hash, int launcher_grid, int wallpaper_category_hash, int wallpaper_id_hash, int color_preference, int location_preference);<br>
- */
- public static final int STYLE_UI_CHANGED = 179;
-
- // Constants for enum values.
-
- // Values for StyleUIChanged.action
- public static final int STYLE_UICHANGED__ACTION__DEFAULT_ACTION = 0;
- public static final int STYLE_UICHANGED__ACTION__ONRESUME = 1;
- public static final int STYLE_UICHANGED__ACTION__ONSTOP = 2;
- public static final int STYLE_UICHANGED__ACTION__PICKER_SELECT = 3;
- public static final int STYLE_UICHANGED__ACTION__PICKER_APPLIED = 4;
- public static final int STYLE_UICHANGED__ACTION__WALLPAPER_OPEN_CATEGORY = 5;
- public static final int STYLE_UICHANGED__ACTION__WALLPAPER_SELECT = 6;
- public static final int STYLE_UICHANGED__ACTION__WALLPAPER_APPLIED = 7;
- public static final int STYLE_UICHANGED__ACTION__WALLPAPER_EXPLORE = 8;
- public static final int STYLE_UICHANGED__ACTION__WALLPAPER_DOWNLOAD = 9;
- public static final int STYLE_UICHANGED__ACTION__WALLPAPER_REMOVE = 10;
- public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DOWNLOAD_SUCCESS = 11;
- public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DOWNLOAD_FAILED = 12;
- public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DOWNLOAD_CANCELLED = 13;
- public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DELETE_SUCCESS = 14;
- public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DELETE_FAILED = 15;
- public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_APPLIED = 16;
-
- // Values for StyleUIChanged.location_preference
- public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_PREFERENCE_UNSPECIFIED = 0;
- public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_UNAVAILABLE = 1;
- public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_CURRENT = 2;
- public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_MANUAL = 3;
-
- // Write methods
- public static void write(int code, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10) {
- // Initial overhead of the list, timestamp, and atom tag.
- int needed = LIST_TYPE_OVERHEAD + LONG_TYPE_SIZE + INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- needed += INT_TYPE_SIZE;
- if (needed > MAX_EVENT_PAYLOAD) {
- return;
- }
- byte[] buff = new byte[needed];
- int pos = 0;
- buff[pos] = LIST_TYPE;
- buff[pos + 1] = 12;
- pos += LIST_TYPE_OVERHEAD;
- long elapsedRealtime = SystemClock.elapsedRealtimeNanos();
- buff[pos] = LONG_TYPE;
- copyLong(buff, pos + 1, elapsedRealtime);
- pos += LONG_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, code);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg1);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg2);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg3);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg4);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg5);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg6);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg7);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg8);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg9);
- pos += INT_TYPE_SIZE;
- buff[pos] = INT_TYPE;
- copyInt(buff, pos + 1, arg10);
- pos += INT_TYPE_SIZE;
- StatsLog.writeRaw(buff, pos);
- }
-
- // Helper methods for copying primitives
- private static void copyInt(byte[] buff, int pos, int val) {
- buff[pos] = (byte) (val);
- buff[pos + 1] = (byte) (val >> 8);
- buff[pos + 2] = (byte) (val >> 16);
- buff[pos + 3] = (byte) (val >> 24);
- return;
- }
-
- private static void copyLong(byte[] buff, int pos, long val) {
- buff[pos] = (byte) (val);
- buff[pos + 1] = (byte) (val >> 8);
- buff[pos + 2] = (byte) (val >> 16);
- buff[pos + 3] = (byte) (val >> 24);
- buff[pos + 4] = (byte) (val >> 32);
- buff[pos + 5] = (byte) (val >> 40);
- buff[pos + 6] = (byte) (val >> 48);
- buff[pos + 7] = (byte) (val >> 56);
- return;
- }
-
-}
diff --git a/src/com/android/customization/picker/BasePreviewAdapter.java b/src/com/android/customization/picker/BasePreviewAdapter.java
index 53f750a..dab923a 100644
--- a/src/com/android/customization/picker/BasePreviewAdapter.java
+++ b/src/com/android/customization/picker/BasePreviewAdapter.java
@@ -29,7 +29,7 @@
import androidx.viewpager.widget.PagerAdapter;
import com.android.customization.picker.BasePreviewAdapter.PreviewPage;
-import com.android.customization.widget.PreviewPager;
+import com.android.wallpaper.widget.PreviewPager;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/customization/picker/CustomizationPickerActivity.java b/src/com/android/customization/picker/CustomizationPickerActivity.java
index 80cd7d9..86a0bf6 100644
--- a/src/com/android/customization/picker/CustomizationPickerActivity.java
+++ b/src/com/android/customization/picker/CustomizationPickerActivity.java
@@ -29,6 +29,7 @@
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -86,9 +87,10 @@
CategoryFragmentHost, ThemeFragmentHost, GridFragmentHost, ClockFragmentHost {
private static final String TAG = "CustomizationPickerActivity";
- private static final String WALLPAPER_FLAVOR_EXTRA = "com.android.launcher3.WALLPAPER_FLAVOR";
- private static final String WALLPAPER_FOCUS = "focus_wallpaper";
- private static final String WALLPAPER_ONLY = "wallpaper_only";
+ @VisibleForTesting static final String WALLPAPER_FLAVOR_EXTRA =
+ "com.android.launcher3.WALLPAPER_FLAVOR";
+ @VisibleForTesting static final String WALLPAPER_FOCUS = "focus_wallpaper";
+ @VisibleForTesting static final String WALLPAPER_ONLY = "wallpaper_only";
private WallpaperPickerDelegate mDelegate;
private UserEventLogger mUserEventLogger;
@@ -128,10 +130,9 @@
// Navigate to the Wallpaper tab if we started directly from launcher, otherwise
// start at the Styles tab
- int section = WALLPAPER_FOCUS.equals(getIntent()
- .getStringExtra(WALLPAPER_FLAVOR_EXTRA))
- ? mBottomNav.getMenu().size() - 1 : 0;
- navigateToSection(mBottomNav.getMenu().getItem(section).getItemId());
+ navigateToSection(
+ WALLPAPER_FOCUS.equals(getIntent().getStringExtra(WALLPAPER_FLAVOR_EXTRA))
+ ? R.id.nav_wallpaper : R.id.nav_theme);
}
}
}
@@ -291,6 +292,9 @@
@Override
public void onBackPressed() {
+ if (mWallpaperCategoryFragment != null && mWallpaperCategoryFragment.popChildFragment()) {
+ return;
+ }
if (getSupportFragmentManager().popBackStackImmediate()) {
return;
}
@@ -301,6 +305,11 @@
}
private void navigateToSection(@IdRes int id) {
+ // Navigate to the first section if the targeted section doesn't exist.
+ if (!mSections.containsKey(id)) {
+ id = mBottomNav.getMenu().getItem(0).getItemId();
+ }
+
mBottomNav.setSelectedItemId(id);
}
@@ -330,14 +339,6 @@
mDelegate.showViewOnlyPreview(wallpaperInfo);
}
- /**
- * Shows the picker activity for the given category.
- */
- @Override
- public void show(String collectionId) {
- mDelegate.show(collectionId);
- }
-
@Override
public void onWallpapersReady() {
diff --git a/src/com/android/customization/picker/clock/ClockFragment.java b/src/com/android/customization/picker/clock/ClockFragment.java
index 14dbc16..48b4c0d 100644
--- a/src/com/android/customization/picker/clock/ClockFragment.java
+++ b/src/com/android/customization/picker/clock/ClockFragment.java
@@ -15,6 +15,8 @@
*/
package com.android.customization.picker.clock;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
@@ -38,11 +40,11 @@
import com.android.customization.picker.BasePreviewAdapter;
import com.android.customization.picker.BasePreviewAdapter.PreviewPage;
import com.android.customization.widget.OptionSelectorController;
-import com.android.customization.widget.PreviewPager;
import com.android.wallpaper.R;
import com.android.wallpaper.asset.Asset;
import com.android.wallpaper.module.InjectorProvider;
import com.android.wallpaper.picker.ToolbarFragment;
+import com.android.wallpaper.widget.PreviewPager;
import java.util.List;
@@ -88,8 +90,20 @@
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(
- R.layout.fragment_clock_picker, container, /* attachToRoot */ false);
+ View view;
+ if (ADD_SCALABLE_HEADER) {
+ // TODO(b/147780560): Once the temporary flag (ADD_SCALABLE_HEADER) is removed,
+ // we should have a layout with the same name for portrait and landscape.
+ int orientation = getResources().getConfiguration().orientation;
+ view = inflater.inflate(
+ orientation == ORIENTATION_LANDSCAPE
+ ? R.layout.fragment_clock_picker
+ : R.layout.fragment_clock_scalable_picker,
+ container, /* attachToRoot */ false);
+ } else {
+ 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);
diff --git a/src/com/android/customization/picker/grid/GridFragment.java b/src/com/android/customization/picker/grid/GridFragment.java
index 3c395a1..7a01f26 100644
--- a/src/com/android/customization/picker/grid/GridFragment.java
+++ b/src/com/android/customization/picker/grid/GridFragment.java
@@ -15,6 +15,8 @@
*/
package com.android.customization.picker.grid;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
@@ -24,6 +26,8 @@
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup;
@@ -43,7 +47,7 @@
import com.android.customization.picker.BasePreviewAdapter;
import com.android.customization.picker.BasePreviewAdapter.PreviewPage;
import com.android.customization.widget.OptionSelectorController;
-import com.android.customization.widget.PreviewPager;
+import com.android.systemui.shared.system.SurfaceViewRequestUtils;
import com.android.wallpaper.R;
import com.android.wallpaper.asset.Asset;
import com.android.wallpaper.asset.ContentUriAsset;
@@ -51,7 +55,9 @@
import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
import com.android.wallpaper.module.InjectorProvider;
import com.android.wallpaper.picker.ToolbarFragment;
+import com.android.wallpaper.widget.PreviewPager;
+import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import java.util.List;
@@ -106,8 +112,20 @@
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(
- R.layout.fragment_grid_picker, container, /* attachToRoot */ false);
+ View view;
+ if (ADD_SCALABLE_HEADER) {
+ // TODO(b/147780560): Once the temporary flag (ADD_SCALABLE_HEADER) is removed,
+ // we should have a layout with the same name for portrait and landscape.
+ int orientation = getResources().getConfiguration().orientation;
+ view = inflater.inflate(
+ orientation == ORIENTATION_LANDSCAPE
+ ? R.layout.fragment_grid_picker
+ : R.layout.fragment_grid_scalable_picker,
+ container, /* attachToRoot */ false);
+ } else {
+ 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);
@@ -117,6 +135,9 @@
final Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
mScreenAspectRatio = (float) dm.heightPixels / dm.widthPixels;
+
+ // Clear memory cache whenever grid fragment view is being loaded.
+ Glide.get(getContext()).clearMemory();
setUpOptions();
view.findViewById(R.id.apply_button).setOnClickListener(v -> {
mGridManager.apply(mSelectedOption, new Callback() {
@@ -228,13 +249,18 @@
private final int mRows;
private final Activity mActivity;
- private ImageView mPreview;
+ private final String mName;
- private GridPreviewPage(Activity activity, int id, Uri previewUri, int rows, int cols) {
+ private ImageView mPreview;
+ private SurfaceView mPreviewSurface;
+
+ private GridPreviewPage(Activity activity, int id, Uri previewUri, String name, int rows,
+ int cols) {
super(null);
mPageId = id;
mPreviewAsset = new ContentUriAsset(activity, previewUri,
RequestOptions.fitCenterTransform());
+ mName = name;
mRows = rows;
mCols = cols;
mActivity = activity;
@@ -242,23 +268,48 @@
@Override
public void setCard(CardView card) {
- super.setCard(card);
- mPreview = card.findViewById(R.id.grid_preview_image);
+ super.setCard(card);
+ mPreview = card.findViewById(R.id.grid_preview_image);
+ mPreviewSurface = card.findViewById(R.id.grid_preview_surface);
}
public void bindPreviewContent() {
Resources resources = card.getResources();
bindWallpaperIfAvailable();
- mPreviewAsset.loadDrawableWithTransition(mActivity,
- mPreview /* imageView */,
- PREVIEW_FADE_DURATION_MS /* duration */,
- null /* drawableLoadedListener */,
- resources.getColor(android.R.color.transparent, null) /* placeHolderColorJ */);
+ final boolean usesSurfaceViewForPreview = mGridManager.usesSurfaceView();
+ mPreview.setVisibility(usesSurfaceViewForPreview ? View.GONE : View.VISIBLE);
+ mPreviewSurface.setVisibility(usesSurfaceViewForPreview ? View.VISIBLE : View.GONE);
+ if (usesSurfaceViewForPreview) {
+ mPreviewSurface.setZOrderOnTop(true);
+ mPreviewSurface.getHolder().addCallback(new SurfaceHolder.Callback() {
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+ Bundle bundle = SurfaceViewRequestUtils.createSurfaceBundle(
+ mPreviewSurface);
+ mGridManager.renderPreview(bundle, mName);
+ }
+
+ @Override
+ public void surfaceChanged(SurfaceHolder holder, int format, int width,
+ int height) {}
+
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {}
+ });
+ } else {
+ mPreviewAsset.loadDrawableWithTransition(mActivity,
+ mPreview /* imageView */,
+ PREVIEW_FADE_DURATION_MS /* duration */,
+ null /* drawableLoadedListener */,
+ resources.getColor(android.R.color.transparent,
+ null) /* placeHolderColorJ */);
+ }
}
void bindWallpaperIfAvailable() {
if (card != null && mCardBackground != null) {
mPreview.setBackground(mCardBackground);
+ mPreviewSurface.setBackground(mCardBackground);
}
}
}
@@ -274,7 +325,7 @@
for (int i = 0; i < gridOption.previewPagesCount; i++) {
addPage(new GridPreviewPage(getActivity(), i,
gridOption.previewImageUri.buildUpon().appendPath("" + i).build(),
- gridOption.rows, gridOption.cols));
+ gridOption.name, gridOption.rows, gridOption.cols));
}
}
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index 641d3e1..b5c68e5 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -15,6 +15,8 @@
*/
package com.android.customization.picker.theme;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+
import android.app.Activity;
import android.app.WallpaperColors;
import android.content.Context;
@@ -58,7 +60,6 @@
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;
import com.android.wallpaper.asset.Asset;
import com.android.wallpaper.asset.Asset.CenterCropBitmapTask;
@@ -66,6 +67,7 @@
import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
import com.android.wallpaper.module.InjectorProvider;
import com.android.wallpaper.picker.ToolbarFragment;
+import com.android.wallpaper.widget.PreviewPager;
import java.util.List;
@@ -117,8 +119,20 @@
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(
- R.layout.fragment_theme_picker, container, /* attachToRoot */ false);
+ View view;
+ if (ADD_SCALABLE_HEADER) {
+ // TODO(b/147780560): Once the temporary flag (ADD_SCALABLE_HEADER) is removed,
+ // we should have a layout with the same name for portrait and landscape.
+ int orientation = getResources().getConfiguration().orientation;
+ view = inflater.inflate(
+ orientation == ORIENTATION_LANDSCAPE
+ ? R.layout.fragment_theme_picker
+ : R.layout.fragment_theme_scalable_picker,
+ container, /* attachToRoot */ false);
+ } else {
+ view = inflater.inflate(
+ R.layout.fragment_theme_picker, container, /* attachToRoot */ false);
+ }
setUpToolbar(view);
mContent = view.findViewById(R.id.content_section);
diff --git a/src/com/android/customization/widget/PageIndicator.java b/src/com/android/customization/widget/PageIndicator.java
deleted file mode 100644
index dd636ad..0000000
--- a/src/com/android/customization/widget/PageIndicator.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.customization.widget;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Animatable2;
-import android.graphics.drawable.AnimatedVectorDrawable;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-
-import com.android.wallpaper.R;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-/**
- * Page indicator widget, based on QS's page indicator:
- *
- * Based on QS PageIndicator
- * Path: frameworks/base/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java
- */
-public class PageIndicator extends ViewGroup {
-
- private static final String TAG = "PageIndicator";
- private static final boolean DEBUG = false;
-
- // The size of a single dot in relation to the whole animation.
- private static final float SINGLE_SCALE = .4f;
-
- static final float MINOR_ALPHA = .42f;
-
- private final ArrayList<Integer> mQueuedPositions = new ArrayList<>();
-
- private final int mPageIndicatorWidth;
- private final int mPageIndicatorHeight;
- private final int mPageDotWidth;
-
- private int mPosition = -1;
- private boolean mAnimating;
-
- private static Method sMethodForceAnimationOnUI = null;
- private final Animatable2.AnimationCallback mAnimationCallback =
- new Animatable2.AnimationCallback() {
-
- @Override
- public void onAnimationEnd(Drawable drawable) {
- super.onAnimationEnd(drawable);
- if (drawable instanceof AnimatedVectorDrawable) {
- ((AnimatedVectorDrawable) drawable).unregisterAnimationCallback(
- mAnimationCallback);
- }
- if (DEBUG) {
- Log.d(TAG, "onAnimationEnd - queued: " + mQueuedPositions.size());
- }
- mAnimating = false;
- if (mQueuedPositions.size() != 0) {
- setPosition(mQueuedPositions.remove(0));
- }
- }
- };
-
-
- public PageIndicator(Context context, AttributeSet attrs) {
- super(context, attrs);
- mPageIndicatorWidth =
- (int) context.getResources().getDimension(R.dimen.preview_indicator_width);
- mPageIndicatorHeight =
- (int) context.getResources().getDimension(R.dimen.preview_indicator_height);
- mPageDotWidth = (int) (mPageIndicatorWidth * SINGLE_SCALE);
- }
-
- public void setNumPages(int numPages) {
- setVisibility(numPages > 1 ? View.VISIBLE : View.INVISIBLE);
- if (mAnimating) {
- Log.w(TAG, "setNumPages during animation");
- }
- while (numPages < getChildCount()) {
- removeViewAt(getChildCount() - 1);
- }
- TypedArray array = getContext().obtainStyledAttributes(
- new int[]{android.R.attr.colorControlActivated});
- int color = array.getColor(0, 0);
- array.recycle();
- while (numPages > getChildCount()) {
- ImageView v = new ImageView(getContext());
- v.setImageResource(R.drawable.minor_a_b);
- v.setImageTintList(ColorStateList.valueOf(color));
- addView(v, new LayoutParams(mPageIndicatorWidth, mPageIndicatorHeight));
- }
- // Refresh state.
- setIndex(mPosition >> 1);
- }
-
- public void setLocation(float location) {
- int index = (int) location;
- setContentDescription(getContext().getString(R.string.accessibility_preview_pager,
- (index + 1), getChildCount()));
- int position = index << 1 | ((location != index) ? 1 : 0);
- if (DEBUG) {
- Log.d(TAG, "setLocation " + location + " " + index + " " + position);
- }
-
- int lastPosition = mPosition;
- if (mQueuedPositions.size() != 0) {
- lastPosition = mQueuedPositions.get(mQueuedPositions.size() - 1);
- }
- if (DEBUG) {
- Log.d(TAG, position + " " + lastPosition);
- }
- if (position == lastPosition) return;
- if (mAnimating) {
- if (DEBUG) {
- Log.d(TAG, "Queueing transition to " + Integer.toHexString(position));
- }
- mQueuedPositions.add(position);
- return;
- }
-
- setPosition(position);
- }
-
- private void setPosition(int position) {
- if (mPosition >= 0 && Math.abs(mPosition - position) == 1) {
- animate(mPosition, position);
- } else {
- if (DEBUG) {
- Log.d(TAG, "Skipping animation " + mPosition
- + " " + position);
- }
- setIndex(position >> 1);
- }
- mPosition = position;
- }
-
- private void setIndex(int index) {
- final int N = getChildCount();
- for (int i = 0; i < N; i++) {
- ImageView v = (ImageView) getChildAt(i);
- // Clear out any animation positioning.
- v.setTranslationX(0);
- v.setImageResource(R.drawable.major_a_b);
- v.setAlpha(getAlpha(i == index));
- }
- }
-
- private void animate(int from, int to) {
- if (DEBUG) {
- Log.d(TAG, "Animating from " + Integer.toHexString(from) + " to "
- + Integer.toHexString(to));
- }
- int fromIndex = from >> 1;
- int toIndex = to >> 1;
-
- // Set the position of everything, then we will manually control the two views involved
- // in the animation.
- setIndex(fromIndex);
-
- boolean fromTransition = (from & 1) != 0;
- boolean isAState = fromTransition ? from > to : from < to;
- int firstIndex = Math.min(fromIndex, toIndex);
- int secondIndex = Math.max(fromIndex, toIndex);
- if (secondIndex == firstIndex) {
- secondIndex++;
- }
- ImageView first = (ImageView) getChildAt(firstIndex);
- ImageView second = (ImageView) getChildAt(secondIndex);
- if (first == null || second == null) {
- // may happen during reInflation or other weird cases
- return;
- }
- // Lay the two views on top of each other.
- second.setTranslationX(first.getX() - second.getX());
-
- playAnimation(first, getTransition(fromTransition, isAState, false));
- first.setAlpha(getAlpha(false));
-
- playAnimation(second, getTransition(fromTransition, isAState, true));
- second.setAlpha(getAlpha(true));
-
- mAnimating = true;
- }
-
- private float getAlpha(boolean isMajor) {
- return isMajor ? 1 : MINOR_ALPHA;
- }
-
- private void playAnimation(ImageView imageView, int res) {
- Drawable drawable = getContext().getDrawable(res);
- if (!(drawable instanceof AnimatedVectorDrawable)) {
- return;
- }
- final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) drawable;
- imageView.setImageDrawable(avd);
- try {
- forceAnimationOnUI(avd);
- } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
- Log.e(TAG, "Catch an exception in playAnimation", e);
- }
- avd.registerAnimationCallback(mAnimationCallback);
- avd.start();
- }
-
- private void forceAnimationOnUI(AnimatedVectorDrawable avd)
- throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
- if (sMethodForceAnimationOnUI == null) {
- sMethodForceAnimationOnUI = AnimatedVectorDrawable.class.getMethod(
- "forceAnimationOnUI");
- }
- if (sMethodForceAnimationOnUI != null) {
- sMethodForceAnimationOnUI.invoke(avd);
- }
- }
-
- private int getTransition(boolean fromB, boolean isMajorAState, boolean isMajor) {
- if (isMajor) {
- if (fromB) {
- if (isMajorAState) {
- return R.drawable.major_b_a_animation;
- } else {
- return R.drawable.major_b_c_animation;
- }
- } else {
- if (isMajorAState) {
- return R.drawable.major_a_b_animation;
- } else {
- return R.drawable.major_c_b_animation;
- }
- }
- } else {
- if (fromB) {
- if (isMajorAState) {
- return R.drawable.minor_b_c_animation;
- } else {
- return R.drawable.minor_b_a_animation;
- }
- } else {
- if (isMajorAState) {
- return R.drawable.minor_c_b_animation;
- } else {
- return R.drawable.minor_a_b_animation;
- }
- }
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- final int N = getChildCount();
- if (N == 0) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- return;
- }
- final int widthChildSpec = MeasureSpec.makeMeasureSpec(mPageIndicatorWidth,
- MeasureSpec.EXACTLY);
- final int heightChildSpec = MeasureSpec.makeMeasureSpec(mPageIndicatorHeight,
- MeasureSpec.EXACTLY);
- for (int i = 0; i < N; i++) {
- getChildAt(i).measure(widthChildSpec, heightChildSpec);
- }
- int width = (mPageIndicatorWidth - mPageDotWidth) * (N - 1) + mPageDotWidth;
- setMeasuredDimension(width, mPageIndicatorHeight);
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- final int N = getChildCount();
- if (N == 0) {
- return;
- }
- for (int i = 0; i < N; i++) {
- int left = (mPageIndicatorWidth - mPageDotWidth) * i;
- getChildAt(i).layout(left, 0, mPageIndicatorWidth + left, mPageIndicatorHeight);
- }
- }
-}
diff --git a/src/com/android/customization/widget/PreviewPager.java b/src/com/android/customization/widget/PreviewPager.java
deleted file mode 100644
index 73a5554..0000000
--- a/src/com/android/customization/widget/PreviewPager.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.customization.widget;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.database.DataSetObserver;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import androidx.annotation.Nullable;
-import androidx.core.text.TextUtilsCompat;
-import androidx.core.view.ViewCompat;
-import androidx.viewpager.widget.PagerAdapter;
-import androidx.viewpager.widget.ViewPager;
-import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
-
-import com.android.wallpaper.R;
-
-import java.util.Locale;
-
-/**
- * A Widget consisting of a ViewPager linked to a PageIndicator and previous/next arrows that can be
- * used to page over that ViewPager.
- * To use it, set a {@link PagerAdapter} using {@link #setAdapter(PagerAdapter)}, and optionally use
- * a {@link #setOnPageChangeListener(OnPageChangeListener)} to listen for page changes.
- */
-public class PreviewPager extends LinearLayout {
-
- private static final int STYLE_PEEKING = 0;
- private static final int STYLE_ASPECT_RATIO = 1;
-
- private final ViewPager mViewPager;
- private final PageIndicator mPageIndicator;
- private final View mPreviousArrow;
- private final View mNextArrow;
- private final ViewPager.OnPageChangeListener mPageListener;
- private int mPageStyle;
-
- private PagerAdapter mAdapter;
- private ViewPager.OnPageChangeListener mExternalPageListener;
- private float mScreenAspectRatio;
-
- public PreviewPager(Context context) {
- this(context, null);
- }
-
- public PreviewPager(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public PreviewPager(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- LayoutInflater.from(context).inflate(R.layout.preview_pager, this);
- Resources res = context.getResources();
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.PreviewPager, defStyleAttr, 0);
-
- mPageStyle = a.getInteger(R.styleable.PreviewPager_card_style, STYLE_PEEKING);
-
- a.recycle();
-
- mViewPager = findViewById(R.id.preview_viewpager);
- mViewPager.setPageMargin(res.getDimensionPixelOffset(R.dimen.preview_page_gap));
- mViewPager.setClipToPadding(false);
- if (mPageStyle == STYLE_PEEKING) {
- int screenWidth = mViewPager.getResources().getDisplayMetrics().widthPixels;
- int hMargin = res.getDimensionPixelOffset(R.dimen.preview_page_horizontal_margin);
- hMargin = Math.max(hMargin, screenWidth/8);
- mViewPager.setPadding(
- hMargin,
- res.getDimensionPixelOffset(R.dimen.preview_page_top_margin),
- hMargin,
- res.getDimensionPixelOffset(R.dimen.preview_page_bottom_margin));
- } else if (mPageStyle == STYLE_ASPECT_RATIO) {
- DisplayMetrics dm = res.getDisplayMetrics();
- mScreenAspectRatio = dm.heightPixels > dm.widthPixels
- ? (float) dm.heightPixels / dm.widthPixels
- : (float) dm.widthPixels / dm.heightPixels;
- mViewPager.setPadding(
- 0,
- res.getDimensionPixelOffset(R.dimen.preview_page_top_margin),
- 0,
- res.getDimensionPixelOffset(R.dimen.preview_page_bottom_margin));
- }
- mPageIndicator = findViewById(R.id.page_indicator);
- mPreviousArrow = findViewById(R.id.arrow_previous);
- mPreviousArrow.setOnClickListener(v -> {
- final int previousPos = mViewPager.getCurrentItem() - 1;
- mViewPager.setCurrentItem(previousPos, true);
- });
- mNextArrow = findViewById(R.id.arrow_next);
- mNextArrow.setOnClickListener(v -> {
- final int NextPos = mViewPager.getCurrentItem() + 1;
- mViewPager.setCurrentItem(NextPos, true);
- });
- mPageListener = createPageListener();
- mViewPager.addOnPageChangeListener(mPageListener);
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- if (mPageStyle == STYLE_ASPECT_RATIO) {
- int availableWidth = MeasureSpec.getSize(widthMeasureSpec);
- int availableHeight = MeasureSpec.getSize(heightMeasureSpec);
- int indicatorHeight = mPageIndicator.getVisibility() == VISIBLE
- ? ((View) mPageIndicator.getParent()).getLayoutParams().height
- : 0;
- int pagerHeight = availableHeight - indicatorHeight;
- if (availableWidth > 0) {
- int absoluteCardWidth = (int) ((pagerHeight - mViewPager.getPaddingBottom()
- - mViewPager.getPaddingTop())/ mScreenAspectRatio);
- int hPadding = (availableWidth / 2) - (absoluteCardWidth / 2);
- mViewPager.setPaddingRelative(
- hPadding,
- mViewPager.getPaddingTop(),
- hPadding,
- mViewPager.getPaddingBottom());
- }
- }
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
-
- public void forceCardWidth(int widthPixels) {
- mViewPager.addOnLayoutChangeListener(new OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- int hPadding = (mViewPager.getWidth() - widthPixels) / 2;
- mViewPager.setPadding(hPadding, mViewPager.getPaddingTop(),
- hPadding, mViewPager.getPaddingBottom());
- mViewPager.removeOnLayoutChangeListener(this);
- }
- });
- mViewPager.invalidate();
- }
-
- /**
- * Call this method to set the {@link PagerAdapter} backing the {@link ViewPager} in this
- * widget.
- */
- public void setAdapter(PagerAdapter adapter) {
- int initialPage = 0;
- if (mViewPager.getAdapter() != null) {
- initialPage = isRtl() ? mAdapter.getCount() - 1 - mViewPager.getCurrentItem()
- : mViewPager.getCurrentItem();
- }
- mAdapter = adapter;
- mViewPager.setAdapter(adapter);
- mViewPager.setCurrentItem(isRtl() ? mAdapter.getCount() - 1 - initialPage : initialPage);
- mAdapter.registerDataSetObserver(new DataSetObserver() {
- @Override
- public void onChanged() {
- initIndicator();
- }
- });
- initIndicator();
- updateIndicator(mViewPager.getCurrentItem());
- }
-
- private boolean isRtl() {
- if (ViewCompat.isLayoutDirectionResolved(mViewPager)) {
- return ViewCompat.getLayoutDirection(mViewPager) == ViewCompat.LAYOUT_DIRECTION_RTL;
- }
- return TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault())
- == ViewCompat.LAYOUT_DIRECTION_RTL;
- }
-
- /**
- * Set a {@link OnPageChangeListener} to be notified when the ViewPager's page state changes
- */
- public void setOnPageChangeListener(@Nullable ViewPager.OnPageChangeListener listener) {
- mExternalPageListener = listener;
- }
-
- private void initIndicator() {
- mPageIndicator.setNumPages(mAdapter.getCount());
- mPageIndicator.setLocation(mViewPager.getCurrentItem());
- }
-
- private ViewPager.OnPageChangeListener createPageListener() {
- return new ViewPager.OnPageChangeListener() {
- @Override
- public void onPageScrolled(
- int position, float positionOffset, int positionOffsetPixels) {
- // For certain sizes, positionOffset never makes it to 1, so round it as we don't
- // need that much precision
- float location = (float) Math.round((position + positionOffset) * 100) / 100;
- mPageIndicator.setLocation(location);
- if (mExternalPageListener != null) {
- mExternalPageListener.onPageScrolled(position, positionOffset,
- positionOffsetPixels);
- }
- }
-
- @Override
- public void onPageSelected(int position) {
- int adapterCount = mAdapter.getCount();
- if (position < 0 || position >= adapterCount) {
- return;
- }
-
- updateIndicator(position);
- if (mExternalPageListener != null) {
- mExternalPageListener.onPageSelected(position);
- }
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- if (mExternalPageListener != null) {
- mExternalPageListener.onPageScrollStateChanged(state);
- }
- }
- };
- }
-
- private void updateIndicator(int position) {
- int adapterCount = mAdapter.getCount();
- if (adapterCount > 1) {
- mPreviousArrow.setVisibility(position != 0 ? View.VISIBLE : View.GONE);
- mNextArrow.setVisibility(position != (adapterCount - 1) ? View.VISIBLE : View.GONE);
- } else {
- mPageIndicator.setVisibility(View.GONE);
- mPreviousArrow.setVisibility(View.GONE);
- mNextArrow.setVisibility(View.GONE);
- }
- }
-}
diff --git a/tests/src/com/android/customization/picker/CustomizationPickerActivityTest.java b/tests/src/com/android/customization/picker/CustomizationPickerActivityTest.java
new file mode 100644
index 0000000..dd1581a
--- /dev/null
+++ b/tests/src/com/android/customization/picker/CustomizationPickerActivityTest.java
@@ -0,0 +1,160 @@
+package com.android.customization.picker;
+
+import static android.content.Intent.ACTION_SET_WALLPAPER;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.intent.matcher.IntentMatchers.filterEquals;
+import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.isSelected;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+
+import static com.android.customization.picker.CustomizationPickerActivity.WALLPAPER_FLAVOR_EXTRA;
+import static com.android.customization.picker.CustomizationPickerActivity.WALLPAPER_FOCUS;
+import static com.android.customization.picker.CustomizationPickerActivity.WALLPAPER_ONLY;
+
+import static org.junit.Assert.assertTrue;
+
+import android.content.Intent;
+import android.text.TextUtils;
+
+import androidx.fragment.app.Fragment;
+import androidx.test.espresso.intent.Intents;
+import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
+import androidx.test.rule.ActivityTestRule;
+
+import com.android.customization.picker.theme.ThemeFragment;
+import com.android.customization.testing.TestCustomizationInjector;
+import com.android.customization.testing.TestThemeManager;
+import com.android.wallpaper.R;
+import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.picker.CategoryFragment;
+import com.android.wallpaper.picker.TopLevelPickerActivity;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link CustomizationPickerActivity}.
+ */
+@RunWith(AndroidJUnit4ClassRunner.class)
+public class CustomizationPickerActivityTest {
+
+ @Rule
+ public ActivityTestRule<CustomizationPickerActivity> mActivityRule =
+ new ActivityTestRule<>(CustomizationPickerActivity.class, false, false);
+
+ @Before
+ public void setUp() {
+ Intents.init();
+ }
+
+ @After
+ public void tearDown() {
+ mActivityRule.finishActivity();
+ Intents.release();
+ }
+
+ @Test
+ public void launchActivity_doesNotSupportCustomization_launchesTopLevelPickerActivity() {
+ TestThemeManager.setAvailable(false);
+
+ launchActivity();
+
+ Intents.intended(filterEquals(new Intent(mActivityRule.getActivity(),
+ TopLevelPickerActivity.class)));
+ }
+
+ // ----------------------------------------------------------------------
+ // Tests for customization supports.
+ // ----------------------------------------------------------------------
+
+ @Test
+ public void launchActivity_themeManagerIsAvailable_NavBarShowsStyleAndWallpaperItem() {
+ TestThemeManager.setAvailable(true);
+
+ launchActivity();
+
+ onView(withId(R.id.nav_theme)).check(matches(isCompletelyDisplayed()));
+ onView(withId(R.id.nav_wallpaper)).check(matches(isCompletelyDisplayed()));
+ onView(withId(R.id.nav_clock)).check(doesNotExist());
+ onView(withId(R.id.nav_grid)).check(doesNotExist());
+ }
+
+ @Test
+ public void launchActivity_navigateToTheStyleTabByDefault() {
+ TestThemeManager.setAvailable(true);
+
+ launchActivity();
+
+ onView(withId(R.id.nav_theme)).check(matches(isSelected()));
+ assertTrue(getCurrentShowingFragment() instanceof ThemeFragment);
+ }
+
+ @Test
+ public void launchActivity_withExtraWallpaperOnly_launchesTopLevelPickerActivity() {
+ TestThemeManager.setAvailable(true);
+
+ launchActivityWithFlavorExtra(WALLPAPER_ONLY);
+
+ // While receiving WALLPAPER_ONLY extra, it should launch TopLevelPickerActivity whatever it
+ // supports customization.
+ Intents.intended(filterEquals(new Intent(mActivityRule.getActivity(),
+ TopLevelPickerActivity.class)));
+ }
+
+ @Test
+ public void clickStyleButton_showsThemeFragment() {
+ TestThemeManager.setAvailable(true);
+ launchActivity();
+
+ onView(withId(R.id.nav_theme)).perform(click());
+
+ onView(withId(R.id.nav_theme)).check(matches(isSelected()));
+ assertTrue(getCurrentShowingFragment() instanceof ThemeFragment);
+ }
+
+ @Test
+ public void clickWallpaperButton_showsCategoryFragment() {
+ TestThemeManager.setAvailable(true);
+ launchActivity();
+
+ onView(withId(R.id.nav_wallpaper)).perform(click());
+
+ onView(withId(R.id.nav_wallpaper)).check(matches(isSelected()));
+ assertTrue(getCurrentShowingFragment() instanceof CategoryFragment);
+ }
+
+ @Test
+ public void launchActivity_withExtraWallpaperFocus_navigateToTheWallpaperTab() {
+ TestThemeManager.setAvailable(true);
+
+ launchActivityWithFlavorExtra(WALLPAPER_FOCUS);
+
+ onView(withId(R.id.nav_wallpaper)).check(matches(isSelected()));
+ assertTrue(getCurrentShowingFragment() instanceof CategoryFragment);
+ }
+
+ private void launchActivity() {
+ launchActivityWithFlavorExtra("");
+ }
+
+ private void launchActivityWithFlavorExtra(String extra) {
+ InjectorProvider.setInjector(new TestCustomizationInjector());
+ Intent intent = new Intent(ACTION_SET_WALLPAPER);
+ if (!TextUtils.isEmpty(extra)) {
+ intent.putExtra(WALLPAPER_FLAVOR_EXTRA, extra);
+ }
+ mActivityRule.launchActivity(intent);
+ }
+
+ private Fragment getCurrentShowingFragment() {
+ return mActivityRule.getActivity().getSupportFragmentManager()
+ .findFragmentById(R.id.fragment_container);
+ }
+}
diff --git a/tests/src/com/android/customization/testing/TestCustomizationInjector.java b/tests/src/com/android/customization/testing/TestCustomizationInjector.java
new file mode 100644
index 0000000..10b5934
--- /dev/null
+++ b/tests/src/com/android/customization/testing/TestCustomizationInjector.java
@@ -0,0 +1,74 @@
+package com.android.customization.testing;
+
+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.customization.module.CustomizationInjector;
+import com.android.customization.module.CustomizationPreferences;
+import com.android.customization.module.ThemesUserEventLogger;
+import com.android.wallpaper.module.DrawableLayerResolver;
+import com.android.wallpaper.module.PackageStatusNotifier;
+import com.android.wallpaper.module.UserEventLogger;
+import com.android.wallpaper.module.WallpaperSetter;
+import com.android.wallpaper.testing.TestInjector;
+
+/**
+ * Test implementation of the dependency injector.
+ */
+public class TestCustomizationInjector extends TestInjector implements CustomizationInjector {
+ private CustomizationPreferences mCustomizationPreferences;
+ private ThemeManager mThemeManager;
+ private PackageStatusNotifier mPackageStatusNotifier;
+ private DrawableLayerResolver mDrawableLayerResolver;
+ private UserEventLogger mUserEventLogger;
+
+ @Override
+ public CustomizationPreferences getCustomizationPreferences(Context context) {
+ if (mCustomizationPreferences == null) {
+ mCustomizationPreferences = new TestDefaultCustomizationPreferences(context);
+ }
+ return mCustomizationPreferences;
+ }
+
+ @Override
+ public ThemeManager getThemeManager(
+ ThemeBundleProvider provider,
+ FragmentActivity activity,
+ WallpaperSetter wallpaperSetter,
+ OverlayManagerCompat overlayManagerCompat,
+ ThemesUserEventLogger logger) {
+ if (mThemeManager == null) {
+ mThemeManager = new TestThemeManager(provider, activity, wallpaperSetter,
+ overlayManagerCompat, logger);
+ }
+ return mThemeManager;
+ }
+
+ @Override
+ public PackageStatusNotifier getPackageStatusNotifier(Context context) {
+ if (mPackageStatusNotifier == null) {
+ mPackageStatusNotifier = new TestPackageStatusNotifier();
+ }
+ return mPackageStatusNotifier;
+ }
+
+ @Override
+ public DrawableLayerResolver getDrawableLayerResolver() {
+ if (mDrawableLayerResolver == null) {
+ mDrawableLayerResolver = new TestDrawableLayerResolver();
+ }
+ return mDrawableLayerResolver;
+ }
+
+ @Override
+ public UserEventLogger getUserEventLogger(Context unused) {
+ if (mUserEventLogger == null) {
+ mUserEventLogger = new TestThemesUserEventLogger();
+ }
+ return mUserEventLogger;
+ }
+}
diff --git a/tests/src/com/android/customization/testing/TestDefaultCustomizationPreferences.java b/tests/src/com/android/customization/testing/TestDefaultCustomizationPreferences.java
new file mode 100644
index 0000000..bcf5a5f
--- /dev/null
+++ b/tests/src/com/android/customization/testing/TestDefaultCustomizationPreferences.java
@@ -0,0 +1,41 @@
+package com.android.customization.testing;
+
+import android.content.Context;
+
+import com.android.customization.module.DefaultCustomizationPreferences;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Test implementation of {@link DefaultCustomizationPreferences}.
+ */
+public class TestDefaultCustomizationPreferences extends DefaultCustomizationPreferences {
+
+ private String mCustomThemes;
+ private final Set<String> mTabVisited = new HashSet<>();
+
+ public TestDefaultCustomizationPreferences(Context context) {
+ super(context);
+ }
+
+ @Override
+ public String getSerializedCustomThemes() {
+ return mCustomThemes;
+ }
+
+ @Override
+ public void storeCustomThemes(String serializedCustomThemes) {
+ mCustomThemes = serializedCustomThemes;
+ }
+
+ @Override
+ public boolean getTabVisited(String id) {
+ return mTabVisited.contains(id);
+ }
+
+ @Override
+ public void setTabVisited(String id) {
+ mTabVisited.add(id);
+ }
+}
diff --git a/tests/src/com/android/customization/testing/TestDrawableLayerResolver.java b/tests/src/com/android/customization/testing/TestDrawableLayerResolver.java
new file mode 100644
index 0000000..e507221
--- /dev/null
+++ b/tests/src/com/android/customization/testing/TestDrawableLayerResolver.java
@@ -0,0 +1,16 @@
+package com.android.customization.testing;
+
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+
+import com.android.wallpaper.module.DrawableLayerResolver;
+
+/**
+ * Test implementation of {@link DrawableLayerResolver}.
+ */
+public class TestDrawableLayerResolver implements DrawableLayerResolver {
+ @Override
+ public Drawable resolveLayer(LayerDrawable layerDrawable) {
+ return layerDrawable.getDrawable(0);
+ }
+}
diff --git a/tests/src/com/android/customization/testing/TestPackageStatusNotifier.java b/tests/src/com/android/customization/testing/TestPackageStatusNotifier.java
new file mode 100644
index 0000000..1e6a1a2
--- /dev/null
+++ b/tests/src/com/android/customization/testing/TestPackageStatusNotifier.java
@@ -0,0 +1,18 @@
+package com.android.customization.testing;
+
+import com.android.wallpaper.module.PackageStatusNotifier;
+
+/**
+ * Test implementation of {@link PackageStatusNotifier}.
+ */
+public class TestPackageStatusNotifier implements PackageStatusNotifier {
+ @Override
+ public void addListener(Listener listener, String action) {
+ // Do nothing
+ }
+
+ @Override
+ public void removeListener(Listener listener) {
+ // Do nothing
+ }
+}
diff --git a/tests/src/com/android/customization/testing/TestThemeManager.java b/tests/src/com/android/customization/testing/TestThemeManager.java
new file mode 100644
index 0000000..cc8567f
--- /dev/null
+++ b/tests/src/com/android/customization/testing/TestThemeManager.java
@@ -0,0 +1,35 @@
+package com.android.customization.testing;
+
+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.customization.module.ThemesUserEventLogger;
+import com.android.wallpaper.module.WallpaperSetter;
+
+/**
+ * Test implementation of {@link ThemeManager}.
+ */
+public class TestThemeManager extends ThemeManager {
+
+ private static boolean sIsAvailable;
+
+ public TestThemeManager(
+ ThemeBundleProvider provider,
+ FragmentActivity activity,
+ WallpaperSetter wallpaperSetter,
+ OverlayManagerCompat overlayManagerCompat,
+ ThemesUserEventLogger logger) {
+ super(provider, activity, wallpaperSetter, overlayManagerCompat, logger);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return sIsAvailable;
+ }
+
+ public static void setAvailable(boolean available) {
+ sIsAvailable = available;
+ }
+}
diff --git a/tests/src/com/android/customization/testing/TestThemesUserEventLogger.java b/tests/src/com/android/customization/testing/TestThemesUserEventLogger.java
new file mode 100644
index 0000000..3600192
--- /dev/null
+++ b/tests/src/com/android/customization/testing/TestThemesUserEventLogger.java
@@ -0,0 +1,43 @@
+package com.android.customization.testing;
+
+import com.android.customization.model.clock.Clockface;
+import com.android.customization.model.grid.GridOption;
+import com.android.customization.model.theme.ThemeBundle;
+import com.android.customization.module.ThemesUserEventLogger;
+import com.android.wallpaper.testing.TestUserEventLogger;
+
+/**
+ * Test implementation of {@link ThemesUserEventLogger}.
+ */
+public class TestThemesUserEventLogger extends TestUserEventLogger
+ implements ThemesUserEventLogger {
+ @Override
+ public void logThemeSelected(ThemeBundle theme, boolean isCustomTheme) {
+ // Do nothing.
+ }
+
+ @Override
+ public void logThemeApplied(ThemeBundle theme, boolean isCustomTheme) {
+ // Do nothing.
+ }
+
+ @Override
+ public void logClockSelected(Clockface clock) {
+ // Do nothing.
+ }
+
+ @Override
+ public void logClockApplied(Clockface clock) {
+ // Do nothing.
+ }
+
+ @Override
+ public void logGridSelected(GridOption grid) {
+ // Do nothing.
+ }
+
+ @Override
+ public void logGridApplied(GridOption grid) {
+ // Do nothing.
+ }
+}