Snap for 7670707 from 907c22ca14 to sc-v2-release
Change-Id: If2a1f8ac38f3ee3541430162386545a21add72b5
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<solid android:color="@color/gesture_tutorial_primary_color" />
|
||||
<size android:width="92dp" android:height="92dp"/>
|
||||
</shape>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,212 +0,0 @@
|
||||
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt">
|
||||
<target android:name="time_group">
|
||||
<aapt:attr name="android:animation">
|
||||
<set android:ordering="together">
|
||||
<objectAnimator
|
||||
android:duration="83"
|
||||
android:propertyName="translateX"
|
||||
android:startOffset="0"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="1"
|
||||
android:valueType="floatType" />
|
||||
</set>
|
||||
</aapt:attr>
|
||||
</target>
|
||||
<aapt:attr name="android:drawable">
|
||||
<vector
|
||||
android:width="412dp"
|
||||
android:height="892dp"
|
||||
android:viewportHeight="892"
|
||||
android:viewportWidth="412">
|
||||
<group android:name="_R_G">
|
||||
<group
|
||||
android:name="_R_G_L_1_G"
|
||||
android:translateX="206"
|
||||
android:translateY="446">
|
||||
<path
|
||||
android:name="_R_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -446 C206,-446 206,446 206,446 C206,446 -206,446 -206,446 C-206,446 -206,-446 -206,-446 C-206,-446 206,-446 206,-446c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G"
|
||||
android:pivotX="206"
|
||||
android:pivotY="446"
|
||||
android:scaleX="1"
|
||||
android:scaleY="1">
|
||||
<group android:name="_R_G_L_0_G_L_0_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_14_G"
|
||||
android:translateX="206"
|
||||
android:translateY="446">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_14_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#000000"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -422 C206,-422 206,422 206,422 C206,435.25 195.25,446 182,446 C182,446 -182,446 -182,446 C-195.25,446 -206,435.25 -206,422 C-206,422 -206,-422 -206,-422 C-206,-435.25 -195.25,-446 -182,-446 C-182,-446 182,-446 182,-446 C195.25,-446 206,-435.25 206,-422c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_13_G"
|
||||
android:translateX="206"
|
||||
android:translateY="496.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_13_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#f1f3f4"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -395.5 C206,-395.5 206,395.5 206,395.5 C206,395.5 -206,395.5 -206,395.5 C-206,395.5 -206,-395.5 -206,-395.5 C-206,-395.5 206,-395.5 206,-395.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_12_G"
|
||||
android:translateX="206"
|
||||
android:translateY="50.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_12_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#e8eaed"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -50.5 C206,-50.5 206,50.5 206,50.5 C206,50.5 -206,50.5 -206,50.5 C-206,50.5 -206,-50.5 -206,-50.5 C-206,-50.5 206,-50.5 206,-50.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_11_G"
|
||||
android:translateX="206"
|
||||
android:translateY="804">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_11_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M177 0 C177,12.15 167.15,22 155,22 C155,22 -155,22 -155,22 C-167.15,22 -177,12.15 -177,0 C-177,-12.15 -167.15,-22 -155,-22 C-155,-22 155,-22 155,-22 C167.15,-22 177,-12.15 177,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_10_G"
|
||||
android:translateX="117.5"
|
||||
android:translateY="61">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_10_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M83.5 -14 C83.5,-14 83.5,14 83.5,14 C83.5,16.21 81.71,18 79.5,18 C79.5,18 -79.5,18 -79.5,18 C-81.71,18 -83.5,16.21 -83.5,14 C-83.5,14 -83.5,-14 -83.5,-14 C-83.5,-16.21 -81.71,-18 -79.5,-18 C-79.5,-18 79.5,-18 79.5,-18 C81.71,-18 83.5,-16.21 83.5,-14c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_9_G"
|
||||
android:translateX="370"
|
||||
android:translateY="61">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_9_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M18 -14 C18,-14 18,14 18,14 C18,16.21 16.21,18 14,18 C14,18 -14,18 -14,18 C-16.21,18 -18,16.21 -18,14 C-18,14 -18,-14 -18,-14 C-18,-16.21 -16.21,-18 -14,-18 C-14,-18 14,-18 14,-18 C16.21,-18 18,-16.21 18,-14c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_8_G"
|
||||
android:translateX="318"
|
||||
android:translateY="61">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_8_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M18 -14 C18,-14 18,14 18,14 C18,16.21 16.21,18 14,18 C14,18 -14,18 -14,18 C-16.21,18 -18,16.21 -18,14 C-18,14 -18,-14 -18,-14 C-18,-16.21 -16.21,-18 -14,-18 C-14,-18 14,-18 14,-18 C16.21,-18 18,-16.21 18,-14c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_7_G"
|
||||
android:translateX="48"
|
||||
android:translateY="618">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_7_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M22 0 C22,12.15 12.15,22 0,22 C-12.15,22 -22,12.15 -22,0 C-22,-12.15 -12.15,-22 0,-22 C12.15,-22 22,-12.15 22,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_6_G"
|
||||
android:translateX="48"
|
||||
android:translateY="396">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_6_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M22 0 C22,12.15 12.15,22 0,22 C-12.15,22 -22,12.15 -22,0 C-22,-12.15 -12.15,-22 0,-22 C12.15,-22 22,-12.15 22,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_5_G"
|
||||
android:translateX="259"
|
||||
android:translateY="286">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_5_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M135 -38 C135,-38 135,38 135,38 C135,47.94 126.94,56 117,56 C117,56 -117,56 -117,56 C-126.94,56 -135,47.94 -135,38 C-135,38 -135,-38 -135,-38 C-135,-47.94 -126.94,-56 -117,-56 C-117,-56 117,-56 117,-56 C126.94,-56 135,-47.94 135,-38c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_4_G"
|
||||
android:translateX="259"
|
||||
android:translateY="468">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_4_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M134.5 4 C134.5,4 134.5,14 134.5,14 C134.5,16.21 132.71,18 130.5,18 C130.5,18 44.5,18 44.5,18 C42.29,18 40.5,16.21 40.5,14 C40.5,14 40.5,4 40.5,4 C40.5,1.79 42.29,0 44.5,0 C44.5,0 130.5,0 130.5,0 C132.71,0 134.5,1.79 134.5,4c M135 0 C135,9.66 127.17,17.5 117.5,17.5 C117.5,17.5 31,17.5 31,17.5 C21.34,17.5 13.5,9.66 13.5,0 C13.5,-9.66 21.34,-17.5 31,-17.5 C31,-17.5 117.5,-17.5 117.5,-17.5 C127.17,-17.5 135,-9.66 135,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_3_G"
|
||||
android:translateX="259"
|
||||
android:translateY="526.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_3_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M135 -32.5 C135,-32.5 135,20.5 135,20.5 C135,22.71 133.21,24.5 131,24.5 C131,24.5 -95,24.5 -95,24.5 C-97.21,24.5 -99,22.71 -99,20.5 C-99,20.5 -99,-32.5 -99,-32.5 C-99,-34.71 -97.21,-36.5 -95,-36.5 C-95,-36.5 131,-36.5 131,-36.5 C133.21,-36.5 135,-34.71 135,-32.5c M135 -18.5 C135,-18.5 135,18.5 135,18.5 C135,28.44 126.94,36.5 117,36.5 C117,36.5 -117,36.5 -117,36.5 C-126.94,36.5 -135,28.44 -135,18.5 C-135,18.5 -135,-18.5 -135,-18.5 C-135,-28.44 -126.94,-36.5 -117,-36.5 C-117,-36.5 117,-36.5 117,-36.5 C126.94,-36.5 135,-28.44 135,-18.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_2_G"
|
||||
android:translateX="259"
|
||||
android:translateY="708.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M135 -18.5 C135,-18.5 135,18.5 135,18.5 C135,28.44 126.94,36.5 117,36.5 C117,36.5 -117,36.5 -117,36.5 C-126.94,36.5 -135,28.44 -135,18.5 C-135,18.5 -135,-18.5 -135,-18.5 C-135,-28.44 -126.94,-36.5 -117,-36.5 C-117,-36.5 117,-36.5 117,-36.5 C126.94,-36.5 135,-28.44 135,-18.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_1_G"
|
||||
android:translateX="222"
|
||||
android:translateY="617">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#e8eaed"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M45.5 0 C45.5,9.66 37.67,17.5 28,17.5 C28,17.5 -117.5,17.5 -117.5,17.5 C-127.16,17.5 -135,9.66 -135,0 C-135,-9.66 -127.16,-17.5 -117.5,-17.5 C-117.5,-17.5 28,-17.5 28,-17.5 C37.67,-17.5 45.5,-9.66 45.5,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_0_G"
|
||||
android:translateX="222"
|
||||
android:translateY="395.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#e8eaed"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M77 0 C77,9.66 69.16,17.5 59.5,17.5 C59.5,17.5 -117.5,17.5 -117.5,17.5 C-127.16,17.5 -135,9.66 -135,0 C-135,-9.66 -127.16,-17.5 -117.5,-17.5 C-117.5,-17.5 59.5,-17.5 59.5,-17.5 C69.16,-17.5 77,-9.66 77,0c " />
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="time_group" />
|
||||
</vector>
|
||||
</aapt:attr>
|
||||
</animated-vector>
|
||||
@@ -1,361 +0,0 @@
|
||||
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt">
|
||||
<target android:name="time_group">
|
||||
<aapt:attr name="android:animation">
|
||||
<set android:ordering="together">
|
||||
<objectAnimator
|
||||
android:duration="83"
|
||||
android:propertyName="translateX"
|
||||
android:startOffset="0"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="1"
|
||||
android:valueType="floatType" />
|
||||
</set>
|
||||
</aapt:attr>
|
||||
</target>
|
||||
<aapt:attr name="android:drawable">
|
||||
<vector
|
||||
android:width="412dp"
|
||||
android:height="892dp"
|
||||
android:viewportHeight="892"
|
||||
android:viewportWidth="412">
|
||||
<group android:name="_R_G">
|
||||
<group
|
||||
android:name="_R_G_L_1_G"
|
||||
android:translateX="206"
|
||||
android:translateY="446">
|
||||
<path
|
||||
android:name="_R_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -446 C206,-446 206,446 206,446 C206,446 -206,446 -206,446 C-206,446 -206,-446 -206,-446 C-206,-446 206,-446 206,-446c " />
|
||||
</group>
|
||||
<group android:name="_R_G_L_0_G">
|
||||
<group android:name="_R_G_L_0_G_L_0_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_28_G"
|
||||
android:translateX="206"
|
||||
android:translateY="446">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_28_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#000000"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -422 C206,-422 206,422 206,422 C206,435.25 195.25,446 182,446 C182,446 -182,446 -182,446 C-195.25,446 -206,435.25 -206,422 C-206,422 -206,-422 -206,-422 C-206,-435.25 -195.25,-446 -182,-446 C-182,-446 182,-446 182,-446 C195.25,-446 206,-435.25 206,-422c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_27_G"
|
||||
android:translateX="206"
|
||||
android:translateY="422.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_27_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -395.5 C206,-395.5 206,395.5 206,395.5 C206,395.5 -206,395.5 -206,395.5 C-206,395.5 -206,-395.5 -206,-395.5 C-206,-395.5 206,-395.5 206,-395.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_26_G"
|
||||
android:translateX="206"
|
||||
android:translateY="496.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_26_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -377.5 C206,-377.5 206,377.5 206,377.5 C206,387.43 197.93,395.5 188,395.5 C188,395.5 -188,395.5 -188,395.5 C-197.93,395.5 -206,387.43 -206,377.5 C-206,377.5 -206,-377.5 -206,-377.5 C-206,-387.43 -197.93,-395.5 -188,-395.5 C-188,-395.5 188,-395.5 188,-395.5 C197.93,-395.5 206,-387.43 206,-377.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_25_G"
|
||||
android:translateX="206"
|
||||
android:translateY="50.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_25_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#e8eaed"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -23.5 C206,-23.5 206,50.5 206,50.5 C206,50.5 -206,50.5 -206,50.5 C-206,50.5 -206,-23.5 -206,-23.5 C-206,-23.5 206,-23.5 206,-23.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_24_G"
|
||||
android:translateX="206"
|
||||
android:translateY="50.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_24_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#e8eaed"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -32.5 C206,-32.5 206,32.5 206,32.5 C206,42.43 197.93,50.5 188,50.5 C188,50.5 -188,50.5 -188,50.5 C-197.93,50.5 -206,42.43 -206,32.5 C-206,32.5 -206,-32.5 -206,-32.5 C-206,-42.43 -197.93,-50.5 -188,-50.5 C-188,-50.5 188,-50.5 188,-50.5 C197.93,-50.5 206,-42.43 206,-32.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_23_G"
|
||||
android:translateX="54"
|
||||
android:translateY="157">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_23_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_22_G"
|
||||
android:translateX="54"
|
||||
android:translateY="157">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_22_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_21_G"
|
||||
android:translateX="148.5"
|
||||
android:translateY="148">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_21_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M46.5 -5 C46.5,-5 46.5,5 46.5,5 C46.5,7.21 44.71,9 42.5,9 C42.5,9 -42.5,9 -42.5,9 C-44.71,9 -46.5,7.21 -46.5,5 C-46.5,5 -46.5,-5 -46.5,-5 C-46.5,-7.21 -44.71,-9 -42.5,-9 C-42.5,-9 42.5,-9 42.5,-9 C44.71,-9 46.5,-7.21 46.5,-5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_20_G"
|
||||
android:translateX="186"
|
||||
android:translateY="169">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_20_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M84 -4 C84,-4 84,4 84,4 C84,6.21 82.21,8 80,8 C80,8 -80,8 -80,8 C-82.21,8 -84,6.21 -84,4 C-84,4 -84,-4 -84,-4 C-84,-6.21 -82.21,-8 -80,-8 C-80,-8 80,-8 80,-8 C82.21,-8 84,-6.21 84,-4c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_19_G"
|
||||
android:translateX="54"
|
||||
android:translateY="245">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_19_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_18_G"
|
||||
android:translateX="162"
|
||||
android:translateY="236">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_18_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M60 -5 C60,-5 60,5 60,5 C60,7.21 58.21,9 56,9 C56,9 -56,9 -56,9 C-58.21,9 -60,7.21 -60,5 C-60,5 -60,-5 -60,-5 C-60,-7.21 -58.21,-9 -56,-9 C-56,-9 56,-9 56,-9 C58.21,-9 60,-7.21 60,-5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_17_G"
|
||||
android:translateX="171.5"
|
||||
android:translateY="257">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_17_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M69.5 -4 C69.5,-4 69.5,4 69.5,4 C69.5,6.21 67.71,8 65.5,8 C65.5,8 -65.5,8 -65.5,8 C-67.71,8 -69.5,6.21 -69.5,4 C-69.5,4 -69.5,-4 -69.5,-4 C-69.5,-6.21 -67.71,-8 -65.5,-8 C-65.5,-8 65.5,-8 65.5,-8 C67.71,-8 69.5,-6.21 69.5,-4c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_16_G"
|
||||
android:translateX="54"
|
||||
android:translateY="333">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_16_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_15_G"
|
||||
android:translateX="158"
|
||||
android:translateY="324">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_15_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M56 -5 C56,-5 56,5 56,5 C56,7.21 54.21,9 52,9 C52,9 -52,9 -52,9 C-54.21,9 -56,7.21 -56,5 C-56,5 -56,-5 -56,-5 C-56,-7.21 -54.21,-9 -52,-9 C-52,-9 52,-9 52,-9 C54.21,-9 56,-7.21 56,-5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_14_G"
|
||||
android:translateX="217.5"
|
||||
android:translateY="345">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_14_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M115.5 -4 C115.5,-4 115.5,4 115.5,4 C115.5,6.21 113.71,8 111.5,8 C111.5,8 -111.5,8 -111.5,8 C-113.71,8 -115.5,6.21 -115.5,4 C-115.5,4 -115.5,-4 -115.5,-4 C-115.5,-6.21 -113.71,-8 -111.5,-8 C-111.5,-8 111.5,-8 111.5,-8 C113.71,-8 115.5,-6.21 115.5,-4c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_13_G"
|
||||
android:translateX="54"
|
||||
android:translateY="421">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_13_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_12_G"
|
||||
android:translateX="170"
|
||||
android:translateY="412">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_12_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M68 -5 C68,-5 68,5 68,5 C68,7.21 66.21,9 64,9 C64,9 -64,9 -64,9 C-66.21,9 -68,7.21 -68,5 C-68,5 -68,-5 -68,-5 C-68,-7.21 -66.21,-9 -64,-9 C-64,-9 64,-9 64,-9 C66.21,-9 68,-7.21 68,-5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_11_G"
|
||||
android:translateX="198.5"
|
||||
android:translateY="433">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_11_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M96.5 -4 C96.5,-4 96.5,4 96.5,4 C96.5,6.21 94.71,8 92.5,8 C92.5,8 -92.5,8 -92.5,8 C-94.71,8 -96.5,6.21 -96.5,4 C-96.5,4 -96.5,-4 -96.5,-4 C-96.5,-6.21 -94.71,-8 -92.5,-8 C-92.5,-8 92.5,-8 92.5,-8 C94.71,-8 96.5,-6.21 96.5,-4c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_10_G"
|
||||
android:translateX="54"
|
||||
android:translateY="509">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_10_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_9_G"
|
||||
android:translateX="135"
|
||||
android:translateY="500">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_9_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M33 -5 C33,-5 33,5 33,5 C33,7.21 31.21,9 29,9 C29,9 -29,9 -29,9 C-31.21,9 -33,7.21 -33,5 C-33,5 -33,-5 -33,-5 C-33,-7.21 -31.21,-9 -29,-9 C-29,-9 29,-9 29,-9 C31.21,-9 33,-7.21 33,-5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_8_G"
|
||||
android:translateX="185.5"
|
||||
android:translateY="521">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_8_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M83.5 -4 C83.5,-4 83.5,4 83.5,4 C83.5,6.21 81.71,8 79.5,8 C79.5,8 -79.5,8 -79.5,8 C-81.71,8 -83.5,6.21 -83.5,4 C-83.5,4 -83.5,-4 -83.5,-4 C-83.5,-6.21 -81.71,-8 -79.5,-8 C-79.5,-8 79.5,-8 79.5,-8 C81.71,-8 83.5,-6.21 83.5,-4c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_7_G"
|
||||
android:translateX="54"
|
||||
android:translateY="597">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_7_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_6_G"
|
||||
android:translateX="168.5"
|
||||
android:translateY="588">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_6_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M66.5 -5 C66.5,-5 66.5,5 66.5,5 C66.5,7.21 64.71,9 62.5,9 C62.5,9 -62.5,9 -62.5,9 C-64.71,9 -66.5,7.21 -66.5,5 C-66.5,5 -66.5,-5 -66.5,-5 C-66.5,-7.21 -64.71,-9 -62.5,-9 C-62.5,-9 62.5,-9 62.5,-9 C64.71,-9 66.5,-7.21 66.5,-5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_5_G"
|
||||
android:translateX="198.5"
|
||||
android:translateY="609">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_5_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M96.5 -4 C96.5,-4 96.5,4 96.5,4 C96.5,6.21 94.71,8 92.5,8 C92.5,8 -92.5,8 -92.5,8 C-94.71,8 -96.5,6.21 -96.5,4 C-96.5,4 -96.5,-4 -96.5,-4 C-96.5,-6.21 -94.71,-8 -92.5,-8 C-92.5,-8 92.5,-8 92.5,-8 C94.71,-8 96.5,-6.21 96.5,-4c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_4_G"
|
||||
android:translateX="54"
|
||||
android:translateY="685">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_4_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9aa0a6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M28 0 C28,15.46 15.46,28 0,28 C-15.46,28 -28,15.46 -28,0 C-28,-15.46 -15.46,-28 0,-28 C15.46,-28 28,-15.46 28,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_3_G"
|
||||
android:translateX="162.5"
|
||||
android:translateY="676">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_3_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M60.5 -5 C60.5,-5 60.5,5 60.5,5 C60.5,7.21 58.71,9 56.5,9 C56.5,9 -56.5,9 -56.5,9 C-58.71,9 -60.5,7.21 -60.5,5 C-60.5,5 -60.5,-5 -60.5,-5 C-60.5,-7.21 -58.71,-9 -56.5,-9 C-56.5,-9 56.5,-9 56.5,-9 C58.71,-9 60.5,-7.21 60.5,-5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_2_G"
|
||||
android:translateX="174"
|
||||
android:translateY="697">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M72 -4 C72,-4 72,4 72,4 C72,6.21 70.21,8 68,8 C68,8 -68,8 -68,8 C-70.21,8 -72,6.21 -72,4 C-72,4 -72,-4 -72,-4 C-72,-6.21 -70.21,-8 -68,-8 C-68,-8 68,-8 68,-8 C70.21,-8 72,-6.21 72,-4c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_1_G"
|
||||
android:translateX="313.5"
|
||||
android:translateY="798">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M74.5 0 C74.5,0 74.5,0 74.5,0 C74.5,15.45 61.95,28 46.5,28 C46.5,28 -46.5,28 -46.5,28 C-61.95,28 -74.5,15.45 -74.5,0 C-74.5,0 -74.5,0 -74.5,0 C-74.5,-15.45 -61.95,-28 -46.5,-28 C-46.5,-28 46.5,-28 46.5,-28 C61.95,-28 74.5,-15.45 74.5,0c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_0_G"
|
||||
android:translateX="205.5"
|
||||
android:translateY="61">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#f8f9fa"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M171.5 -14 C171.5,-14 171.5,14 171.5,14 C171.5,16.21 169.71,18 167.5,18 C167.5,18 -167.5,18 -167.5,18 C-169.71,18 -171.5,16.21 -171.5,14 C-171.5,14 -171.5,-14 -171.5,-14 C-171.5,-16.21 -169.71,-18 -167.5,-18 C-167.5,-18 167.5,-18 167.5,-18 C169.71,-18 171.5,-16.21 171.5,-14c " />
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="time_group" />
|
||||
</vector>
|
||||
</aapt:attr>
|
||||
</animated-vector>
|
||||
@@ -1,251 +0,0 @@
|
||||
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt">
|
||||
<target android:name="time_group">
|
||||
<aapt:attr name="android:animation">
|
||||
<set android:ordering="together">
|
||||
<objectAnimator
|
||||
android:duration="83"
|
||||
android:propertyName="translateX"
|
||||
android:startOffset="0"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="1"
|
||||
android:valueType="floatType" />
|
||||
</set>
|
||||
</aapt:attr>
|
||||
</target>
|
||||
<aapt:attr name="android:drawable">
|
||||
<vector
|
||||
android:width="412dp"
|
||||
android:height="892dp"
|
||||
android:viewportHeight="892"
|
||||
android:viewportWidth="412">
|
||||
<group android:name="_R_G">
|
||||
<group android:name="_R_G_L_0_G">
|
||||
<group android:name="_R_G_L_0_G_L_3_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_11_G"
|
||||
android:scaleX="0.87473"
|
||||
android:scaleY="0.98643"
|
||||
android:translateX="206"
|
||||
android:translateY="472.769">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_11_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M235.5 -407 C235.5,-407 235.5,407 235.5,407 C235.5,416.93 227.43,425 217.5,425 C217.5,425 -217.5,425 -217.5,425 C-227.43,425 -235.5,416.93 -235.5,407 C-235.5,407 -235.5,-407 -235.5,-407 C-235.5,-416.93 -227.43,-425 -217.5,-425 C-217.5,-425 217.5,-425 217.5,-425 C227.43,-425 235.5,-416.93 235.5,-407c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_10_G"
|
||||
android:translateX="182.5"
|
||||
android:translateY="831">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_10_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M158.5 -3 C158.5,-3 158.5,3 158.5,3 C158.5,7.42 154.92,11 150.5,11 C150.5,11 -150.5,11 -150.5,11 C-154.92,11 -158.5,7.42 -158.5,3 C-158.5,3 -158.5,-3 -158.5,-3 C-158.5,-7.42 -154.92,-11 -150.5,-11 C-150.5,-11 150.5,-11 150.5,-11 C154.92,-11 158.5,-7.42 158.5,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_9_G"
|
||||
android:translateX="186"
|
||||
android:translateY="801">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_9_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M162 -3 C162,-3 162,3 162,3 C162,7.42 158.42,11 154,11 C154,11 -154,11 -154,11 C-158.42,11 -162,7.42 -162,3 C-162,3 -162,-3 -162,-3 C-162,-7.42 -158.42,-11 -154,-11 C-154,-11 154,-11 154,-11 C158.42,-11 162,-7.42 162,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_8_G"
|
||||
android:translateX="119"
|
||||
android:translateY="755">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_8_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M95 -3 C95,-3 95,3 95,3 C95,7.42 91.42,11 87,11 C87,11 -87,11 -87,11 C-91.42,11 -95,7.42 -95,3 C-95,3 -95,-3 -95,-3 C-95,-7.42 -91.42,-11 -87,-11 C-87,-11 87,-11 87,-11 C91.42,-11 95,-7.42 95,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_7_G"
|
||||
android:translateX="182.5"
|
||||
android:translateY="725">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_7_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M158.5 -3 C158.5,-3 158.5,3 158.5,3 C158.5,7.42 154.92,11 150.5,11 C150.5,11 -150.5,11 -150.5,11 C-154.92,11 -158.5,7.42 -158.5,3 C-158.5,3 -158.5,-3 -158.5,-3 C-158.5,-7.42 -154.92,-11 -150.5,-11 C-150.5,-11 150.5,-11 150.5,-11 C154.92,-11 158.5,-7.42 158.5,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_6_G"
|
||||
android:translateX="197.5"
|
||||
android:translateY="695">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_6_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M173.5 -3 C173.5,-3 173.5,3 173.5,3 C173.5,7.42 169.92,11 165.5,11 C165.5,11 -165.5,11 -165.5,11 C-169.92,11 -173.5,7.42 -173.5,3 C-173.5,3 -173.5,-3 -173.5,-3 C-173.5,-7.42 -169.92,-11 -165.5,-11 C-165.5,-11 165.5,-11 165.5,-11 C169.92,-11 173.5,-7.42 173.5,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_5_G"
|
||||
android:translateX="192"
|
||||
android:translateY="665">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_5_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M168 -3 C168,-3 168,3 168,3 C168,7.42 164.42,11 160,11 C160,11 -160,11 -160,11 C-164.42,11 -168,7.42 -168,3 C-168,3 -168,-3 -168,-3 C-168,-7.42 -164.42,-11 -160,-11 C-160,-11 160,-11 160,-11 C164.42,-11 168,-7.42 168,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_4_G"
|
||||
android:translateX="105.5"
|
||||
android:translateY="360">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_4_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M23.5 -2 C23.5,-2 23.5,2 23.5,2 C23.5,4.21 21.71,6 19.5,6 C19.5,6 -19.5,6 -19.5,6 C-21.71,6 -23.5,4.21 -23.5,2 C-23.5,2 -23.5,-2 -23.5,-2 C-23.5,-4.21 -21.71,-6 -19.5,-6 C-19.5,-6 19.5,-6 19.5,-6 C21.71,-6 23.5,-4.21 23.5,-2c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_3_G"
|
||||
android:translateX="47.5"
|
||||
android:translateY="360">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_3_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M23.5 -2 C23.5,-2 23.5,2 23.5,2 C23.5,4.21 21.71,6 19.5,6 C19.5,6 -19.5,6 -19.5,6 C-21.71,6 -23.5,4.21 -23.5,2 C-23.5,2 -23.5,-2 -23.5,-2 C-23.5,-4.21 -21.71,-6 -19.5,-6 C-19.5,-6 19.5,-6 19.5,-6 C21.71,-6 23.5,-4.21 23.5,-2c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_2_G"
|
||||
android:translateX="142.5"
|
||||
android:translateY="328">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M118.5 -10 C118.5,-10 118.5,10 118.5,10 C118.5,14.42 114.92,18 110.5,18 C110.5,18 -110.5,18 -110.5,18 C-114.92,18 -118.5,14.42 -118.5,10 C-118.5,10 -118.5,-10 -118.5,-10 C-118.5,-14.42 -114.92,-18 -110.5,-18 C-110.5,-18 110.5,-18 110.5,-18 C114.92,-18 118.5,-14.42 118.5,-10c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_1_G"
|
||||
android:translateX="186"
|
||||
android:translateY="284">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M162 -10 C162,-10 162,10 162,10 C162,14.42 158.42,18 154,18 C154,18 -154,18 -154,18 C-158.42,18 -162,14.42 -162,10 C-162,10 -162,-10 -162,-10 C-162,-14.42 -158.42,-18 -154,-18 C-154,-18 154,-18 154,-18 C158.42,-18 162,-14.42 162,-10c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_0_G"
|
||||
android:translateX="155"
|
||||
android:translateY="240">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M131 -10 C131,-10 131,10 131,10 C131,14.42 127.42,18 123,18 C123,18 -123,18 -123,18 C-127.42,18 -131,14.42 -131,10 C-131,10 -131,-10 -131,-10 C-131,-14.42 -127.42,-18 -123,-18 C-123,-18 123,-18 123,-18 C127.42,-18 131,-14.42 131,-10c " />
|
||||
</group>
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_2_G"
|
||||
android:translateX="24"
|
||||
android:translateY="390">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_2_G_L_0_G"
|
||||
android:translateX="182"
|
||||
android:translateY="120">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_2_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M182 -98 C182,-98 182,98 182,98 C182,110.14 172.14,120 160,120 C160,120 -160,120 -160,120 C-172.14,120 -182,110.14 -182,98 C-182,98 -182,-98 -182,-98 C-182,-110.14 -172.14,-120 -160,-120 C-160,-120 160,-120 160,-120 C172.14,-120 182,-110.14 182,-98c " />
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="_R_G_L_0_G_L_1_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_1_G_L_2_G"
|
||||
android:translateX="206"
|
||||
android:translateY="145">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_1_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#e8eaed"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -95.63 C206,-95.63 206,42.37 206,42.37 C206,43.47 205.1,44.37 204,44.37 C204,44.37 -204,44.37 -204,44.37 C-205.1,44.37 -206,43.47 -206,42.37 C-206,42.37 -206,-95.63 -206,-95.63 C-206,-96.73 -205.1,-97.63 -204,-97.63 C-204,-97.63 204,-97.63 204,-97.63 C205.1,-97.63 206,-96.73 206,-95.63c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_1_G_L_1_G"
|
||||
android:translateX="206"
|
||||
android:translateY="145">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_1_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#80868b"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M109 -14 C109,-14 109,14 109,14 C109,15.1 108.1,16 107,16 C107,16 -107,16 -107,16 C-108.1,16 -109,15.1 -109,14 C-109,14 -109,-14 -109,-14 C-109,-15.1 -108.1,-16 -107,-16 C-107,-16 107,-16 107,-16 C108.1,-16 109,-15.1 109,-14c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_1_G_L_0_G"
|
||||
android:translateX="46"
|
||||
android:translateY="145">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_1_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#80868b"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M22 -14 C22,-14 22,14 22,14 C22,18.42 18.42,22 14,22 C14,22 -14,22 -14,22 C-18.42,22 -22,18.42 -22,14 C-22,14 -22,-14 -22,-14 C-22,-18.42 -18.42,-22 -14,-22 C-14,-22 14,-22 14,-22 C18.42,-22 22,-18.42 22,-14c " />
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="_R_G_L_0_G_L_0_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_2_G"
|
||||
android:translateX="206"
|
||||
android:translateY="51">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#202124"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -0.27 C206,-0.27 206,49.73 206,49.73 C206,49.73 -206,49.73 -206,49.73 C-206,49.73 -206,-0.27 -206,-0.27 C-206,-0.27 206,-0.27 206,-0.27c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_1_G"
|
||||
android:translateX="206"
|
||||
android:translateY="50.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#202124"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -32.5 C206,-32.5 206,32.5 206,32.5 C206,42.43 197.93,50.5 188,50.5 C188,50.5 -188,50.5 -188,50.5 C-197.93,50.5 -206,42.43 -206,32.5 C-206,32.5 -206,-32.5 -206,-32.5 C-206,-42.43 -197.93,-50.5 -188,-50.5 C-188,-50.5 188,-50.5 188,-50.5 C197.93,-50.5 206,-42.43 206,-32.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G_L_0_G"
|
||||
android:translateX="206"
|
||||
android:translateY="66.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#3c4043"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M190 0 C190,0 190,0 190,0 C190,10.21 181.71,18.5 171.5,18.5 C171.5,18.5 -171.5,18.5 -171.5,18.5 C-181.71,18.5 -190,10.21 -190,0 C-190,0 -190,0 -190,0 C-190,-10.21 -181.71,-18.5 -171.5,-18.5 C-171.5,-18.5 171.5,-18.5 171.5,-18.5 C181.71,-18.5 190,-10.21 190,0c " />
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="time_group" />
|
||||
</vector>
|
||||
</aapt:attr>
|
||||
</animated-vector>
|
||||
@@ -1,263 +0,0 @@
|
||||
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt">
|
||||
<target android:name="time_group">
|
||||
<aapt:attr name="android:animation">
|
||||
<set android:ordering="together">
|
||||
<objectAnimator
|
||||
android:duration="83"
|
||||
android:propertyName="translateX"
|
||||
android:startOffset="0"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="1"
|
||||
android:valueType="floatType" />
|
||||
</set>
|
||||
</aapt:attr>
|
||||
</target>
|
||||
<aapt:attr name="android:drawable">
|
||||
<vector
|
||||
android:width="412dp"
|
||||
android:height="892dp"
|
||||
android:viewportHeight="892"
|
||||
android:viewportWidth="412">
|
||||
<group android:name="_R_G">
|
||||
<group android:name="_R_G_L_0_G">
|
||||
<group android:name="_R_G_L_0_G_L_4_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_11_G"
|
||||
android:scaleX="0.87473"
|
||||
android:scaleY="0.98643"
|
||||
android:translateX="206"
|
||||
android:translateY="472.769">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_11_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#dadce0"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M235.5 -407 C235.5,-407 235.5,407 235.5,407 C235.5,416.93 227.43,425 217.5,425 C217.5,425 -217.5,425 -217.5,425 C-227.43,425 -235.5,416.93 -235.5,407 C-235.5,407 -235.5,-407 -235.5,-407 C-235.5,-416.93 -227.43,-425 -217.5,-425 C-217.5,-425 217.5,-425 217.5,-425 C227.43,-425 235.5,-416.93 235.5,-407c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_10_G"
|
||||
android:translateX="182.5"
|
||||
android:translateY="831">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_10_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M158.5 -3 C158.5,-3 158.5,3 158.5,3 C158.5,7.42 154.92,11 150.5,11 C150.5,11 -150.5,11 -150.5,11 C-154.92,11 -158.5,7.42 -158.5,3 C-158.5,3 -158.5,-3 -158.5,-3 C-158.5,-7.42 -154.92,-11 -150.5,-11 C-150.5,-11 150.5,-11 150.5,-11 C154.92,-11 158.5,-7.42 158.5,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_9_G"
|
||||
android:translateX="186"
|
||||
android:translateY="801">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_9_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M162 -3 C162,-3 162,3 162,3 C162,7.42 158.42,11 154,11 C154,11 -154,11 -154,11 C-158.42,11 -162,7.42 -162,3 C-162,3 -162,-3 -162,-3 C-162,-7.42 -158.42,-11 -154,-11 C-154,-11 154,-11 154,-11 C158.42,-11 162,-7.42 162,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_8_G"
|
||||
android:translateX="119"
|
||||
android:translateY="755">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_8_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M95 -3 C95,-3 95,3 95,3 C95,7.42 91.42,11 87,11 C87,11 -87,11 -87,11 C-91.42,11 -95,7.42 -95,3 C-95,3 -95,-3 -95,-3 C-95,-7.42 -91.42,-11 -87,-11 C-87,-11 87,-11 87,-11 C91.42,-11 95,-7.42 95,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_7_G"
|
||||
android:translateX="182.5"
|
||||
android:translateY="725">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_7_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M158.5 -3 C158.5,-3 158.5,3 158.5,3 C158.5,7.42 154.92,11 150.5,11 C150.5,11 -150.5,11 -150.5,11 C-154.92,11 -158.5,7.42 -158.5,3 C-158.5,3 -158.5,-3 -158.5,-3 C-158.5,-7.42 -154.92,-11 -150.5,-11 C-150.5,-11 150.5,-11 150.5,-11 C154.92,-11 158.5,-7.42 158.5,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_6_G"
|
||||
android:translateX="197.5"
|
||||
android:translateY="695">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_6_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M173.5 -3 C173.5,-3 173.5,3 173.5,3 C173.5,7.42 169.92,11 165.5,11 C165.5,11 -165.5,11 -165.5,11 C-169.92,11 -173.5,7.42 -173.5,3 C-173.5,3 -173.5,-3 -173.5,-3 C-173.5,-7.42 -169.92,-11 -165.5,-11 C-165.5,-11 165.5,-11 165.5,-11 C169.92,-11 173.5,-7.42 173.5,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_5_G"
|
||||
android:translateX="192"
|
||||
android:translateY="665">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_5_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M168 -3 C168,-3 168,3 168,3 C168,7.42 164.42,11 160,11 C160,11 -160,11 -160,11 C-164.42,11 -168,7.42 -168,3 C-168,3 -168,-3 -168,-3 C-168,-7.42 -164.42,-11 -160,-11 C-160,-11 160,-11 160,-11 C164.42,-11 168,-7.42 168,-3c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_4_G"
|
||||
android:translateX="105.5"
|
||||
android:translateY="360">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_4_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M23.5 -2 C23.5,-2 23.5,2 23.5,2 C23.5,4.21 21.71,6 19.5,6 C19.5,6 -19.5,6 -19.5,6 C-21.71,6 -23.5,4.21 -23.5,2 C-23.5,2 -23.5,-2 -23.5,-2 C-23.5,-4.21 -21.71,-6 -19.5,-6 C-19.5,-6 19.5,-6 19.5,-6 C21.71,-6 23.5,-4.21 23.5,-2c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_3_G"
|
||||
android:translateX="47.5"
|
||||
android:translateY="360">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_3_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M23.5 -2 C23.5,-2 23.5,2 23.5,2 C23.5,4.21 21.71,6 19.5,6 C19.5,6 -19.5,6 -19.5,6 C-21.71,6 -23.5,4.21 -23.5,2 C-23.5,2 -23.5,-2 -23.5,-2 C-23.5,-4.21 -21.71,-6 -19.5,-6 C-19.5,-6 19.5,-6 19.5,-6 C21.71,-6 23.5,-4.21 23.5,-2c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_2_G"
|
||||
android:translateX="142.5"
|
||||
android:translateY="328">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M118.5 -10 C118.5,-10 118.5,10 118.5,10 C118.5,14.42 114.92,18 110.5,18 C110.5,18 -110.5,18 -110.5,18 C-114.92,18 -118.5,14.42 -118.5,10 C-118.5,10 -118.5,-10 -118.5,-10 C-118.5,-14.42 -114.92,-18 -110.5,-18 C-110.5,-18 110.5,-18 110.5,-18 C114.92,-18 118.5,-14.42 118.5,-10c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_1_G"
|
||||
android:translateX="186"
|
||||
android:translateY="284">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M162 -10 C162,-10 162,10 162,10 C162,14.42 158.42,18 154,18 C154,18 -154,18 -154,18 C-158.42,18 -162,14.42 -162,10 C-162,10 -162,-10 -162,-10 C-162,-14.42 -158.42,-18 -154,-18 C-154,-18 154,-18 154,-18 C158.42,-18 162,-14.42 162,-10c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_4_G_L_0_G"
|
||||
android:translateX="155"
|
||||
android:translateY="240">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_4_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M131 -10 C131,-10 131,10 131,10 C131,14.42 127.42,18 123,18 C123,18 -123,18 -123,18 C-127.42,18 -131,14.42 -131,10 C-131,10 -131,-10 -131,-10 C-131,-14.42 -127.42,-18 -123,-18 C-123,-18 123,-18 123,-18 C127.42,-18 131,-14.42 131,-10c " />
|
||||
</group>
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G"
|
||||
android:translateX="24"
|
||||
android:translateY="390">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_3_G_L_0_G"
|
||||
android:translateX="182"
|
||||
android:translateY="120">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_3_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bdc1c6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M182 -98 C182,-98 182,98 182,98 C182,110.14 172.14,120 160,120 C160,120 -160,120 -160,120 C-172.14,120 -182,110.14 -182,98 C-182,98 -182,-98 -182,-98 C-182,-110.14 -172.14,-120 -160,-120 C-160,-120 160,-120 160,-120 C172.14,-120 182,-110.14 182,-98c " />
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="_R_G_L_0_G_L_2_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_2_G_L_2_G"
|
||||
android:translateX="206"
|
||||
android:translateY="145">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_2_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#e8eaed"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -95.63 C206,-95.63 206,42.37 206,42.37 C206,43.47 205.1,44.37 204,44.37 C204,44.37 -204,44.37 -204,44.37 C-205.1,44.37 -206,43.47 -206,42.37 C-206,42.37 -206,-95.63 -206,-95.63 C-206,-96.73 -205.1,-97.63 -204,-97.63 C-204,-97.63 204,-97.63 204,-97.63 C205.1,-97.63 206,-96.73 206,-95.63c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_2_G_L_1_G"
|
||||
android:translateX="206"
|
||||
android:translateY="145">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_2_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#80868b"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M109 -14 C109,-14 109,14 109,14 C109,15.1 108.1,16 107,16 C107,16 -107,16 -107,16 C-108.1,16 -109,15.1 -109,14 C-109,14 -109,-14 -109,-14 C-109,-15.1 -108.1,-16 -107,-16 C-107,-16 107,-16 107,-16 C108.1,-16 109,-15.1 109,-14c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_2_G_L_0_G"
|
||||
android:translateX="46"
|
||||
android:translateY="145">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_2_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#80868b"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M22 -14 C22,-14 22,14 22,14 C22,18.42 18.42,22 14,22 C14,22 -14,22 -14,22 C-18.42,22 -22,18.42 -22,14 C-22,14 -22,-14 -22,-14 C-22,-18.42 -18.42,-22 -14,-22 C-14,-22 14,-22 14,-22 C18.42,-22 22,-18.42 22,-14c " />
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="_R_G_L_0_G_L_1_G">
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_1_G_L_2_G"
|
||||
android:translateX="206"
|
||||
android:translateY="51">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_1_G_L_2_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#6e7175"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -0.27 C206,-0.27 206,49.73 206,49.73 C206,49.73 -206,49.73 -206,49.73 C-206,49.73 -206,-0.27 -206,-0.27 C-206,-0.27 206,-0.27 206,-0.27c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_1_G_L_1_G"
|
||||
android:translateX="206"
|
||||
android:translateY="50.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_1_G_L_1_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#6e7175"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206 -32.5 C206,-32.5 206,32.5 206,32.5 C206,42.43 197.93,50.5 188,50.5 C188,50.5 -188,50.5 -188,50.5 C-197.93,50.5 -206,42.43 -206,32.5 C-206,32.5 -206,-32.5 -206,-32.5 C-206,-42.43 -197.93,-50.5 -188,-50.5 C-188,-50.5 188,-50.5 188,-50.5 C197.93,-50.5 206,-42.43 206,-32.5c " />
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_1_G_L_0_G"
|
||||
android:translateX="206"
|
||||
android:translateY="66.5">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_1_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#9a9a9a"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M190 0 C190,0 190,0 190,0 C190,10.21 181.71,18.5 171.5,18.5 C171.5,18.5 -171.5,18.5 -171.5,18.5 C-181.71,18.5 -190,10.21 -190,0 C-190,0 -190,0 -190,0 C-190,-10.21 -181.71,-18.5 -171.5,-18.5 C-171.5,-18.5 171.5,-18.5 171.5,-18.5 C181.71,-18.5 190,-10.21 190,0c " />
|
||||
</group>
|
||||
</group>
|
||||
<group
|
||||
android:name="_R_G_L_0_G_L_0_G"
|
||||
android:scaleY="0"
|
||||
android:translateX="206"
|
||||
android:translateY="446">
|
||||
<path
|
||||
android:name="_R_G_L_0_G_L_0_G_D_0_P_0"
|
||||
android:fillAlpha="1"
|
||||
android:fillColor="#bac4d6"
|
||||
android:fillType="nonZero"
|
||||
android:pathData=" M206.06 -430.06 C206.06,-430.06 206,431 206,431 C206,446 189.75,446 189.79,446 C189.79,446 -189.98,446 -189.98,446 C-189.94,446 -206,446 -206,431 C-206,431 -206,-430 -206,-430 C-206,-446 -189.97,-446 -190.01,-446 C-190.01,-446 188.98,-446.06 188.98,-446.06 C188.94,-446.06 206,-446 206.06,-430.06c " />
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<group android:name="time_group" />
|
||||
</vector>
|
||||
</aapt:attr>
|
||||
</animated-vector>
|
||||
@@ -1,4 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2021 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.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
android:scaleY="0.98"
|
||||
android:visibility="invisible" />
|
||||
|
||||
<View
|
||||
<FrameLayout
|
||||
android:id="@+id/gesture_tutorial_fake_task_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@@ -62,7 +62,7 @@
|
||||
android:background="@drawable/gesture_tutorial_ripple"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/gesture_tutorial_feedback_video"
|
||||
android:id="@+id/gesture_tutorial_edge_gesture_video"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentTop="true"
|
||||
@@ -73,14 +73,12 @@
|
||||
android:visibility="gone"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/gesture_tutorial_gesture_video"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:scaleType="fitXY"
|
||||
android:id="@+id/gesture_tutorial_finger_dot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/gesture_tutorial_finger_dot"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2021 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.constraintlayout.widget.ConstraintLayout
|
||||
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">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/top_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="101dp"
|
||||
android:background="@color/mock_conversation_top_bar"
|
||||
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="43dp"
|
||||
android:layout_marginBottom="22dp"
|
||||
android:layout_marginStart="34dp"
|
||||
android:layout_marginEnd="211dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_top_bar_item"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="43dp"
|
||||
android:layout_marginBottom="22dp"
|
||||
android:layout_marginStart="300dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_top_bar_item"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/top_bar_button"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/top_bar_button"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="43dp"
|
||||
android:layout_marginBottom="22dp"
|
||||
android:layout_marginStart="300dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_top_bar_item"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:background="@color/mock_conversation_background"
|
||||
android:paddingBottom="66dp"
|
||||
|
||||
app:layout_constraintTop_toBottomOf="@id/top_bar"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:paddingBottom="36dp"
|
||||
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/message_bar"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/message_1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="112dp"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:layout_marginStart="124dp"
|
||||
android:layout_marginEnd="18dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="18dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_sent_message"
|
||||
app:layout_constraintBottom_toTopOf="@id/reply_icon_1"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/reply_icon_1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:layout_marginStart="26dp"
|
||||
android:layout_marginEnd="342dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_profile_icon"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintBottom_toTopOf="@id/message_2"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginStart="17dp"
|
||||
android:layout_marginEnd="112dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="18dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_received_message"
|
||||
app:layout_constraintTop_toTopOf="@id/reply_icon_1"
|
||||
app:layout_constraintBottom_toBottomOf="@id/reply_icon_1"
|
||||
app:layout_constraintStart_toEndOf="@id/reply_icon_1"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/message_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginStart="280dp"
|
||||
android:layout_marginEnd="18dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="18dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_sent_message"
|
||||
app:layout_constraintBottom_toTopOf="@id/message_3"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/message_3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="74dp"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:layout_marginStart="124dp"
|
||||
android:layout_marginEnd="18dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="18dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_sent_message"
|
||||
app:layout_constraintBottom_toTopOf="@id/reply_icon_2"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/reply_icon_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:layout_marginStart="26dp"
|
||||
android:layout_marginEnd="342dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_profile_icon"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintBottom_toTopOf="@id/message_4"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginStart="17dp"
|
||||
android:layout_marginEnd="144dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="18dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_received_message"
|
||||
app:layout_constraintTop_toTopOf="@id/reply_icon_2"
|
||||
app:layout_constraintBottom_toBottomOf="@id/reply_icon_2"
|
||||
app:layout_constraintStart_toEndOf="@id/reply_icon_2"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/message_4"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="74dp"
|
||||
android:layout_marginStart="124dp"
|
||||
android:layout_marginEnd="18dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="18dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_sent_message"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/message_bar"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="44dp"
|
||||
android:layout_marginTop="36dp"
|
||||
android:layout_marginStart="34dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="164dp"
|
||||
app:cardBackgroundColor="@color/mock_conversation_message_input"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -0,0 +1,394 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2021 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.constraintlayout.widget.ConstraintLayout
|
||||
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">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/top_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="101dp"
|
||||
android:background="@color/mock_list_top_bar"
|
||||
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="43dp"
|
||||
android:layout_marginBottom="22dp"
|
||||
android:layout_marginStart="34dp"
|
||||
android:layout_marginEnd="35dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_top_bar_item"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:background="@color/mock_list_background"
|
||||
android:paddingBottom="66dp"
|
||||
|
||||
app:layout_constraintTop_toBottomOf="@id/top_bar"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:paddingTop="28dp"
|
||||
android:paddingStart="26dp"
|
||||
android:paddingBottom="14dp"
|
||||
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/mock_button">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_icon_1"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_list_profile_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="217dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="@id/conversation_icon_1"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_1"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/conversation_line_2"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="142dp"
|
||||
android:layout_marginTop="4dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_line_1"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_1"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/conversation_icon_1"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_icon_2"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginTop="32dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_list_profile_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_icon_1"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="190dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="@id/conversation_icon_2"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_2"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/conversation_line_4"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_4"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="171dp"
|
||||
android:layout_marginTop="4dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_line_3"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_2"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/conversation_icon_2"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_icon_3"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginTop="32dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_list_profile_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_icon_2"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_5"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="198dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="@id/conversation_icon_3"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_3"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/conversation_line_6"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_6"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="79dp"
|
||||
android:layout_marginTop="4dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_line_5"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_3"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/conversation_icon_3"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_icon_4"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginTop="32dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_list_profile_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_icon_3"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_7"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="174dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="@id/conversation_icon_4"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_4"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/conversation_line_8"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_8"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="117dp"
|
||||
android:layout_marginTop="4dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_line_7"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_4"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/conversation_icon_4"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_icon_5"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginTop="32dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_list_profile_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_icon_4"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_9"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="244dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="@id/conversation_icon_5"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_5"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/conversation_line_10"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_10"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="143dp"
|
||||
android:layout_marginTop="4dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_line_9"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_5"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/conversation_icon_5"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_icon_6"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginTop="32dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_list_profile_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_icon_5"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_11"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="177dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="@id/conversation_icon_6"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_6"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/conversation_line_12"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_12"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="117dp"
|
||||
android:layout_marginTop="4dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_line_11"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_6"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/conversation_icon_6"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_icon_7"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginTop="32dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_list_profile_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_icon_6"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_13"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="189dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintTop_toTopOf="@id/conversation_icon_7"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_7"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/conversation_line_14"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/conversation_line_14"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="166dp"
|
||||
android:layout_marginTop="4dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_list_preview_message"
|
||||
app:layout_constraintTop_toBottomOf="@id/conversation_line_13"
|
||||
app:layout_constraintStart_toEndOf="@id/conversation_icon_7"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/conversation_icon_7"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_button"
|
||||
android:layout_width="149dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="164dp"
|
||||
app:cardBackgroundColor="@color/mock_list_button"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -0,0 +1,274 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2021 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.constraintlayout.widget.ConstraintLayout
|
||||
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">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/url_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="101dp"
|
||||
android:background="@color/mock_webpage_url_bar"
|
||||
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="48dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="100dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_url_bar_item"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/top_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="88dp"
|
||||
android:background="@color/mock_webpage_top_bar"
|
||||
|
||||
app:layout_constraintTop_toBottomOf="@id/url_bar"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/top_bar_button"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="22dp"
|
||||
android:layout_marginBottom="22dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginEnd="344dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_top_bar_item"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="28dp"
|
||||
android:layout_marginBottom="28dp"
|
||||
android:layout_marginStart="97dp"
|
||||
android:layout_marginEnd="97dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="2dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_top_bar_item"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:background="@color/mock_webpage_background"
|
||||
android:paddingTop="32dp"
|
||||
android:paddingStart="24dp"
|
||||
android:paddingBottom="50dp"
|
||||
|
||||
app:layout_constraintTop_toBottomOf="@id/top_bar"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginEnd="126dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="64dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_1"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="151dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_2"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_button"
|
||||
android:layout_width="47dp"
|
||||
android:layout_height="12dp"
|
||||
android:layout_marginTop="8dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_3"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="47dp"
|
||||
android:layout_height="12dp"
|
||||
android:background="@color/mock_webpage_page_text"
|
||||
android:layout_marginStart="11dp"
|
||||
android:layout_marginTop="8dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_3"
|
||||
app:layout_constraintStart_toEndOf="@id/mock_button"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_block"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="240dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="22dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_button"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_4"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="22dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:layout_marginEnd="52dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_block"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_5"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="22dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="41dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_4"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_6"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="22dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="71dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_7"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="22dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="198dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_6"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/mock_line_8"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="22dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:layout_marginEnd="64dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_7"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="22dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="71dp"
|
||||
|
||||
app:cardElevation="0dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="@color/mock_webpage_page_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/mock_line_8"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -17,6 +17,7 @@
|
||||
<com.android.launcher3.taskbar.TaskbarEduView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:launcher="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
@@ -33,46 +34,121 @@
|
||||
android:paddingHorizontal="36dp"
|
||||
android:paddingTop="64dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/edu_header"
|
||||
<com.android.launcher3.taskbar.TaskbarEduPagedView
|
||||
android:id="@+id/content"
|
||||
android:clipToPadding="false"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:layout_height="378dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:gravity="center_horizontal"
|
||||
style="@style/TextHeadline"
|
||||
android:text="@string/taskbar_edu_header_1"
|
||||
android:fontFamily="google-sans"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="24sp"
|
||||
android:maxLines="2"/>
|
||||
launcher:pageIndicator="@+id/content_page_indicator">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/edu_illustration"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/edu_header"
|
||||
android:src="@drawable/taskbar_edu_splitscreen"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/page_splitscreen"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:gravity="center_horizontal"
|
||||
style="@style/TextHeadline"
|
||||
android:text="@string/taskbar_edu_splitscreen"
|
||||
android:fontFamily="google-sans"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="24sp"
|
||||
android:maxLines="2"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="322dp"
|
||||
android:layout_height="282dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@drawable/taskbar_edu_splitscreen"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/page_customize"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:gravity="center_horizontal"
|
||||
style="@style/TextHeadline"
|
||||
android:text="@string/taskbar_edu_customize"
|
||||
android:fontFamily="google-sans"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="24sp"
|
||||
android:maxLines="2"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="322dp"
|
||||
android:layout_height="282dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@drawable/taskbar_edu_splitscreen"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/page_dock"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:gravity="center_horizontal"
|
||||
style="@style/TextHeadline"
|
||||
android:text="@string/taskbar_edu_dock"
|
||||
android:fontFamily="google-sans"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="24sp"
|
||||
android:maxLines="2"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="322dp"
|
||||
android:layout_height="282dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@drawable/taskbar_edu_splitscreen"/>
|
||||
</LinearLayout>
|
||||
</com.android.launcher3.taskbar.TaskbarEduPagedView>
|
||||
|
||||
<Button
|
||||
android:id="@+id/edu_close_button"
|
||||
android:id="@+id/edu_start_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginBottom="92dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/edu_illustration"
|
||||
app:layout_constraintTop_toBottomOf="@id/content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:text="@string/taskbar_edu_close"
|
||||
style="@style/TaskbarEdu.Button.Close"
|
||||
android:textColor="?android:attr/textColorPrimary"/>
|
||||
|
||||
<com.android.launcher3.pageindicators.PageIndicatorDots
|
||||
android:id="@+id/content_page_indicator"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="@id/edu_start_button"
|
||||
app:layout_constraintBottom_toBottomOf="@id/edu_start_button"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:elevation="1dp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/edu_next_button"
|
||||
android:id="@+id/edu_end_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginBottom="92dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/edu_illustration"
|
||||
app:layout_constraintTop_toBottomOf="@id/content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:text="@string/taskbar_edu_next"
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2021 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>
|
||||
|
||||
<color name="gesture_tutorial_back_arrow_color">#99000000</color>
|
||||
|
||||
<color name="gesture_tutorial_fake_wallpaper_color">#000000</color> <!-- Black -->
|
||||
|
||||
<color name="mock_webpage_url_bar">#202124</color>
|
||||
<color name="mock_webpage_url_bar_item">#3c4043</color>
|
||||
|
||||
</resources>
|
||||
@@ -14,8 +14,6 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
<resources>
|
||||
<color name="back_arrow_color_light">#FFFFFFFF</color>
|
||||
<color name="back_arrow_color_dark">#99000000</color>
|
||||
|
||||
<color name="chip_hint_foreground_color">#fff</color>
|
||||
<color name="chip_scrim_start_color">#39000000</color>
|
||||
@@ -31,4 +29,40 @@
|
||||
|
||||
<color name="taskbar_stashed_handle_light_color">#EBffffff</color>
|
||||
<color name="taskbar_stashed_handle_dark_color">#99000000</color>
|
||||
|
||||
<!-- Gesture navigation tutorial -->
|
||||
<color name="gesture_tutorial_back_arrow_color">#FFFFFFFF</color>
|
||||
|
||||
<color name="gesture_tutorial_fake_wallpaper_color">#f9f9f9</color> <!-- White -->
|
||||
<color name="gesture_tutorial_ripple_color">#A0C2F9</color> <!-- Light Blue -->
|
||||
<color name="gesture_tutorial_fake_task_view_color">#6DA1FF</color> <!-- Light Blue -->
|
||||
<!-- Must contrast gesture_tutorial_fake_wallpaper_color -->
|
||||
<color name="gesture_tutorial_fake_previous_task_view_color">#3C4043</color> <!-- Gray -->
|
||||
<color name="gesture_tutorial_action_button_label_color">#FF000000</color>
|
||||
<color name="gesture_tutorial_primary_color">#B7F29F</color> <!-- Light Green -->
|
||||
|
||||
<!-- Mock conversation -->
|
||||
<color name="mock_conversation_background">#f1f3f4</color>
|
||||
<color name="mock_conversation_top_bar">#e8eaed</color>
|
||||
<color name="mock_conversation_top_bar_item">#dadce0</color>
|
||||
<color name="mock_conversation_sent_message">#bdc1c6</color>
|
||||
<color name="mock_conversation_received_message">#e8eaed</color>
|
||||
<color name="mock_conversation_message_input">#dadce0</color>
|
||||
<color name="mock_conversation_profile_icon">#dadce0</color>
|
||||
|
||||
<!-- Mock conversations list -->
|
||||
<color name="mock_list_background">#dadce0</color>
|
||||
<color name="mock_list_top_bar">#e8eaed</color>
|
||||
<color name="mock_list_top_bar_item">#f8f9fa</color>
|
||||
<color name="mock_list_profile_icon">#9aa0a6</color>
|
||||
<color name="mock_list_preview_message">#bdc1c6</color>
|
||||
<color name="mock_list_button">#bdc1c6</color>
|
||||
|
||||
<!-- Mock web page -->
|
||||
<color name="mock_webpage_background">#f1f3f4</color>
|
||||
<color name="mock_webpage_url_bar">#6e7175</color>
|
||||
<color name="mock_webpage_url_bar_item">#9a9a9a</color>
|
||||
<color name="mock_webpage_top_bar">#e8eaed</color>
|
||||
<color name="mock_webpage_top_bar_item">#80868b</color>
|
||||
<color name="mock_webpage_page_text">#bdc1c6</color>
|
||||
</resources>
|
||||
@@ -205,11 +205,25 @@
|
||||
<string name="gesture_tutorial_action_button_label_skip">Skip</string>
|
||||
|
||||
<!-- ******* Taskbar Edu ******* -->
|
||||
<!-- Text in dialog that lets a user know how they can use the taskbar on their device.
|
||||
[CHAR_LIMIT=NONE] -->
|
||||
<string name="taskbar_edu_header_1">Use 2 apps at once and switch apps with the taskbar</string>
|
||||
<!-- Text on button to go to the next screen of a tutorial [CHAR_LIMIT=30] -->
|
||||
<!-- Accessibility text spoken when the taskbar education panel appears [CHAR_LIMIT=NONE] -->
|
||||
<string name="taskbar_edu_opened">Taskbar education appeared</string>
|
||||
<!-- Accessibility text spoken when the taskbar education panel disappears [CHAR_LIMIT=NONE] -->
|
||||
<string name="taskbar_edu_closed">Taskbar education closed</string>
|
||||
<!-- Text in dialog that lets a user know how they can use the taskbar to use multiple apps on their device.
|
||||
[CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_splitscreen" translatable="false">Use 2 apps at once and switch apps with the taskbar</string>
|
||||
<!-- Text in dialog that lets a user know how they can customize the taskbar on their device.
|
||||
[CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_customize" translatable="false">Add your favorite apps and get automatic suggestions</string>
|
||||
<!-- Text in dialog that lets a user know how they can hide the taskbar on their device.
|
||||
[CHAR_LIMIT=60] -->
|
||||
<string name="taskbar_edu_dock">Touch & hold to hide the taskbar anytime</string>
|
||||
<!-- Text on button to go to the next screen of a tutorial [CHAR_LIMIT=16] -->
|
||||
<string name="taskbar_edu_next">Next</string>
|
||||
<!-- Text on button to exit a tutorial [CHAR_LIMIT=30] -->
|
||||
<!-- Text on button to go to the previous screen of a tutorial [CHAR_LIMIT=16] -->
|
||||
<string name="taskbar_edu_previous">Back</string>
|
||||
<!-- Text on button to exit a tutorial [CHAR_LIMIT=16] -->
|
||||
<string name="taskbar_edu_close">Close</string>
|
||||
<!-- Text on button to finish a tutorial [CHAR_LIMIT=16] -->
|
||||
<string name="taskbar_edu_done">Done</string>
|
||||
</resources>
|
||||
|
||||
@@ -144,11 +144,13 @@
|
||||
<item name="android:background">@drawable/button_taskbar_edu_bordered</item>
|
||||
<item name="android:stateListAnimator">@null</item>
|
||||
<item name="android:textSize">16sp</item>
|
||||
<item name="android:padding">4dp</item>
|
||||
</style>
|
||||
|
||||
<style name="TaskbarEdu.Button.Next" parent="@android:style/Widget.Material.Button">
|
||||
<item name="android:background">@drawable/button_taskbar_edu_colored</item>
|
||||
<item name="android:stateListAnimator">@null</item>
|
||||
<item name="android:textSize">16sp</item>
|
||||
<item name="android:padding">4dp</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -36,12 +36,14 @@ import android.view.ContextThemeWrapper;
|
||||
import android.view.Display;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.RoundedCorner;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.AbstractFloatingView;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
@@ -83,6 +85,7 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ
|
||||
private final TaskbarControllers mControllers;
|
||||
|
||||
private final WindowManager mWindowManager;
|
||||
private final @Nullable RoundedCorner mLeftCorner, mRightCorner;
|
||||
private WindowManager.LayoutParams mWindowLayoutParams;
|
||||
private boolean mIsFullscreen;
|
||||
// The size we should return to when we call setTaskbarWindowFullscreen(false)
|
||||
@@ -136,10 +139,12 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ
|
||||
? windowContext.getApplicationContext()
|
||||
: windowContext.getApplicationContext().createDisplayContext(display);
|
||||
mWindowManager = c.getSystemService(WindowManager.class);
|
||||
mLeftCorner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT);
|
||||
mRightCorner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_RIGHT);
|
||||
}
|
||||
|
||||
public void init() {
|
||||
mLastRequestedNonFullscreenHeight = mDeviceProfile.taskbarSize;
|
||||
mLastRequestedNonFullscreenHeight = getDefaultTaskbarWindowHeight();
|
||||
mWindowLayoutParams = new WindowManager.LayoutParams(
|
||||
MATCH_PARENT,
|
||||
mLastRequestedNonFullscreenHeight,
|
||||
@@ -169,6 +174,14 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ
|
||||
return mNavMode == Mode.THREE_BUTTONS;
|
||||
}
|
||||
|
||||
public int getLeftCornerRadius() {
|
||||
return mLeftCorner == null ? 0 : mLeftCorner.getRadius();
|
||||
}
|
||||
|
||||
public int getRightCornerRadius() {
|
||||
return mRightCorner == null ? 0 : mRightCorner.getRadius();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LayoutInflater getLayoutInflater() {
|
||||
return mLayoutInflater;
|
||||
@@ -249,8 +262,12 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ
|
||||
setTaskbarWindowHeight(fullscreen ? MATCH_PARENT : mLastRequestedNonFullscreenHeight);
|
||||
}
|
||||
|
||||
public boolean isTaskbarWindowFullscreen() {
|
||||
return mIsFullscreen;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the TaskbarContainer height (pass deviceProfile.taskbarSize to reset).
|
||||
* Updates the TaskbarContainer height (pass {@link #getDefaultTaskbarWindowHeight()} to reset).
|
||||
*/
|
||||
public void setTaskbarWindowHeight(int height) {
|
||||
if (mWindowLayoutParams.height == height || mIsDestroyed) {
|
||||
@@ -270,6 +287,13 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ
|
||||
mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default height of the window, including the static corner radii above taskbar.
|
||||
*/
|
||||
public int getDefaultTaskbarWindowHeight() {
|
||||
return mDeviceProfile.taskbarSize + Math.max(getLeftCornerRadius(), getRightCornerRadius());
|
||||
}
|
||||
|
||||
protected void onTaskbarIconClicked(View view) {
|
||||
Object tag = view.getTag();
|
||||
if (tag instanceof Task) {
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.launcher3.taskbar;
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
@@ -40,9 +41,12 @@ import com.android.systemui.shared.system.ViewTreeObserverWrapper.OnComputeInset
|
||||
public class TaskbarDragLayer extends BaseDragLayer<TaskbarActivityContext> {
|
||||
|
||||
private final Paint mTaskbarBackgroundPaint;
|
||||
private final Path mInvertedLeftCornerPath, mInvertedRightCornerPath;
|
||||
private final OnComputeInsetsListener mTaskbarInsetsComputer = this::onComputeTaskbarInsets;
|
||||
|
||||
// Initialized in init.
|
||||
private TaskbarDragLayerController.TaskbarDragLayerCallbacks mControllerCallbacks;
|
||||
private float mLeftCornerRadius, mRightCornerRadius;
|
||||
|
||||
private float mTaskbarBackgroundOffset;
|
||||
|
||||
@@ -65,10 +69,32 @@ public class TaskbarDragLayer extends BaseDragLayer<TaskbarActivityContext> {
|
||||
mTaskbarBackgroundPaint = new Paint();
|
||||
mTaskbarBackgroundPaint.setColor(getResources().getColor(R.color.taskbar_background));
|
||||
mTaskbarBackgroundPaint.setAlpha(0);
|
||||
mTaskbarBackgroundPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
|
||||
mTaskbarBackgroundPaint.setStyle(Paint.Style.FILL);
|
||||
|
||||
// Will be set in init(), but this ensures they are always non-null.
|
||||
mInvertedLeftCornerPath = new Path();
|
||||
mInvertedRightCornerPath = new Path();
|
||||
}
|
||||
|
||||
public void init(TaskbarDragLayerController.TaskbarDragLayerCallbacks callbacks) {
|
||||
mControllerCallbacks = callbacks;
|
||||
|
||||
// Create the paths for the inverted rounded corners above the taskbar. Start with a filled
|
||||
// square, and then subtracting out a circle from the appropriate corner.
|
||||
mLeftCornerRadius = mActivity.getLeftCornerRadius();
|
||||
mRightCornerRadius = mActivity.getRightCornerRadius();
|
||||
Path square = new Path();
|
||||
square.addRect(0, 0, mLeftCornerRadius, mLeftCornerRadius, Path.Direction.CW);
|
||||
Path circle = new Path();
|
||||
circle.addCircle(mLeftCornerRadius, 0, mLeftCornerRadius, Path.Direction.CW);
|
||||
mInvertedLeftCornerPath.op(square, circle, Path.Op.DIFFERENCE);
|
||||
square.reset();
|
||||
square.addRect(0, 0, mRightCornerRadius, mRightCornerRadius, Path.Direction.CW);
|
||||
circle.reset();
|
||||
circle.addCircle(0, 0, mRightCornerRadius, Path.Direction.CW);
|
||||
mInvertedRightCornerPath.op(square, circle, Path.Op.DIFFERENCE);
|
||||
|
||||
recreateControllers();
|
||||
}
|
||||
|
||||
@@ -121,8 +147,20 @@ public class TaskbarDragLayer extends BaseDragLayer<TaskbarActivityContext> {
|
||||
protected void dispatchDraw(Canvas canvas) {
|
||||
float backgroundHeight = mControllerCallbacks.getTaskbarBackgroundHeight()
|
||||
* (1f - mTaskbarBackgroundOffset);
|
||||
canvas.drawRect(0, canvas.getHeight() - backgroundHeight, canvas.getWidth(),
|
||||
canvas.getHeight(), mTaskbarBackgroundPaint);
|
||||
canvas.save();
|
||||
canvas.translate(0, canvas.getHeight() - backgroundHeight);
|
||||
|
||||
// Draw the background behind taskbar content.
|
||||
canvas.drawRect(0, 0, canvas.getWidth(), backgroundHeight, mTaskbarBackgroundPaint);
|
||||
|
||||
// Draw the inverted rounded corners above the taskbar.
|
||||
canvas.translate(0, -mLeftCornerRadius);
|
||||
canvas.drawPath(mInvertedLeftCornerPath, mTaskbarBackgroundPaint);
|
||||
canvas.translate(0, mLeftCornerRadius);
|
||||
canvas.translate(canvas.getWidth() - mRightCornerRadius, -mRightCornerRadius);
|
||||
canvas.drawPath(mInvertedRightCornerPath, mTaskbarBackgroundPaint);
|
||||
|
||||
canvas.restore();
|
||||
super.dispatchDraw(canvas);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.android.launcher3.taskbar;
|
||||
|
||||
import static com.android.launcher3.AbstractFloatingView.TYPE_ALL;
|
||||
import static com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo.TOUCHABLE_INSETS_CONTENT;
|
||||
import static com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo.TOUCHABLE_INSETS_FRAME;
|
||||
import static com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo.TOUCHABLE_INSETS_REGION;
|
||||
|
||||
@@ -132,13 +133,14 @@ public class TaskbarDragLayerController {
|
||||
// Let touches pass through us.
|
||||
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION);
|
||||
} else if (mControllers.navbarButtonsViewController.isImeVisible()) {
|
||||
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_FRAME);
|
||||
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_CONTENT);
|
||||
} else if (!mControllers.uiController.isTaskbarTouchable()) {
|
||||
// Let touches pass through us.
|
||||
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION);
|
||||
} else if (mControllers.taskbarViewController.areIconsVisible()) {
|
||||
// Buttons are visible, take over the full taskbar area
|
||||
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_FRAME);
|
||||
insetsInfo.setTouchableInsets(mActivity.isTaskbarWindowFullscreen()
|
||||
? TOUCHABLE_INSETS_FRAME : TOUCHABLE_INSETS_CONTENT);
|
||||
} else {
|
||||
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION);
|
||||
}
|
||||
|
||||
@@ -32,9 +32,8 @@ public class TaskbarEduController {
|
||||
mActivity.getDragLayer().post(() -> {
|
||||
mTaskbarEduView = (TaskbarEduView) mActivity.getLayoutInflater().inflate(
|
||||
R.layout.taskbar_edu, mActivity.getDragLayer(), false);
|
||||
mTaskbarEduView.addOnCloseListener(() -> {
|
||||
mTaskbarEduView = null;
|
||||
});
|
||||
mTaskbarEduView.init(new TaskbarEduCallbacks());
|
||||
mTaskbarEduView.addOnCloseListener(() -> mTaskbarEduView = null);
|
||||
mTaskbarEduView.show();
|
||||
});
|
||||
}
|
||||
@@ -44,4 +43,27 @@ public class TaskbarEduController {
|
||||
mTaskbarEduView.close(true /* animate */);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Callbacks for {@link TaskbarEduView} to interact with its controller.
|
||||
*/
|
||||
class TaskbarEduCallbacks {
|
||||
void onPageChanged(int currentPage, int pageCount) {
|
||||
if (currentPage == 0) {
|
||||
mTaskbarEduView.updateStartButton(R.string.taskbar_edu_close,
|
||||
v -> mTaskbarEduView.close(true /* animate */));
|
||||
} else {
|
||||
mTaskbarEduView.updateStartButton(R.string.taskbar_edu_previous,
|
||||
v -> mTaskbarEduView.snapToPage(currentPage - 1));
|
||||
}
|
||||
if (currentPage == pageCount - 1) {
|
||||
mTaskbarEduView.updateEndButton(R.string.taskbar_edu_done,
|
||||
v -> mTaskbarEduView.close(true /* animate */));
|
||||
} else {
|
||||
mTaskbarEduView.updateEndButton(R.string.taskbar_edu_next,
|
||||
v -> mTaskbarEduView.snapToPage(currentPage + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.launcher3.taskbar;
|
||||
|
||||
import static com.android.launcher3.AbstractFloatingView.TYPE_ALL;
|
||||
import static com.android.launcher3.AbstractFloatingView.TYPE_TASKBAR_EDUCATION_DIALOG;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import com.android.launcher3.AbstractFloatingView;
|
||||
import com.android.launcher3.PagedView;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.pageindicators.PageIndicatorDots;
|
||||
import com.android.launcher3.taskbar.TaskbarEduController.TaskbarEduCallbacks;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
/** Horizontal carousel of tutorial screens for Taskbar Edu. */
|
||||
public class TaskbarEduPagedView extends PagedView<PageIndicatorDots> {
|
||||
|
||||
private TaskbarEduView mTaskbarEduView;
|
||||
private TaskbarEduCallbacks mControllerCallbacks;
|
||||
|
||||
public TaskbarEduPagedView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
|
||||
}
|
||||
|
||||
void setTaskbarEduView(TaskbarEduView taskbarEduView) {
|
||||
mTaskbarEduView = taskbarEduView;
|
||||
mPageIndicator = taskbarEduView.findViewById(R.id.content_page_indicator);
|
||||
initParentViews(taskbarEduView);
|
||||
}
|
||||
|
||||
void setControllerCallbacks(TaskbarEduCallbacks controllerCallbacks) {
|
||||
mControllerCallbacks = controllerCallbacks;
|
||||
mControllerCallbacks.onPageChanged(getCurrentPage(), getPageCount());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getChildGap() {
|
||||
return mTaskbarEduView.getPaddingLeft() + mTaskbarEduView.getPaddingRight();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
|
||||
super.onScrollChanged(l, t, oldl, oldt);
|
||||
if (mMaxScroll > 0) {
|
||||
mPageIndicator.setScroll(l, mMaxScroll);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void notifyPageSwitchListener(int prevPage) {
|
||||
super.notifyPageSwitchListener(prevPage);
|
||||
mControllerCallbacks.onPageChanged(getCurrentPage(), getPageCount());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canScroll(float absVScroll, float absHScroll) {
|
||||
return AbstractFloatingView.getTopOpenViewWithType(
|
||||
ActivityContext.lookupContext(getContext()),
|
||||
TYPE_ALL & ~TYPE_TASKBAR_EDUCATION_DIALOG) == null;
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,9 @@ import android.animation.PropertyValuesHolder;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Pair;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import com.android.launcher3.Insettable;
|
||||
import com.android.launcher3.R;
|
||||
@@ -34,6 +37,10 @@ public class TaskbarEduView extends AbstractSlideInView<TaskbarActivityContext>
|
||||
|
||||
private final Rect mInsets = new Rect();
|
||||
|
||||
private Button mStartButton;
|
||||
private Button mEndButton;
|
||||
private TaskbarEduPagedView mPagedView;
|
||||
|
||||
public TaskbarEduView(Context context, AttributeSet attr) {
|
||||
this(context, attr, 0);
|
||||
}
|
||||
@@ -43,6 +50,12 @@ public class TaskbarEduView extends AbstractSlideInView<TaskbarActivityContext>
|
||||
super(context, attrs, defStyleAttr);
|
||||
}
|
||||
|
||||
protected void init(TaskbarEduController.TaskbarEduCallbacks callbacks) {
|
||||
if (mPagedView != null) {
|
||||
mPagedView.setControllerCallbacks(callbacks);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleClose(boolean animate) {
|
||||
handleClose(animate, DEFAULT_CLOSE_DURATION);
|
||||
@@ -57,7 +70,10 @@ public class TaskbarEduView extends AbstractSlideInView<TaskbarActivityContext>
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
mContent = findViewById(R.id.edu_view);
|
||||
findViewById(R.id.edu_close_button).setOnClickListener(v -> close(true /* animate */));
|
||||
mStartButton = findViewById(R.id.edu_start_button);
|
||||
mEndButton = findViewById(R.id.edu_end_button);
|
||||
mPagedView = findViewById(R.id.content);
|
||||
mPagedView.setTaskbarEduView(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -81,6 +97,12 @@ public class TaskbarEduView extends AbstractSlideInView<TaskbarActivityContext>
|
||||
animateOpen();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Pair<View, String> getAccessibilityTarget() {
|
||||
return Pair.create(mContent, mIsOpen ? getContext().getString(R.string.taskbar_edu_opened)
|
||||
: getContext().getString(R.string.taskbar_edu_closed));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getScrimColor(Context context) {
|
||||
return context.getResources().getColor(R.color.widgets_picker_scrim);
|
||||
@@ -110,4 +132,18 @@ public class TaskbarEduView extends AbstractSlideInView<TaskbarActivityContext>
|
||||
mOpenCloseAnimator.setInterpolator(FAST_OUT_SLOW_IN);
|
||||
mOpenCloseAnimator.start();
|
||||
}
|
||||
|
||||
void snapToPage(int page) {
|
||||
mPagedView.snapToPage(page);
|
||||
}
|
||||
|
||||
void updateStartButton(int textResId, OnClickListener onClickListener) {
|
||||
mStartButton.setText(textResId);
|
||||
mStartButton.setOnClickListener(onClickListener);
|
||||
}
|
||||
|
||||
void updateEndButton(int textResId, OnClickListener onClickListener) {
|
||||
mEndButton.setText(textResId);
|
||||
mEndButton.setOnClickListener(onClickListener);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,8 +165,9 @@ public class TaskbarViewController {
|
||||
int offsetY = launcherDp.getTaskbarOffsetY();
|
||||
setter.setFloat(mTaskbarIconTranslationYForHome, VALUE, -offsetY, LINEAR);
|
||||
|
||||
int collapsedHeight = mActivity.getDeviceProfile().taskbarSize;
|
||||
int expandedHeight = collapsedHeight + offsetY;
|
||||
int collapsedHeight = mActivity.getDefaultTaskbarWindowHeight();
|
||||
int expandedHeight = Math.max(collapsedHeight,
|
||||
mActivity.getDeviceProfile().taskbarSize + offsetY);
|
||||
setter.addOnFrameListener(anim -> mActivity.setTaskbarWindowHeight(
|
||||
anim.getAnimatedFraction() > 0 ? expandedHeight : collapsedHeight));
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ import android.graphics.RectF;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.os.SystemClock;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnApplyWindowInsetsListener;
|
||||
@@ -87,6 +88,7 @@ import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.logging.StatsLogManager.StatsLogger;
|
||||
import com.android.launcher3.statemanager.BaseState;
|
||||
import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.tracing.InputConsumerProto;
|
||||
import com.android.launcher3.tracing.SwipeHandlerProto;
|
||||
import com.android.launcher3.util.TraceHelper;
|
||||
@@ -876,6 +878,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
||||
*/
|
||||
@UiThread
|
||||
public void onGestureEnded(float endVelocity, PointF velocity, PointF downPos) {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
Log.d(TestProtocol.L3_SWIPE_TO_HOME, "3");
|
||||
}
|
||||
float flingThreshold = mContext.getResources()
|
||||
.getDimension(R.dimen.quickstep_fling_threshold_speed);
|
||||
boolean isFling = mGestureStarted && !mIsMotionPaused
|
||||
@@ -1037,6 +1042,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
||||
@UiThread
|
||||
private void handleNormalGestureEnd(float endVelocity, boolean isFling, PointF velocity,
|
||||
boolean isCancel) {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
Log.d(TestProtocol.L3_SWIPE_TO_HOME, "4");
|
||||
}
|
||||
long duration = MAX_SWIPE_DURATION;
|
||||
float currentShift = mCurrentShift.value;
|
||||
final GestureEndTarget endTarget = calculateEndTarget(velocity, endVelocity,
|
||||
@@ -1155,6 +1163,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
||||
@UiThread
|
||||
private void animateToProgress(float start, float end, long duration, Interpolator interpolator,
|
||||
GestureEndTarget target, PointF velocityPxPerMs) {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
Log.d(TestProtocol.L3_SWIPE_TO_HOME, "5");
|
||||
}
|
||||
runOnRecentsAnimationStart(() -> animateToProgressInternal(start, end, duration,
|
||||
interpolator, target, velocityPxPerMs));
|
||||
}
|
||||
@@ -1183,6 +1194,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
||||
@UiThread
|
||||
private void animateToProgressInternal(float start, float end, long duration,
|
||||
Interpolator interpolator, GestureEndTarget target, PointF velocityPxPerMs) {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
Log.d(TestProtocol.L3_SWIPE_TO_HOME, "7");
|
||||
}
|
||||
maybeUpdateRecentsAttachedState();
|
||||
|
||||
// If we are transitioning to launcher, then listen for the activity to be restarted while
|
||||
@@ -1812,6 +1826,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
||||
* be run when it is next started.
|
||||
*/
|
||||
protected void runOnRecentsAnimationStart(Runnable action) {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
Log.d(TestProtocol.L3_SWIPE_TO_HOME, "6");
|
||||
}
|
||||
if (mRecentsAnimationTargets == null) {
|
||||
mRecentsAnimationStartCallbacks.add(action);
|
||||
} else {
|
||||
|
||||
@@ -50,6 +50,7 @@ import android.view.ViewConfiguration;
|
||||
import androidx.annotation.UiThread;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.testing.TestLogging;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.tracing.InputConsumerProto;
|
||||
@@ -356,6 +357,9 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
}
|
||||
case ACTION_CANCEL:
|
||||
case ACTION_UP: {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
Log.d(TestProtocol.L3_SWIPE_TO_HOME, "1");
|
||||
}
|
||||
if (DEBUG_FAILED_QUICKSWITCH && !mPassedWindowMoveSlop) {
|
||||
float displacementX = mLastPos.x - mDownPos.x;
|
||||
float displacementY = mLastPos.y - mDownPos.y;
|
||||
@@ -409,6 +413,9 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
* the animation can still be running.
|
||||
*/
|
||||
private void finishTouchTracking(MotionEvent ev) {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
Log.d(TestProtocol.L3_SWIPE_TO_HOME, "2");
|
||||
}
|
||||
Object traceToken = TraceHelper.INSTANCE.beginSection(UP_EVT,
|
||||
FLAG_CHECK_FOR_RACE_CONDITIONS);
|
||||
|
||||
|
||||
-1
@@ -68,7 +68,6 @@ final class AssistantGestureTutorialController extends TutorialController {
|
||||
showFeedback(R.string.assistant_gesture_feedback_swipe_too_far_from_corner);
|
||||
break;
|
||||
case ASSISTANT_COMPLETED:
|
||||
hideFeedback(true);
|
||||
showRippleEffect(null);
|
||||
showFeedback(R.string.assistant_gesture_tutorial_playground_subtitle);
|
||||
break;
|
||||
|
||||
@@ -18,10 +18,9 @@ package com.android.quickstep.interaction;
|
||||
import static com.android.quickstep.interaction.TutorialController.TutorialType.BACK_NAVIGATION;
|
||||
import static com.android.quickstep.interaction.TutorialController.TutorialType.BACK_NAVIGATION_COMPLETE;
|
||||
|
||||
import android.annotation.LayoutRes;
|
||||
import android.graphics.PointF;
|
||||
|
||||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
|
||||
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult;
|
||||
@@ -44,8 +43,18 @@ final class BackGestureTutorialController extends TutorialController {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
|
||||
return R.drawable.mock_conversation;
|
||||
protected int getMockAppTaskLayoutResId() {
|
||||
return getMockAppTaskCurrentPageLayoutResId();
|
||||
}
|
||||
|
||||
@LayoutRes
|
||||
int getMockAppTaskCurrentPageLayoutResId() {
|
||||
return R.layout.gesture_tutorial_mock_conversation;
|
||||
}
|
||||
|
||||
@LayoutRes
|
||||
int getMockAppTaskPreviousPageLayoutResId() {
|
||||
return R.layout.gesture_tutorial_mock_conversation_list;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -70,10 +79,8 @@ final class BackGestureTutorialController extends TutorialController {
|
||||
switch (result) {
|
||||
case BACK_COMPLETED_FROM_LEFT:
|
||||
case BACK_COMPLETED_FROM_RIGHT:
|
||||
mTutorialFragment.releaseGestureVideoView();
|
||||
hideFeedback(true);
|
||||
mFakeTaskView.setBackground(AppCompatResources.getDrawable(mContext,
|
||||
R.drawable.mock_conversations_list));
|
||||
mTutorialFragment.releaseFeedbackAnimation();
|
||||
updateFakeAppTaskViewLayout(getMockAppTaskPreviousPageLayoutResId());
|
||||
int subtitleResId = mTutorialFragment.isAtFinalStep()
|
||||
? R.string.back_gesture_feedback_complete_without_follow_up
|
||||
: R.string.back_gesture_feedback_complete_with_overview_follow_up;
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
*/
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
@@ -23,18 +27,76 @@ import androidx.annotation.Nullable;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.TutorialController.TutorialType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/** Shows the Back gesture interactive tutorial. */
|
||||
public class BackGestureTutorialFragment extends TutorialFragment {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
Integer getFeedbackVideoResId(boolean forDarkMode) {
|
||||
return R.drawable.gesture_tutorial_motion_back;
|
||||
Integer getEdgeAnimationResId() {
|
||||
return R.drawable.gesture_tutorial_loop_back;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
Integer getGestureVideoResId() {
|
||||
return R.drawable.gesture_tutorial_loop_back;
|
||||
protected Animator createGestureAnimation() {
|
||||
if (!(mTutorialController instanceof BackGestureTutorialController)) {
|
||||
return null;
|
||||
}
|
||||
BackGestureTutorialController controller =
|
||||
(BackGestureTutorialController) mTutorialController;
|
||||
float fingerDotStartTranslationX = (float) -(mRootView.getWidth() / 2);
|
||||
|
||||
AnimatorSet fingerDotAppearanceAnimator = controller.createFingerDotAppearanceAnimatorSet();
|
||||
fingerDotAppearanceAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
super.onAnimationStart(animation);
|
||||
mFingerDotView.setTranslationX(fingerDotStartTranslationX);
|
||||
}
|
||||
});
|
||||
|
||||
ObjectAnimator translationAnimator = ObjectAnimator.ofFloat(
|
||||
mFingerDotView, View.TRANSLATION_X, fingerDotStartTranslationX, 0);
|
||||
translationAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
controller.updateFakeAppTaskViewLayout(
|
||||
controller.getMockAppTaskPreviousPageLayoutResId());
|
||||
}
|
||||
});
|
||||
translationAnimator.setDuration(1000);
|
||||
|
||||
Animator animationPause = controller.createAnimationPause();
|
||||
animationPause.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
controller.updateFakeAppTaskViewLayout(
|
||||
controller.getMockAppTaskCurrentPageLayoutResId());
|
||||
}
|
||||
});
|
||||
ArrayList<Animator> animators = new ArrayList<>();
|
||||
|
||||
animators.add(fingerDotAppearanceAnimator);
|
||||
animators.add(translationAnimator);
|
||||
animators.add(controller.createFingerDotDisappearanceAnimatorSet());
|
||||
animators.add(animationPause);
|
||||
|
||||
AnimatorSet finalAnimation = new AnimatorSet();
|
||||
finalAnimation.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
super.onAnimationCancel(animation);
|
||||
controller.updateFakeAppTaskViewLayout(
|
||||
controller.getMockAppTaskCurrentPageLayoutResId());
|
||||
}
|
||||
});
|
||||
finalAnimation.playSequentially(animators);
|
||||
|
||||
return finalAnimation;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -49,6 +111,7 @@ public class BackGestureTutorialFragment extends TutorialFragment {
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
releaseFeedbackAnimation();
|
||||
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && mTutorialController != null) {
|
||||
mTutorialController.setRippleHotspot(motionEvent.getX(), motionEvent.getY());
|
||||
}
|
||||
|
||||
@@ -282,9 +282,7 @@ public class EdgeBackGesturePanel extends View {
|
||||
.setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY));
|
||||
int currentNightMode =
|
||||
context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||
mPaint.setColor(context.getColor(currentNightMode == Configuration.UI_MODE_NIGHT_YES
|
||||
? R.color.back_arrow_color_light
|
||||
: R.color.back_arrow_color_dark));
|
||||
mPaint.setColor(context.getColor(R.color.gesture_tutorial_back_arrow_color));
|
||||
loadDimens();
|
||||
updateArrowDirection();
|
||||
|
||||
|
||||
@@ -42,8 +42,8 @@ final class HomeGestureTutorialController extends SwipeUpGestureTutorialControll
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
|
||||
return forDarkMode ? R.drawable.mock_webpage_dark_mode : R.drawable.mock_webpage_light_mode;
|
||||
protected int getMockAppTaskLayoutResId() {
|
||||
return R.layout.gesture_tutorial_mock_webpage;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -80,7 +80,7 @@ final class HomeGestureTutorialController extends SwipeUpGestureTutorialControll
|
||||
case HOME_NAVIGATION:
|
||||
switch (result) {
|
||||
case HOME_GESTURE_COMPLETED: {
|
||||
mTutorialFragment.releaseGestureVideoView();
|
||||
mTutorialFragment.releaseFeedbackAnimation();
|
||||
animateFakeTaskViewHome(finalVelocity, null);
|
||||
int subtitleResId = mTutorialFragment.isAtFinalStep()
|
||||
? R.string.home_gesture_feedback_complete_without_follow_up
|
||||
|
||||
@@ -15,25 +15,73 @@
|
||||
*/
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.TutorialController.TutorialType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/** Shows the Home gesture interactive tutorial. */
|
||||
public class HomeGestureTutorialFragment extends TutorialFragment {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
Integer getFeedbackVideoResId(boolean forDarkMode) {
|
||||
return forDarkMode
|
||||
? R.drawable.gesture_tutorial_motion_home_dark_mode
|
||||
: R.drawable.gesture_tutorial_motion_home_light_mode;
|
||||
Integer getEdgeAnimationResId() {
|
||||
return R.drawable.gesture_tutorial_loop_home;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
Integer getGestureVideoResId() {
|
||||
return R.drawable.gesture_tutorial_loop_home;
|
||||
protected Animator createGestureAnimation() {
|
||||
if (!(mTutorialController instanceof HomeGestureTutorialController)) {
|
||||
return null;
|
||||
}
|
||||
float fingerDotStartTranslationY = (float) mRootView.getFullscreenHeight() / 2;
|
||||
HomeGestureTutorialController controller =
|
||||
(HomeGestureTutorialController) mTutorialController;
|
||||
|
||||
AnimatorSet fingerDotAppearanceAnimator = controller.createFingerDotAppearanceAnimatorSet();
|
||||
fingerDotAppearanceAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
super.onAnimationStart(animation);
|
||||
mFingerDotView.setTranslationY(fingerDotStartTranslationY);
|
||||
}
|
||||
});
|
||||
|
||||
Animator animationPause = controller.createAnimationPause();
|
||||
animationPause.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
controller.resetFakeTaskView();
|
||||
}
|
||||
});
|
||||
ArrayList<Animator> animators = new ArrayList<>();
|
||||
|
||||
animators.add(fingerDotAppearanceAnimator);
|
||||
animators.add(controller.createFingerDotHomeSwipeAnimator(fingerDotStartTranslationY));
|
||||
animators.add(controller.createFingerDotDisappearanceAnimatorSet());
|
||||
animators.add(animationPause);
|
||||
|
||||
AnimatorSet finalAnimation = new AnimatorSet();
|
||||
finalAnimation.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
super.onAnimationCancel(animation);
|
||||
controller.resetFakeTaskView();
|
||||
}
|
||||
});
|
||||
finalAnimation.playSequentially(animators);
|
||||
|
||||
return finalAnimation;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -45,4 +93,10 @@ public class HomeGestureTutorialFragment extends TutorialFragment {
|
||||
Class<? extends TutorialController> getControllerClass() {
|
||||
return HomeGestureTutorialController.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
releaseFeedbackAnimation();
|
||||
return super.onTouch(view, motionEvent);
|
||||
}
|
||||
}
|
||||
|
||||
+13
-9
@@ -49,8 +49,8 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
|
||||
return R.drawable.mock_conversations_list;
|
||||
protected int getMockAppTaskLayoutResId() {
|
||||
return R.layout.gesture_tutorial_mock_conversation_list;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -98,13 +98,8 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont
|
||||
showFeedback(R.string.overview_gesture_feedback_swipe_too_far_from_edge);
|
||||
break;
|
||||
case OVERVIEW_GESTURE_COMPLETED:
|
||||
mTutorialFragment.releaseGestureVideoView();
|
||||
PendingAnimation anim = new PendingAnimation(300);
|
||||
anim.setFloat(mTaskViewSwipeUpAnimation
|
||||
.getCurrentShift(), AnimatedFloat.VALUE, 1, ACCEL);
|
||||
AnimatorSet animset = anim.buildAnim();
|
||||
animset.start();
|
||||
mRunningWindowAnim = SwipeUpAnimationLogic.RunningWindowAnim.wrap(animset);
|
||||
mTutorialFragment.releaseFeedbackAnimation();
|
||||
animateTaskViewToOverview();
|
||||
onMotionPaused(true /*arbitrary value*/);
|
||||
int subtitleResId = mTutorialFragment.getNumSteps() > 1
|
||||
&& mTutorialFragment.isAtFinalStep()
|
||||
@@ -126,4 +121,13 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void animateTaskViewToOverview() {
|
||||
PendingAnimation anim = new PendingAnimation(300);
|
||||
anim.setFloat(mTaskViewSwipeUpAnimation
|
||||
.getCurrentShift(), AnimatedFloat.VALUE, 1, ACCEL);
|
||||
AnimatorSet animset = anim.buildAnim();
|
||||
animset.start();
|
||||
mRunningWindowAnim = SwipeUpAnimationLogic.RunningWindowAnim.wrap(animset);
|
||||
}
|
||||
}
|
||||
|
||||
+83
-6
@@ -15,25 +15,96 @@
|
||||
*/
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.TutorialController.TutorialType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/** Shows the Overview gesture interactive tutorial. */
|
||||
public class OverviewGestureTutorialFragment extends TutorialFragment {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
Integer getFeedbackVideoResId(boolean forDarkMode) {
|
||||
return forDarkMode
|
||||
? R.drawable.gesture_tutorial_motion_overview_dark_mode
|
||||
: R.drawable.gesture_tutorial_motion_overview_light_mode;
|
||||
Integer getEdgeAnimationResId() {
|
||||
return R.drawable.gesture_tutorial_loop_overview;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
Integer getGestureVideoResId() {
|
||||
return R.drawable.gesture_tutorial_loop_overview;
|
||||
protected Animator createGestureAnimation() {
|
||||
if (!(mTutorialController instanceof OverviewGestureTutorialController)) {
|
||||
return null;
|
||||
}
|
||||
float fingerDotStartTranslationY = (float) mRootView.getFullscreenHeight() / 2;
|
||||
OverviewGestureTutorialController controller =
|
||||
(OverviewGestureTutorialController) mTutorialController;
|
||||
|
||||
AnimatorSet fingerDotAppearanceAnimator = controller.createFingerDotAppearanceAnimatorSet();
|
||||
fingerDotAppearanceAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
super.onAnimationStart(animation);
|
||||
|
||||
mFingerDotView.setTranslationY(fingerDotStartTranslationY);
|
||||
}
|
||||
});
|
||||
|
||||
Animator swipeAnimator =
|
||||
controller.createFingerDotOverviewSwipeAnimator(fingerDotStartTranslationY);
|
||||
swipeAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
mFakePreviousTaskView.setVisibility(View.VISIBLE);
|
||||
controller.onMotionPaused(true /*arbitrary value*/);
|
||||
}
|
||||
});
|
||||
|
||||
AnimatorSet fingerDotDisappearanceAnimator =
|
||||
controller.createFingerDotDisappearanceAnimatorSet();
|
||||
fingerDotDisappearanceAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
super.onAnimationStart(animation);
|
||||
controller.animateTaskViewToOverview();
|
||||
}
|
||||
});
|
||||
|
||||
Animator animationPause = controller.createAnimationPause();
|
||||
animationPause.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
controller.resetFakeTaskView();
|
||||
}
|
||||
});
|
||||
ArrayList<Animator> animators = new ArrayList<>();
|
||||
|
||||
animators.add(fingerDotAppearanceAnimator);
|
||||
animators.add(swipeAnimator);
|
||||
animators.add(controller.createAnimationPause());
|
||||
animators.add(fingerDotDisappearanceAnimator);
|
||||
animators.add(animationPause);
|
||||
|
||||
AnimatorSet finalAnimation = new AnimatorSet();
|
||||
finalAnimation.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
super.onAnimationCancel(animation);
|
||||
controller.resetFakeTaskView();
|
||||
}
|
||||
});
|
||||
finalAnimation.playSequentially(animators);
|
||||
|
||||
return finalAnimation;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -45,4 +116,10 @@ public class OverviewGestureTutorialFragment extends TutorialFragment {
|
||||
Class<? extends TutorialController> getControllerClass() {
|
||||
return OverviewGestureTutorialController.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
releaseFeedbackAnimation();
|
||||
return super.onTouch(view, motionEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Insets;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.WindowInsets;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
@@ -41,4 +43,13 @@ public class RootSandboxLayout extends RelativeLayout {
|
||||
return ((TutorialFragment) FragmentManager.findFragment(this))
|
||||
.onInterceptTouch(motionEvent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this view's fullscreen height. This method is agnostic of this view's actual height.
|
||||
*/
|
||||
public int getFullscreenHeight() {
|
||||
Insets insets = getRootWindowInsets().getInsets(WindowInsets.Type.systemBars());
|
||||
|
||||
return getHeight() + insets.top + insets.bottom;
|
||||
}
|
||||
}
|
||||
|
||||
+49
-15
@@ -25,6 +25,7 @@ import static com.android.quickstep.interaction.TutorialController.TutorialType.
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.graphics.Outline;
|
||||
@@ -32,7 +33,6 @@ import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.os.Build;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.View;
|
||||
import android.view.ViewOutlineProvider;
|
||||
@@ -63,23 +63,24 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||
|
||||
private static final int FAKE_PREVIOUS_TASK_MARGIN = Utilities.dpToPx(12);
|
||||
|
||||
private static final long HOME_SWIPE_ANIMATION_DURATION_MILLIS = 625;
|
||||
private static final long OVERVIEW_SWIPE_ANIMATION_DURATION_MILLIS = 1000;
|
||||
|
||||
final ViewSwipeUpAnimation mTaskViewSwipeUpAnimation;
|
||||
private float mFakeTaskViewRadius;
|
||||
private Rect mFakeTaskViewRect = new Rect();
|
||||
private final Rect mFakeTaskViewRect = new Rect();
|
||||
RunningWindowAnim mRunningWindowAnim;
|
||||
private boolean mShowTasks = false;
|
||||
private boolean mShowPreviousTasks = false;
|
||||
|
||||
private AnimatorListenerAdapter mResetTaskView = new AnimatorListenerAdapter() {
|
||||
private final AnimatorListenerAdapter mResetTaskView = new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
mFakeHotseatView.setVisibility(View.INVISIBLE);
|
||||
mFakeIconView.setVisibility(View.INVISIBLE);
|
||||
if (mTutorialFragment.getActivity() != null) {
|
||||
DisplayMetrics displayMetrics =
|
||||
mTutorialFragment.getResources().getDisplayMetrics();
|
||||
int height = displayMetrics.heightPixels;
|
||||
int width = displayMetrics.widthPixels;
|
||||
int height = mTutorialFragment.getRootView().getFullscreenHeight();
|
||||
int width = mTutorialFragment.getRootView().getWidth();
|
||||
mFakeTaskViewRect.set(0, 0, width, height);
|
||||
}
|
||||
mFakeTaskViewRadius = 0;
|
||||
@@ -108,9 +109,8 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||
.copy(mContext);
|
||||
mTaskViewSwipeUpAnimation.initDp(dp);
|
||||
|
||||
DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
|
||||
int height = displayMetrics.heightPixels;
|
||||
int width = displayMetrics.widthPixels;
|
||||
int height = mTutorialFragment.getRootView().getFullscreenHeight();
|
||||
int width = mTutorialFragment.getRootView().getWidth();
|
||||
mFakeTaskViewRect.set(0, 0, width, height);
|
||||
mFakeTaskViewRadius = 0;
|
||||
|
||||
@@ -138,7 +138,6 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||
/** Fades the task view, optionally after animating to a fake Overview. */
|
||||
void fadeOutFakeTaskView(boolean toOverviewFirst, boolean reset,
|
||||
@Nullable Runnable onEndRunnable) {
|
||||
hideFeedback(true);
|
||||
cancelRunningAnimation();
|
||||
PendingAnimation anim = new PendingAnimation(300);
|
||||
if (toOverviewFirst) {
|
||||
@@ -184,6 +183,7 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||
}
|
||||
|
||||
void resetFakeTaskView() {
|
||||
mFakeTaskView.setVisibility(View.VISIBLE);
|
||||
PendingAnimation anim = new PendingAnimation(300);
|
||||
anim.setFloat(mTaskViewSwipeUpAnimation
|
||||
.getCurrentShift(), AnimatedFloat.VALUE, 0, ACCEL);
|
||||
@@ -195,7 +195,6 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||
}
|
||||
|
||||
void animateFakeTaskViewHome(PointF finalVelocity, @Nullable Runnable onEndRunnable) {
|
||||
hideFeedback(true);
|
||||
cancelRunningAnimation();
|
||||
mFakePreviousTaskView.setVisibility(View.INVISIBLE);
|
||||
mFakeHotseatView.setVisibility(View.VISIBLE);
|
||||
@@ -218,9 +217,6 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||
if (mGestureCompleted) {
|
||||
return;
|
||||
}
|
||||
if (displacement != null) {
|
||||
hideFeedback(true);
|
||||
}
|
||||
if (mTutorialType == HOME_NAVIGATION_COMPLETE
|
||||
|| mTutorialType == OVERVIEW_NAVIGATION_COMPLETE) {
|
||||
mFakeTaskView.setVisibility(View.INVISIBLE);
|
||||
@@ -336,6 +332,44 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||
}
|
||||
}
|
||||
|
||||
protected Animator createFingerDotHomeSwipeAnimator(float fingerDotStartTranslationY) {
|
||||
Animator homeSwipeAnimator = createFingerDotSwipeUpAnimator(fingerDotStartTranslationY)
|
||||
.setDuration(HOME_SWIPE_ANIMATION_DURATION_MILLIS);
|
||||
|
||||
homeSwipeAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
animateFakeTaskViewHome(
|
||||
new PointF(
|
||||
0f,
|
||||
fingerDotStartTranslationY / HOME_SWIPE_ANIMATION_DURATION_MILLIS),
|
||||
null);
|
||||
}
|
||||
});
|
||||
|
||||
return homeSwipeAnimator;
|
||||
}
|
||||
|
||||
protected Animator createFingerDotOverviewSwipeAnimator(float fingerDotStartTranslationY) {
|
||||
return createFingerDotSwipeUpAnimator(fingerDotStartTranslationY)
|
||||
.setDuration(OVERVIEW_SWIPE_ANIMATION_DURATION_MILLIS);
|
||||
}
|
||||
|
||||
|
||||
private Animator createFingerDotSwipeUpAnimator(float fingerDotStartTranslationY) {
|
||||
ValueAnimator swipeAnimator = ValueAnimator.ofFloat(0f, 1f);
|
||||
|
||||
swipeAnimator.addUpdateListener(valueAnimator -> {
|
||||
float gestureProgress =
|
||||
-fingerDotStartTranslationY * valueAnimator.getAnimatedFraction();
|
||||
setNavBarGestureProgress(gestureProgress);
|
||||
mFingerDotView.setTranslationY(fingerDotStartTranslationY + gestureProgress);
|
||||
});
|
||||
|
||||
return swipeAnimator;
|
||||
}
|
||||
|
||||
private class FakeTransformParams extends TransformParams {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,25 +16,32 @@
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.NO_ID;
|
||||
import static android.view.View.inflate;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.drawable.Animatable2;
|
||||
import android.graphics.drawable.AnimatedVectorDrawable;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.RippleDrawable;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
@@ -48,18 +55,25 @@ import com.android.launcher3.views.ClipIconView;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback;
|
||||
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureAttemptCallback;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
NavBarGestureAttemptCallback {
|
||||
|
||||
private static final String TAG = "TutorialController";
|
||||
|
||||
private static final float FINGER_DOT_VISIBLE_ALPHA = 0.6f;
|
||||
private static final float FINGER_DOT_SMALL_SCALE = 0.7f;
|
||||
private static final int FINGER_DOT_ANIMATION_DURATION_MILLIS = 500;
|
||||
|
||||
private static final String PIXEL_TIPS_APP_PACKAGE_NAME = "com.google.android.apps.tips";
|
||||
private static final CharSequence DEFAULT_PIXEL_TIPS_APP_NAME = "Pixel Tips";
|
||||
|
||||
private static final int FEEDBACK_ANIMATION_MS = 250;
|
||||
private static final int FEEDBACK_ANIMATION_MS = 133;
|
||||
private static final int RIPPLE_VISIBLE_MS = 300;
|
||||
private static final int GESTURE_ANIMATION_DELAY_MS = 1500;
|
||||
private static final int ADVANCE_TUTORIAL_TIMEOUT_MS = 4000;
|
||||
private static final long GESTURE_ANIMATION_PAUSE_DURATION_MILLIS = 1000;
|
||||
|
||||
final TutorialFragment mTutorialFragment;
|
||||
TutorialType mTutorialType;
|
||||
@@ -68,17 +82,17 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
final TextView mCloseButton;
|
||||
final ViewGroup mFeedbackView;
|
||||
final TextView mFeedbackTitleView;
|
||||
final ImageView mFeedbackVideoView;
|
||||
final ImageView mGestureVideoView;
|
||||
final ImageView mEdgeGestureVideoView;
|
||||
final RelativeLayout mFakeLauncherView;
|
||||
final ImageView mFakeHotseatView;
|
||||
final ClipIconView mFakeIconView;
|
||||
final View mFakeTaskView;
|
||||
final FrameLayout mFakeTaskView;
|
||||
final View mFakePreviousTaskView;
|
||||
final View mRippleView;
|
||||
final RippleDrawable mRippleDrawable;
|
||||
final Button mActionButton;
|
||||
final TutorialStepIndicator mTutorialStepView;
|
||||
final ImageView mFingerDotView;
|
||||
private final AlertDialog mSkipTutorialDialog;
|
||||
|
||||
protected boolean mGestureCompleted = false;
|
||||
@@ -87,7 +101,8 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
// views before posting new callbacks.
|
||||
private final Runnable mTitleViewCallback;
|
||||
@Nullable private Runnable mFeedbackViewCallback;
|
||||
@Nullable private Runnable mFeedbackVideoViewCallback;
|
||||
@Nullable private Runnable mFakeTaskViewCallback;
|
||||
private final Runnable mShowFeedbackRunnable;
|
||||
|
||||
TutorialController(TutorialFragment tutorialFragment, TutorialType tutorialType) {
|
||||
mTutorialFragment = tutorialFragment;
|
||||
@@ -100,8 +115,7 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
mFeedbackView = rootView.findViewById(R.id.gesture_tutorial_fragment_feedback_view);
|
||||
mFeedbackTitleView = mFeedbackView.findViewById(
|
||||
R.id.gesture_tutorial_fragment_feedback_title);
|
||||
mFeedbackVideoView = rootView.findViewById(R.id.gesture_tutorial_feedback_video);
|
||||
mGestureVideoView = rootView.findViewById(R.id.gesture_tutorial_gesture_video);
|
||||
mEdgeGestureVideoView = rootView.findViewById(R.id.gesture_tutorial_edge_gesture_video);
|
||||
mFakeLauncherView = rootView.findViewById(R.id.gesture_tutorial_fake_launcher_view);
|
||||
mFakeHotseatView = rootView.findViewById(R.id.gesture_tutorial_fake_hotseat_view);
|
||||
mFakeIconView = rootView.findViewById(R.id.gesture_tutorial_fake_icon_view);
|
||||
@@ -113,10 +127,34 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
mActionButton = rootView.findViewById(R.id.gesture_tutorial_fragment_action_button);
|
||||
mTutorialStepView =
|
||||
rootView.findViewById(R.id.gesture_tutorial_fragment_feedback_tutorial_step);
|
||||
mFingerDotView = rootView.findViewById(R.id.gesture_tutorial_finger_dot);
|
||||
mSkipTutorialDialog = createSkipTutorialDialog();
|
||||
|
||||
mTitleViewCallback = () -> mFeedbackTitleView.sendAccessibilityEvent(
|
||||
AccessibilityEvent.TYPE_VIEW_FOCUSED);
|
||||
mShowFeedbackRunnable = () -> {
|
||||
mFeedbackView.setAlpha(0f);
|
||||
mFeedbackView.setScaleX(0.95f);
|
||||
mFeedbackView.setScaleY(0.95f);
|
||||
mFeedbackView.setVisibility(View.VISIBLE);
|
||||
mFeedbackView.animate()
|
||||
.setDuration(FEEDBACK_ANIMATION_MS)
|
||||
.alpha(1f)
|
||||
.scaleX(1f)
|
||||
.scaleY(1f)
|
||||
.withEndAction(() -> {
|
||||
if (mGestureCompleted && !mTutorialFragment.isAtFinalStep()) {
|
||||
if (mFeedbackViewCallback != null) {
|
||||
mFeedbackView.removeCallbacks(mFeedbackViewCallback);
|
||||
}
|
||||
mFeedbackViewCallback = mTutorialFragment::continueTutorial;
|
||||
mFeedbackView.postDelayed(mFeedbackViewCallback,
|
||||
ADVANCE_TUTORIAL_TIMEOUT_MS);
|
||||
}
|
||||
})
|
||||
.start();
|
||||
mFeedbackTitleView.postDelayed(mTitleViewCallback, FEEDBACK_ANIMATION_MS);
|
||||
};
|
||||
}
|
||||
|
||||
private void showSkipTutorialDialog() {
|
||||
@@ -134,9 +172,9 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
return R.drawable.default_sandbox_mock_launcher;
|
||||
}
|
||||
|
||||
@DrawableRes
|
||||
protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
|
||||
return R.drawable.default_sandbox_app_task_thumbnail;
|
||||
@LayoutRes
|
||||
protected int getMockAppTaskLayoutResId() {
|
||||
return View.NO_ID;
|
||||
}
|
||||
|
||||
@DrawableRes
|
||||
@@ -173,17 +211,10 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
mFeedbackView.setTranslationY(0);
|
||||
return;
|
||||
}
|
||||
AnimatedVectorDrawable tutorialAnimation = mTutorialFragment.getTutorialAnimation();
|
||||
AnimatedVectorDrawable gestureAnimation = mTutorialFragment.getGestureAnimation();
|
||||
|
||||
if (tutorialAnimation != null && gestureAnimation != null) {
|
||||
TextView title = mFeedbackView.findViewById(
|
||||
R.id.gesture_tutorial_fragment_feedback_title);
|
||||
|
||||
playFeedbackVideo(tutorialAnimation, gestureAnimation, () -> {
|
||||
mFeedbackView.setTranslationY(0);
|
||||
title.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
|
||||
}, true);
|
||||
Animator gestureAnimation = mTutorialFragment.getGestureAnimation();
|
||||
AnimatedVectorDrawable edgeAnimation = mTutorialFragment.getEdgeAnimation();
|
||||
if (gestureAnimation != null && edgeAnimation != null) {
|
||||
playFeedbackAnimation(gestureAnimation, edgeAnimation, mShowFeedbackRunnable, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,8 +246,13 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
int subtitleResId,
|
||||
boolean isGestureSuccessful,
|
||||
boolean useGestureAnimationDelay) {
|
||||
mFeedbackTitleView.setText(titleResId);
|
||||
mFeedbackTitleView.removeCallbacks(mTitleViewCallback);
|
||||
if (mFeedbackViewCallback != null) {
|
||||
mFeedbackView.removeCallbacks(mFeedbackViewCallback);
|
||||
mFeedbackViewCallback = null;
|
||||
}
|
||||
|
||||
mFeedbackTitleView.setText(titleResId);
|
||||
TextView subtitle =
|
||||
mFeedbackView.findViewById(R.id.gesture_tutorial_fragment_feedback_subtitle);
|
||||
subtitle.setText(subtitleResId);
|
||||
@@ -226,77 +262,68 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
showActionButton();
|
||||
}
|
||||
|
||||
if (mFeedbackVideoViewCallback != null) {
|
||||
mFeedbackVideoView.removeCallbacks(mFeedbackVideoViewCallback);
|
||||
mFeedbackVideoViewCallback = null;
|
||||
if (mFakeTaskViewCallback != null) {
|
||||
mFakeTaskView.removeCallbacks(mFakeTaskViewCallback);
|
||||
mFakeTaskViewCallback = null;
|
||||
}
|
||||
}
|
||||
mGestureCompleted = isGestureSuccessful;
|
||||
|
||||
AnimatedVectorDrawable tutorialAnimation = mTutorialFragment.getTutorialAnimation();
|
||||
AnimatedVectorDrawable gestureAnimation = mTutorialFragment.getGestureAnimation();
|
||||
if (tutorialAnimation != null && gestureAnimation != null) {
|
||||
if (!isGestureSuccessful) {
|
||||
playFeedbackVideo(tutorialAnimation, gestureAnimation, () -> {
|
||||
mFeedbackView.setTranslationY(
|
||||
-mFeedbackView.getHeight() - mFeedbackView.getTop());
|
||||
mFeedbackView.setVisibility(View.VISIBLE);
|
||||
mFeedbackView.animate()
|
||||
.setDuration(FEEDBACK_ANIMATION_MS)
|
||||
.translationY(0)
|
||||
.start();
|
||||
mFeedbackTitleView.postDelayed(mTitleViewCallback, FEEDBACK_ANIMATION_MS);
|
||||
}, useGestureAnimationDelay);
|
||||
return;
|
||||
} else {
|
||||
mTutorialFragment.releaseFeedbackVideoView();
|
||||
}
|
||||
Animator gestureAnimation = mTutorialFragment.getGestureAnimation();
|
||||
AnimatedVectorDrawable edgeAnimation = mTutorialFragment.getEdgeAnimation();
|
||||
if (!isGestureSuccessful && gestureAnimation != null && edgeAnimation != null) {
|
||||
playFeedbackAnimation(
|
||||
gestureAnimation,
|
||||
edgeAnimation,
|
||||
mShowFeedbackRunnable,
|
||||
useGestureAnimationDelay);
|
||||
return;
|
||||
} else {
|
||||
mTutorialFragment.releaseFeedbackAnimation();
|
||||
}
|
||||
mFeedbackView.setTranslationY(-mFeedbackView.getHeight() - mFeedbackView.getTop());
|
||||
mFeedbackView.setVisibility(View.VISIBLE);
|
||||
mFeedbackView.animate()
|
||||
.setDuration(FEEDBACK_ANIMATION_MS)
|
||||
.translationY(0)
|
||||
.withEndAction(() -> {
|
||||
if (isGestureSuccessful && !mTutorialFragment.isAtFinalStep()) {
|
||||
if (mFeedbackViewCallback != null) {
|
||||
mFeedbackView.removeCallbacks(mFeedbackViewCallback);
|
||||
}
|
||||
mFeedbackViewCallback = mTutorialFragment::continueTutorial;
|
||||
mFeedbackView.postDelayed(mFeedbackViewCallback,
|
||||
ADVANCE_TUTORIAL_TIMEOUT_MS);
|
||||
}
|
||||
})
|
||||
.start();
|
||||
mFeedbackTitleView.postDelayed(mTitleViewCallback, FEEDBACK_ANIMATION_MS);
|
||||
mFeedbackViewCallback = mShowFeedbackRunnable;
|
||||
|
||||
mFeedbackView.post(mFeedbackViewCallback);
|
||||
}
|
||||
|
||||
void hideFeedback(boolean releaseFeedbackVideo) {
|
||||
void hideFeedback() {
|
||||
cancelQueuedGestureAnimation();
|
||||
mFeedbackView.clearAnimation();
|
||||
mFeedbackView.setVisibility(View.INVISIBLE);
|
||||
if (releaseFeedbackVideo) {
|
||||
mTutorialFragment.releaseFeedbackVideoView();
|
||||
}
|
||||
}
|
||||
|
||||
private void playFeedbackVideo(
|
||||
@NonNull AnimatedVectorDrawable tutorialAnimation,
|
||||
@NonNull AnimatedVectorDrawable gestureAnimation,
|
||||
void cancelQueuedGestureAnimation() {
|
||||
if (mFeedbackViewCallback != null) {
|
||||
mFeedbackView.removeCallbacks(mFeedbackViewCallback);
|
||||
mFeedbackViewCallback = null;
|
||||
}
|
||||
if (mFakeTaskViewCallback != null) {
|
||||
mFakeTaskView.removeCallbacks(mFakeTaskViewCallback);
|
||||
mFakeTaskViewCallback = null;
|
||||
}
|
||||
mFeedbackTitleView.removeCallbacks(mTitleViewCallback);
|
||||
}
|
||||
|
||||
private void playFeedbackAnimation(
|
||||
@NonNull Animator gestureAnimation,
|
||||
@NonNull AnimatedVectorDrawable edgeAnimation,
|
||||
@NonNull Runnable onStartRunnable,
|
||||
boolean useGestureAnimationDelay) {
|
||||
|
||||
if (tutorialAnimation.isRunning()) {
|
||||
tutorialAnimation.reset();
|
||||
if (gestureAnimation.isRunning()) {
|
||||
gestureAnimation.cancel();
|
||||
}
|
||||
tutorialAnimation.registerAnimationCallback(new Animatable2.AnimationCallback() {
|
||||
|
||||
if (edgeAnimation.isRunning()) {
|
||||
edgeAnimation.reset();
|
||||
}
|
||||
gestureAnimation.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Drawable drawable) {
|
||||
super.onAnimationStart(drawable);
|
||||
public void onAnimationStart(Animator animation) {
|
||||
super.onAnimationStart(animation);
|
||||
|
||||
mGestureVideoView.setVisibility(GONE);
|
||||
if (gestureAnimation.isRunning()) {
|
||||
gestureAnimation.stop();
|
||||
mEdgeGestureVideoView.setVisibility(GONE);
|
||||
if (edgeAnimation.isRunning()) {
|
||||
edgeAnimation.stop();
|
||||
}
|
||||
|
||||
if (!useGestureAnimationDelay) {
|
||||
@@ -305,37 +332,25 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Drawable drawable) {
|
||||
super.onAnimationEnd(drawable);
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
|
||||
mGestureVideoView.setVisibility(View.VISIBLE);
|
||||
gestureAnimation.start();
|
||||
mEdgeGestureVideoView.setVisibility(View.VISIBLE);
|
||||
edgeAnimation.start();
|
||||
|
||||
tutorialAnimation.unregisterAnimationCallback(this);
|
||||
gestureAnimation.removeListener(this);
|
||||
}
|
||||
});
|
||||
|
||||
if (mFeedbackViewCallback != null) {
|
||||
mFeedbackVideoView.removeCallbacks(mFeedbackViewCallback);
|
||||
mFeedbackViewCallback = null;
|
||||
}
|
||||
if (mFeedbackVideoViewCallback != null) {
|
||||
mFeedbackVideoView.removeCallbacks(mFeedbackVideoViewCallback);
|
||||
mFeedbackVideoViewCallback = null;
|
||||
}
|
||||
cancelQueuedGestureAnimation();
|
||||
if (useGestureAnimationDelay) {
|
||||
mFeedbackViewCallback = onStartRunnable;
|
||||
mFeedbackVideoViewCallback = () -> {
|
||||
mFeedbackVideoView.setVisibility(View.VISIBLE);
|
||||
tutorialAnimation.start();
|
||||
};
|
||||
mFakeTaskViewCallback = gestureAnimation::start;
|
||||
|
||||
mFeedbackVideoView.setVisibility(View.GONE);
|
||||
mFeedbackView.post(mFeedbackViewCallback);
|
||||
mFeedbackVideoView.postDelayed(mFeedbackVideoViewCallback, GESTURE_ANIMATION_DELAY_MS);
|
||||
mFakeTaskView.postDelayed(mFakeTaskViewCallback, GESTURE_ANIMATION_DELAY_MS);
|
||||
} else {
|
||||
mFeedbackVideoView.setVisibility(View.VISIBLE);
|
||||
tutorialAnimation.start();
|
||||
gestureAnimation.start();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -360,7 +375,7 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
|
||||
@CallSuper
|
||||
void transitToController() {
|
||||
hideFeedback(false);
|
||||
hideFeedback();
|
||||
hideActionButton();
|
||||
updateSubtext();
|
||||
updateDrawables();
|
||||
@@ -395,6 +410,17 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
mActionButton.setOnClickListener(this::onActionButtonClicked);
|
||||
}
|
||||
|
||||
void updateFakeAppTaskViewLayout(@LayoutRes int mockAppTaskLayoutResId) {
|
||||
mFakeTaskView.removeAllViews();
|
||||
if (mockAppTaskLayoutResId != NO_ID) {
|
||||
mFakeTaskView.addView(
|
||||
inflate(mContext, mockAppTaskLayoutResId, null),
|
||||
new FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
}
|
||||
}
|
||||
|
||||
private void updateSubtext() {
|
||||
mTutorialStepView.setTutorialProgress(
|
||||
mTutorialFragment.getCurrentStep(), mTutorialFragment.getNumSteps());
|
||||
@@ -404,15 +430,12 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
if (mContext != null) {
|
||||
mTutorialFragment.getRootView().setBackground(AppCompatResources.getDrawable(
|
||||
mContext, getMockWallpaperResId()));
|
||||
mTutorialFragment.updateFeedbackVideo();
|
||||
mTutorialFragment.updateFeedbackAnimation();
|
||||
mFakeLauncherView.setBackgroundColor(
|
||||
mContext.getColor(Utilities.isDarkTheme(mContext)
|
||||
? R.color.fake_wallpaper_color_dark_mode
|
||||
: R.color.fake_wallpaper_color_light_mode));
|
||||
mContext.getColor(R.color.gesture_tutorial_fake_wallpaper_color));
|
||||
mFakeHotseatView.setImageDrawable(AppCompatResources.getDrawable(
|
||||
mContext, getMockHotseatResId()));
|
||||
mFakeTaskView.setBackground(AppCompatResources.getDrawable(
|
||||
mContext, getMockAppTaskThumbnailResId(Utilities.isDarkTheme(mContext))));
|
||||
updateFakeAppTaskViewLayout(getMockAppTaskLayoutResId());
|
||||
mFakeTaskView.animate().alpha(1).setListener(
|
||||
AnimatorListeners.forSuccessCallback(() -> mFakeTaskView.animate().cancel()));
|
||||
mFakePreviousTaskView.setBackground(AppCompatResources.getDrawable(
|
||||
@@ -485,6 +508,52 @@ abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
return null;
|
||||
}
|
||||
|
||||
protected AnimatorSet createFingerDotAppearanceAnimatorSet() {
|
||||
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(
|
||||
mFingerDotView, View.ALPHA, 0f, FINGER_DOT_VISIBLE_ALPHA);
|
||||
ObjectAnimator yScaleAnimator = ObjectAnimator.ofFloat(
|
||||
mFingerDotView, View.SCALE_Y, FINGER_DOT_SMALL_SCALE, 1f);
|
||||
ObjectAnimator xScaleAnimator = ObjectAnimator.ofFloat(
|
||||
mFingerDotView, View.SCALE_X, FINGER_DOT_SMALL_SCALE, 1f);
|
||||
ArrayList<Animator> animators = new ArrayList<>();
|
||||
|
||||
animators.add(alphaAnimator);
|
||||
animators.add(xScaleAnimator);
|
||||
animators.add(yScaleAnimator);
|
||||
|
||||
AnimatorSet appearanceAnimatorSet = new AnimatorSet();
|
||||
|
||||
appearanceAnimatorSet.playTogether(animators);
|
||||
appearanceAnimatorSet.setDuration(FINGER_DOT_ANIMATION_DURATION_MILLIS);
|
||||
|
||||
return appearanceAnimatorSet;
|
||||
}
|
||||
|
||||
protected AnimatorSet createFingerDotDisappearanceAnimatorSet() {
|
||||
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(
|
||||
mFingerDotView, View.ALPHA, FINGER_DOT_VISIBLE_ALPHA, 0f);
|
||||
ObjectAnimator yScaleAnimator = ObjectAnimator.ofFloat(
|
||||
mFingerDotView, View.SCALE_Y, 1f, FINGER_DOT_SMALL_SCALE);
|
||||
ObjectAnimator xScaleAnimator = ObjectAnimator.ofFloat(
|
||||
mFingerDotView, View.SCALE_X, 1f, FINGER_DOT_SMALL_SCALE);
|
||||
ArrayList<Animator> animators = new ArrayList<>();
|
||||
|
||||
animators.add(alphaAnimator);
|
||||
animators.add(xScaleAnimator);
|
||||
animators.add(yScaleAnimator);
|
||||
|
||||
AnimatorSet appearanceAnimatorSet = new AnimatorSet();
|
||||
|
||||
appearanceAnimatorSet.playTogether(animators);
|
||||
appearanceAnimatorSet.setDuration(FINGER_DOT_ANIMATION_DURATION_MILLIS);
|
||||
|
||||
return appearanceAnimatorSet;
|
||||
}
|
||||
|
||||
protected Animator createAnimationPause() {
|
||||
return ValueAnimator.ofFloat(0f, 1f).setDuration(GESTURE_ANIMATION_PAUSE_DURATION_MILLIS);
|
||||
}
|
||||
|
||||
/** Denotes the type of the tutorial. */
|
||||
enum TutorialType {
|
||||
BACK_NAVIGATION,
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -29,6 +31,7 @@ import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnTouchListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.WindowInsets;
|
||||
import android.widget.ImageView;
|
||||
|
||||
@@ -38,7 +41,6 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.quickstep.interaction.TutorialController.TutorialType;
|
||||
|
||||
abstract class TutorialFragment extends Fragment implements OnTouchListener {
|
||||
@@ -49,13 +51,14 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener {
|
||||
TutorialType mTutorialType;
|
||||
@Nullable TutorialController mTutorialController = null;
|
||||
RootSandboxLayout mRootView;
|
||||
View mFingerDotView;
|
||||
View mFakePreviousTaskView;
|
||||
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||
NavBarGestureHandler mNavBarGestureHandler;
|
||||
private ImageView mFeedbackVideoView;
|
||||
private ImageView mGestureVideoView;
|
||||
private ImageView mEdgeGestureVideoView;
|
||||
|
||||
@Nullable private AnimatedVectorDrawable mTutorialAnimation = null;
|
||||
@Nullable private AnimatedVectorDrawable mGestureAnimation = null;
|
||||
@Nullable private Animator mGestureAnimation = null;
|
||||
@Nullable private AnimatedVectorDrawable mEdgeAnimation = null;
|
||||
private boolean mIntroductionShown = false;
|
||||
|
||||
private boolean mFragmentStopped = false;
|
||||
@@ -96,24 +99,26 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable Integer getFeedbackVideoResId(boolean forDarkMode) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable Integer getGestureVideoResId() {
|
||||
@Nullable Integer getEdgeAnimationResId() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
AnimatedVectorDrawable getTutorialAnimation() {
|
||||
return mTutorialAnimation;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
AnimatedVectorDrawable getGestureAnimation() {
|
||||
Animator getGestureAnimation() {
|
||||
return mGestureAnimation;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
AnimatedVectorDrawable getEdgeAnimation() {
|
||||
return mEdgeAnimation;
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
protected Animator createGestureAnimation() {
|
||||
return null;
|
||||
}
|
||||
|
||||
abstract TutorialController createController(TutorialType type);
|
||||
|
||||
abstract Class<? extends TutorialController> getControllerClass();
|
||||
@@ -147,21 +152,22 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener {
|
||||
return insets;
|
||||
});
|
||||
mRootView.setOnTouchListener(this);
|
||||
mFeedbackVideoView = mRootView.findViewById(R.id.gesture_tutorial_feedback_video);
|
||||
mGestureVideoView = mRootView.findViewById(R.id.gesture_tutorial_gesture_video);
|
||||
mEdgeGestureVideoView = mRootView.findViewById(R.id.gesture_tutorial_edge_gesture_video);
|
||||
mFingerDotView = mRootView.findViewById(R.id.gesture_tutorial_finger_dot);
|
||||
mFakePreviousTaskView = mRootView.findViewById(
|
||||
R.id.gesture_tutorial_fake_previous_task_view);
|
||||
return mRootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
releaseFeedbackVideoView();
|
||||
releaseGestureVideoView();
|
||||
releaseFeedbackAnimation();
|
||||
mFragmentStopped = true;
|
||||
}
|
||||
|
||||
void initializeFeedbackVideoView() {
|
||||
if (!updateFeedbackVideo()) {
|
||||
if (!updateFeedbackAnimation()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -176,87 +182,90 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener {
|
||||
}
|
||||
}
|
||||
|
||||
boolean updateFeedbackVideo() {
|
||||
if (getContext() == null) {
|
||||
boolean updateFeedbackAnimation() {
|
||||
if (!updateEdgeAnimation()) {
|
||||
return false;
|
||||
}
|
||||
Integer feedbackVideoResId = getFeedbackVideoResId(Utilities.isDarkTheme(getContext()));
|
||||
|
||||
if (feedbackVideoResId == null || !updateGestureVideo()) {
|
||||
return false;
|
||||
}
|
||||
mTutorialAnimation = (AnimatedVectorDrawable) getContext().getDrawable(feedbackVideoResId);
|
||||
|
||||
if (mTutorialAnimation != null) {
|
||||
mTutorialAnimation.registerAnimationCallback(new Animatable2.AnimationCallback() {
|
||||
|
||||
@Override
|
||||
public void onAnimationStart(Drawable drawable) {
|
||||
super.onAnimationStart(drawable);
|
||||
|
||||
mFeedbackVideoView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Drawable drawable) {
|
||||
super.onAnimationEnd(drawable);
|
||||
|
||||
releaseFeedbackVideoView();
|
||||
}
|
||||
});
|
||||
}
|
||||
mFeedbackVideoView.setImageDrawable(mTutorialAnimation);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean updateGestureVideo() {
|
||||
Integer gestureVideoResId = getGestureVideoResId();
|
||||
if (gestureVideoResId == null || getContext() == null) {
|
||||
return false;
|
||||
}
|
||||
mGestureAnimation = (AnimatedVectorDrawable) getContext().getDrawable(gestureVideoResId);
|
||||
mGestureAnimation = createGestureAnimation();
|
||||
|
||||
if (mGestureAnimation != null) {
|
||||
mGestureAnimation.registerAnimationCallback(new Animatable2.AnimationCallback() {
|
||||
mGestureAnimation.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
super.onAnimationStart(animation);
|
||||
mFingerDotView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
super.onAnimationCancel(animation);
|
||||
mFingerDotView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
mFingerDotView.setVisibility(View.GONE);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return mGestureAnimation != null;
|
||||
}
|
||||
|
||||
boolean updateEdgeAnimation() {
|
||||
Integer edgeAnimationResId = getEdgeAnimationResId();
|
||||
if (edgeAnimationResId == null || getContext() == null) {
|
||||
return false;
|
||||
}
|
||||
mEdgeAnimation = (AnimatedVectorDrawable) getContext().getDrawable(edgeAnimationResId);
|
||||
|
||||
if (mEdgeAnimation != null) {
|
||||
mEdgeAnimation.registerAnimationCallback(new Animatable2.AnimationCallback() {
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Drawable drawable) {
|
||||
super.onAnimationEnd(drawable);
|
||||
|
||||
mGestureAnimation.start();
|
||||
mEdgeAnimation.start();
|
||||
}
|
||||
});
|
||||
}
|
||||
mGestureVideoView.setImageDrawable(mGestureAnimation);
|
||||
mEdgeGestureVideoView.setImageDrawable(mEdgeAnimation);
|
||||
|
||||
return true;
|
||||
return mEdgeAnimation != null;
|
||||
}
|
||||
|
||||
void releaseFeedbackVideoView() {
|
||||
if (mTutorialAnimation != null && mTutorialAnimation.isRunning()) {
|
||||
mTutorialAnimation.stop();
|
||||
void releaseFeedbackAnimation() {
|
||||
if (mTutorialController != null) {
|
||||
mTutorialController.cancelQueuedGestureAnimation();
|
||||
}
|
||||
|
||||
mFeedbackVideoView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
void releaseGestureVideoView() {
|
||||
if (mGestureAnimation != null && mGestureAnimation.isRunning()) {
|
||||
mGestureAnimation.stop();
|
||||
mGestureAnimation.cancel();
|
||||
}
|
||||
if (mEdgeAnimation != null && mEdgeAnimation.isRunning()) {
|
||||
mEdgeAnimation.stop();
|
||||
}
|
||||
|
||||
mGestureVideoView.setVisibility(View.GONE);
|
||||
mEdgeGestureVideoView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
releaseFeedbackAnimation();
|
||||
if (mFragmentStopped && mTutorialController != null) {
|
||||
mTutorialController.showFeedback();
|
||||
mFragmentStopped = false;
|
||||
} else {
|
||||
changeController(mTutorialType);
|
||||
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(
|
||||
new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
changeController(mTutorialType);
|
||||
mRootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,6 +301,7 @@ abstract class TutorialFragment extends Fragment implements OnTouchListener {
|
||||
mEdgeBackGestureHandler.registerBackGestureAttemptCallback(mTutorialController);
|
||||
mNavBarGestureHandler.registerNavBarGestureAttemptCallback(mTutorialController);
|
||||
mTutorialType = tutorialType;
|
||||
|
||||
initializeFeedbackVideoView();
|
||||
}
|
||||
|
||||
|
||||
@@ -3314,9 +3314,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
// If we're going to HOME, avoid unnecessary onLayout that cause TaskViews to re-arrange
|
||||
// during animation to HOME.
|
||||
if (mCurrentGestureEndTarget == GestureState.GestureEndTarget.HOME) {
|
||||
// If we're going to a state without overview panel, avoid unnecessary onLayout that
|
||||
// cause TaskViews to re-arrange during animation to that state.
|
||||
if (!mOverviewStateEnabled && !mFirstLayout) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -674,7 +674,6 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
TestLogging.recordEvent(
|
||||
TestProtocol.SEQUENCE_MAIN, "startActivityFromRecentsAsync", mTask);
|
||||
ActivityOptionsWrapper opts = mActivity.getActivityLaunchOptions(this, null);
|
||||
opts.options.setLaunchDisplayId(getRootViewDisplayId());
|
||||
if (ActivityManagerWrapper.getInstance()
|
||||
.startActivityFromRecents(mTask.key, opts.options)) {
|
||||
RecentsView recentsView = getRecentsView();
|
||||
@@ -715,7 +714,6 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
// Indicate success once the system has indicated that the transition has started
|
||||
ActivityOptions opts = ActivityOptionsCompat.makeCustomAnimation(
|
||||
getContext(), 0, 0, () -> callback.accept(true), MAIN_EXECUTOR.getHandler());
|
||||
opts.setLaunchDisplayId(getRootViewDisplayId());
|
||||
if (freezeTaskList) {
|
||||
ActivityOptionsCompat.setFreezeRecentTasksList(opts);
|
||||
}
|
||||
@@ -1528,10 +1526,6 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
mDigitalWellBeingToast.setBannerColorTint(tintColor, amount);
|
||||
}
|
||||
|
||||
private int getRootViewDisplayId() {
|
||||
return getRootView().getDisplay().getDisplayId();
|
||||
}
|
||||
|
||||
/**
|
||||
* We update and subsequently draw these in {@link #setFullscreenProgress(float)}.
|
||||
*/
|
||||
|
||||
@@ -30,7 +30,6 @@ import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.test.uiautomator.By;
|
||||
import androidx.test.uiautomator.UiDevice;
|
||||
|
||||
import com.android.launcher3.tapl.LauncherInstrumentation;
|
||||
@@ -217,12 +216,7 @@ public class NavigationModeSwitchRule implements TestRule {
|
||||
|
||||
private static void assertTrue(LauncherInstrumentation launcher, String message,
|
||||
boolean condition, Description description) {
|
||||
if (launcher.getDevice().hasObject(By.textStartsWith(""))) {
|
||||
// The condition above is "screen is not empty". We are not treating
|
||||
// "Screen is empty" as an anomaly here. It's an acceptable state when
|
||||
// Launcher just starts under instrumentation.
|
||||
launcher.checkForAnomaly();
|
||||
}
|
||||
launcher.checkForAnomaly(true);
|
||||
if (!condition) {
|
||||
final AssertionError assertionError = new AssertionError(message);
|
||||
if (description != null) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,15 +36,6 @@
|
||||
|
||||
<color name="icon_background">#E0E0E0</color> <!-- Gray 300 -->
|
||||
|
||||
<color name="gesture_tutorial_ripple_color">#A0C2F9</color> <!-- Light Blue -->
|
||||
<color name="gesture_tutorial_fake_task_view_color">#6DA1FF</color> <!-- Light Blue -->
|
||||
<color name="fake_wallpaper_color_dark_mode">#000000</color> <!-- Black -->
|
||||
<color name="fake_wallpaper_color_light_mode">#f9f9f9</color> <!-- White -->
|
||||
<!-- Must contrast fake_wallpaper_color_dark_mode and fake_wallpaper_color_light_mode -->
|
||||
<color name="gesture_tutorial_fake_previous_task_view_color">#3C4043</color> <!-- Gray -->
|
||||
<color name="gesture_tutorial_action_button_label_color">#FF000000</color>
|
||||
<color name="gesture_tutorial_primary_color">#B7F29F</color> <!-- Light Green -->
|
||||
|
||||
<color name="popup_color_primary_light">#FFF</color>
|
||||
<color name="popup_color_secondary_light">#F1F3F4</color>
|
||||
<color name="popup_color_tertiary_light">#E0E0E0</color> <!-- Gray 300 -->
|
||||
|
||||
@@ -52,7 +52,7 @@ public class Wait {
|
||||
throw new RuntimeException(t);
|
||||
}
|
||||
Log.d("Wait", "atMost: timed out: " + SystemClock.uptimeMillis());
|
||||
launcher.checkForAnomaly();
|
||||
launcher.checkForAnomaly(false);
|
||||
Assert.fail(message.get());
|
||||
}
|
||||
|
||||
|
||||
@@ -390,7 +390,7 @@ public final class LauncherInstrumentation {
|
||||
}
|
||||
}
|
||||
|
||||
private String getSystemAnomalyMessage() {
|
||||
private String getSystemAnomalyMessage(boolean ignoreNavmodeChangeStates) {
|
||||
try {
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
@@ -413,16 +413,18 @@ public final class LauncherInstrumentation {
|
||||
|
||||
if (hasSystemUiObject("keyguard_status_view")) return "Phone is locked";
|
||||
|
||||
final String visibleApps = mDevice.findObjects(getAnyObjectSelector())
|
||||
.stream()
|
||||
.map(LauncherInstrumentation::getApplicationPackageSafe)
|
||||
.distinct()
|
||||
.filter(pkg -> pkg != null)
|
||||
.collect(Collectors.joining(","));
|
||||
if (SYSTEMUI_PACKAGE.equals(visibleApps)) return "Only System UI views are visible";
|
||||
if (!ignoreNavmodeChangeStates) {
|
||||
final String visibleApps = mDevice.findObjects(getAnyObjectSelector())
|
||||
.stream()
|
||||
.map(LauncherInstrumentation::getApplicationPackageSafe)
|
||||
.distinct()
|
||||
.filter(pkg -> pkg != null)
|
||||
.collect(Collectors.joining(","));
|
||||
if (SYSTEMUI_PACKAGE.equals(visibleApps)) return "Only System UI views are visible";
|
||||
|
||||
if (!mDevice.wait(Until.hasObject(getAnyObjectSelector()), WAIT_TIME_MS)) {
|
||||
return "Screen is empty";
|
||||
if (!mDevice.wait(Until.hasObject(getAnyObjectSelector()), WAIT_TIME_MS)) {
|
||||
return "Screen is empty";
|
||||
}
|
||||
}
|
||||
|
||||
final String navigationModeError = getNavigationModeMismatchError(true);
|
||||
@@ -434,8 +436,12 @@ public final class LauncherInstrumentation {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void checkForAnomaly() {
|
||||
final String systemAnomalyMessage = getSystemAnomalyMessage();
|
||||
private void checkForAnomaly() {
|
||||
checkForAnomaly(false);
|
||||
}
|
||||
|
||||
public void checkForAnomaly(boolean ignoreNavmodeChangeStates) {
|
||||
final String systemAnomalyMessage = getSystemAnomalyMessage(ignoreNavmodeChangeStates);
|
||||
if (systemAnomalyMessage != null) {
|
||||
Assert.fail(formatSystemHealthMessage(formatErrorWithEvents(
|
||||
"http://go/tapl : Tests are broken by a non-Launcher system error: "
|
||||
@@ -767,7 +773,7 @@ public final class LauncherInstrumentation {
|
||||
|
||||
if (hasLauncherObject(CONTEXT_MENU_RES_ID)) {
|
||||
GestureScope gestureScope = gestureStartFromLauncher
|
||||
? (isTablet()? GestureScope.INSIDE : GestureScope.INSIDE_TO_OUTSIDE)
|
||||
? (isTablet() ? GestureScope.INSIDE : GestureScope.INSIDE_TO_OUTSIDE)
|
||||
: GestureScope.OUTSIDE_WITH_PILFER;
|
||||
linearGesture(
|
||||
displaySize.x / 2, displaySize.y - 1,
|
||||
|
||||
Reference in New Issue
Block a user