diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fd9a50de94f..db2e0d49697 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -852,10 +852,15 @@ + android:theme="@style/Theme.SpaLib.BottomSheetDialog"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable/double_tap_power_for_wallet.xml b/res/drawable/double_tap_power_for_wallet.xml new file mode 100644 index 00000000000..606c337a24d --- /dev/null +++ b/res/drawable/double_tap_power_for_wallet.xml @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/res/raw/accessibility_shortcut_type_2finger_doubletap.json b/res/raw/accessibility_shortcut_type_2finger_doubletap.json index 73299d5f313..d9cdb0895b9 100644 --- a/res/raw/accessibility_shortcut_type_2finger_doubletap.json +++ b/res/raw/accessibility_shortcut_type_2finger_doubletap.json @@ -2,10 +2,10 @@ "v": "5.12.1", "fr": 60, "ip": 0, - "op": 120, + "op": 86, "w": 412, "h": 300, - "nm": "Accessibility_Two_Tap_v5_export", + "nm": "Accessibility_Two_Tap_v5_export 2", "ddd": 0, "assets": [], "layers": [ @@ -21,428 +21,184 @@ "a": 1, "k": [ { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 0, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 2.473, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 8.406, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 11.865, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 17.135, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 19.609, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 25.539, - "s": [ - 50 - ] + "s": [50] }, { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 29, - "s": [ - 0 - ] - } + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 59.727, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 62.199, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 68.133, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 71.592, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 76.861, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 79.336, + "s": [50] + }, + { "t": 85.265625, "s": [50] } ], "ix": 11 }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 290.932, - 149.932, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [290.932, 149.932, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, - "s": [ - 150, - 150, - 100 - ] + "s": [150, 150, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 4.943, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 8.406, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 11.865, - "s": [ - 150, - 150, - 100 - ] + "s": [150, 150, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 17.135, - "s": [ - 150, - 150, - 100 - ] + "s": [150, 150, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 22.078, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 25.539, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 29, - "s": [ - 150, - 150, - 100 - ] - } + "s": [150, 150, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 59.727, + "s": [150, 150, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 64.67, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 68.133, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 71.592, + "s": [150, 150, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 76.861, + "s": [150, 150, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 81.805, + "s": [100, 100, 100] + }, + { "t": 85.265625, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -461,58 +217,22 @@ "a": 0, "k": { "i": [ - [ - -20.621, - 0 - ], - [ - 0, - 20.621 - ], - [ - 20.621, - 0 - ], - [ - 0, - -20.621 - ] + [-20.621, 0], + [0, 20.621], + [20.621, 0], + [0, -20.621] ], "o": [ - [ - 20.621, - 0 - ], - [ - 0, - -20.621 - ], - [ - -20.621, - 0 - ], - [ - 0, - 20.621 - ] + [20.621, 0], + [0, -20.621], + [-20.621, 0], + [0, 20.621] ], "v": [ - [ - 0, - 37.338 - ], - [ - 37.338, - 0 - ], - [ - 0, - -37.338 - ], - [ - -37.338, - 0 - ] + [0, 37.338], + [37.338, 0], + [0, -37.338], + [-37.338, 0] ], "c": true }, @@ -526,24 +246,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 2.764, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2.764, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -556,19 +263,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -577,50 +275,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -651,428 +312,184 @@ "a": 1, "k": [ { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 0, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 2.473, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 8.406, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 11.865, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 17.135, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 19.609, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 25.539, - "s": [ - 50 - ] + "s": [50] }, { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 29, - "s": [ - 0 - ] - } + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 59.727, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 62.199, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 68.133, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 71.592, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 76.861, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 79.336, + "s": [50] + }, + { "t": 85.265625, "s": [50] } ], "ix": 11 }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 290.934, - 149.934, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [290.934, 149.934, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, - "s": [ - 90, - 90, - 100 - ] + "s": [90, 90, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 4.943, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 8.406, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 11.865, - "s": [ - 90, - 90, - 100 - ] + "s": [90, 90, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 17.135, - "s": [ - 90, - 90, - 100 - ] + "s": [90, 90, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 22.078, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 25.539, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 29, - "s": [ - 90, - 90, - 100 - ] - } + "s": [90, 90, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 59.727, + "s": [90, 90, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 64.67, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 68.133, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 71.592, + "s": [90, 90, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 76.861, + "s": [90, 90, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 81.805, + "s": [100, 100, 100] + }, + { "t": 85.265625, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -1091,58 +508,22 @@ "a": 0, "k": { "i": [ - [ - -31.444, - 0 - ], - [ - 0, - 31.444 - ], - [ - 31.444, - 0 - ], - [ - 0, - -31.444 - ] + [-31.444, 0], + [0, 31.444], + [31.444, 0], + [0, -31.444] ], "o": [ - [ - 31.444, - 0 - ], - [ - 0, - -31.444 - ], - [ - -31.444, - 0 - ], - [ - 0, - 31.444 - ] + [31.444, 0], + [0, -31.444], + [-31.444, 0], + [0, 31.444] ], "v": [ - [ - 0, - 56.934 - ], - [ - 56.934, - 0 - ], - [ - 0, - -56.934 - ], - [ - -56.934, - 0 - ] + [0, 56.934], + [56.934, 0], + [0, -56.934], + [-56.934, 0] ], "c": true }, @@ -1156,24 +537,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 2.764, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2.764, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -1186,19 +554,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -1207,50 +566,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -1281,428 +603,184 @@ "a": 1, "k": [ { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 0.273, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 2.746, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 8.68, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 12.137, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 17.135, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 19.607, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 25.541, - "s": [ - 50 - ] + "s": [50] }, { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 29, - "s": [ - 0 - ] - } + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 60, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 62.473, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 68.406, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 71.863, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 76.861, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 79.334, + "s": [50] + }, + { "t": 85.267578125, "s": [50] } ], "ix": 11 }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 121.932, - 149.932, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [121.932, 149.932, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0.273, - "s": [ - 150, - 150, - 100 - ] + "s": [150, 150, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 5.219, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 8.68, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 12.137, - "s": [ - 150, - 150, - 100 - ] + "s": [150, 150, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 17.135, - "s": [ - 150, - 150, - 100 - ] + "s": [150, 150, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 22.08, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 25.541, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 29, - "s": [ - 150, - 150, - 100 - ] - } + "s": [150, 150, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 60, + "s": [150, 150, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 64.945, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 68.406, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 71.863, + "s": [150, 150, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 76.861, + "s": [150, 150, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 81.807, + "s": [100, 100, 100] + }, + { "t": 85.267578125, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -1721,58 +799,22 @@ "a": 0, "k": { "i": [ - [ - -20.621, - 0 - ], - [ - 0, - 20.621 - ], - [ - 20.621, - 0 - ], - [ - 0, - -20.621 - ] + [-20.621, 0], + [0, 20.621], + [20.621, 0], + [0, -20.621] ], "o": [ - [ - 20.621, - 0 - ], - [ - 0, - -20.621 - ], - [ - -20.621, - 0 - ], - [ - 0, - 20.621 - ] + [20.621, 0], + [0, -20.621], + [-20.621, 0], + [0, 20.621] ], "v": [ - [ - 0, - 37.338 - ], - [ - 37.338, - 0 - ], - [ - 0, - -37.338 - ], - [ - -37.338, - 0 - ] + [0, 37.338], + [37.338, 0], + [0, -37.338], + [-37.338, 0] ], "c": true }, @@ -1786,24 +828,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 2.764, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2.764, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -1816,19 +845,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -1837,50 +857,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -1911,428 +894,184 @@ "a": 1, "k": [ { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 0.273, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 2.746, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 8.68, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 12.137, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 17.135, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 19.607, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 25.541, - "s": [ - 50 - ] + "s": [50] }, { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 29, - "s": [ - 0 - ] - } + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 60, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 62.473, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 68.406, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 71.863, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 76.861, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 79.334, + "s": [50] + }, + { "t": 85.267578125, "s": [50] } ], "ix": 11 }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 121.934, - 149.934, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [121.934, 149.934, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0.273, - "s": [ - 90, - 90, - 100 - ] + "s": [90, 90, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 5.219, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 8.68, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 12.137, - "s": [ - 90, - 90, - 100 - ] + "s": [90, 90, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 17.135, - "s": [ - 90, - 90, - 100 - ] + "s": [90, 90, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 22.08, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 25.541, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 29, - "s": [ - 90, - 90, - 100 - ] - } + "s": [90, 90, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 60, + "s": [90, 90, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 64.945, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 68.406, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 71.863, + "s": [90, 90, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 76.861, + "s": [90, 90, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 81.807, + "s": [100, 100, 100] + }, + { "t": 85.267578125, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -2351,58 +1090,22 @@ "a": 0, "k": { "i": [ - [ - -31.444, - 0 - ], - [ - 0, - 31.444 - ], - [ - 31.444, - 0 - ], - [ - 0, - -31.444 - ] + [-31.444, 0], + [0, 31.444], + [31.444, 0], + [0, -31.444] ], "o": [ - [ - 31.444, - 0 - ], - [ - 0, - -31.444 - ], - [ - -31.444, - 0 - ], - [ - 0, - 31.444 - ] + [31.444, 0], + [0, -31.444], + [-31.444, 0], + [0, 31.444] ], "v": [ - [ - 0, - 56.934 - ], - [ - 56.934, - 0 - ], - [ - 0, - -56.934 - ], - [ - -56.934, - 0 - ] + [0, 56.934], + [56.934, 0], + [0, -56.934], + [-56.934, 0] ], "c": true }, @@ -2416,24 +1119,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 2.764, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2.764, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -2446,19 +1136,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -2467,50 +1148,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -2537,46 +1181,11 @@ "cl": "black", "sr": 1, "ks": { - "o": { - "a": 0, - "k": 100, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 206, - 150, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6, - "l": 2 - } + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [206, 150, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "shapes": [ @@ -2591,106 +1200,34 @@ "a": 0, "k": { "i": [ - [ - -15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 15.5 - ], - [ - 0, - 0 - ], - [ - 15.2, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - -15.7 - ], - [ - 0, - 0 - ] + [-15.3, 0], + [0, 0], + [0, 15.5], + [0, 0], + [15.2, 0], + [0, 0], + [0, -15.7], + [0, 0] ], "o": [ - [ - 0, - 0 - ], - [ - 15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - -15.7 - ], - [ - 0, - 0 - ], - [ - -15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 15.7 - ] + [0, 0], + [15.3, 0], + [0, 0], + [0, -15.7], + [0, 0], + [-15.3, 0], + [0, 0], + [0, 15.7] ], "v": [ - [ - -178.2, - 150 - ], - [ - 178.2, - 150 - ], - [ - 206, - 121.7 - ], - [ - 206, - -121.5 - ], - [ - 178.3, - -150 - ], - [ - -178.2, - -150 - ], - [ - -206, - -121.5 - ], - [ - -206, - 121.5 - ] + [-178.2, 150], + [178.2, 150], + [206, 121.7], + [206, -121.5], + [178.3, -150], + [-178.2, -150], + [-206, -121.5], + [-206, 121.5] ], "c": true }, @@ -2702,21 +1239,8 @@ }, { "ty": "fl", - "c": { - "a": 0, - "k": [ - 0, - 0, - 0, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "c": { "a": 0, "k": [0, 0, 0, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -2725,50 +1249,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -2789,16 +1276,8 @@ } ], "markers": [ - { - "tm": 119, - "cm": "2", - "dr": 0 - }, - { - "tm": 240, - "cm": "1", - "dr": 0 - } + { "tm": 119, "cm": "2", "dr": 0 }, + { "tm": 240, "cm": "1", "dr": 0 } ], "props": {} -} \ No newline at end of file +} diff --git a/res/raw/accessibility_shortcut_type_fab.json b/res/raw/accessibility_shortcut_type_fab.json index 6029d918cf1..8623ac0c852 100644 --- a/res/raw/accessibility_shortcut_type_fab.json +++ b/res/raw/accessibility_shortcut_type_fab.json @@ -2,10 +2,10 @@ "v": "5.12.1", "fr": 60, "ip": 0, - "op": 181, + "op": 330, "w": 412, "h": 300, - "nm": "Accessibility_Shortcut_export", + "nm": "Accessibility_Shortcut_v2_export 2", "ddd": 0, "assets": [], "layers": [ @@ -16,342 +16,175 @@ "nm": "Null 1", "sr": 1, "ks": { - "o": { - "a": 0, - "k": 0, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, + "o": { "a": 0, "k": 0, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [ { - "i": { - "x": 0.8, - "y": 0.15 - }, - "o": { - "x": 0.3, - "y": 0 - }, + "i": { "x": 0.8, "y": 0.15 }, + "o": { "x": 0.3, "y": 0 }, "t": 30, - "s": [ - 412, - 154, - 0 - ], - "to": [ - 0, - 0.609, - 0 - ], - "ti": [ - 0, - 0, - 0 - ] + "s": [412, 154, 0], + "to": [0, 0.609, 0], + "ti": [0, 0, 0] }, { - "i": { - "x": 0.1, - "y": 1 - }, - "o": { - "x": 0.05, - "y": 0.7 - }, + "i": { "x": 0.1, "y": 1 }, + "o": { "x": 0.05, "y": 0.7 }, "t": 35, - "s": [ - 412, - 178.4, - 0 - ], - "to": [ - 0, - 0, - 0 - ], - "ti": [ - 0, - -5.757, - 0 - ] + "s": [412, 178.4, 0], + "to": [0, 0, 0], + "ti": [0, -5.757, 0] }, { - "i": { - "x": 0.833, - "y": 0.833 - }, - "o": { - "x": 0.167, - "y": 0.167 - }, + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, "t": 60, - "s": [ - 412, - 215, - 0 - ], - "to": [ - 0, - 0, - 0 - ], - "ti": [ - 0, - 0, - 0 - ] + "s": [412, 215, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] }, { - "i": { - "x": 0.8, - "y": 0.15 - }, - "o": { - "x": 0.3, - "y": 0 - }, + "i": { "x": 0.8, "y": 0.15 }, + "o": { "x": 0.3, "y": 0 }, "t": 120, - "s": [ - 412, - 215, - 0 - ], - "to": [ - 0, - -0.609, - 0 - ], - "ti": [ - 0, - 0, - 0 - ] + "s": [412, 215, 0], + "to": [0, -0.609, 0], + "ti": [0, 0, 0] }, { - "i": { - "x": 0.1, - "y": 1 - }, - "o": { - "x": 0.05, - "y": 0.7 - }, + "i": { "x": 0.1, "y": 1 }, + "o": { "x": 0.05, "y": 0.7 }, "t": 125, - "s": [ - 412, - 190.6, - 0 - ], - "to": [ - 0, - 0, - 0 - ], - "ti": [ - 0, - 5.757, - 0 - ] + "s": [412, 190.6, 0], + "to": [0, 0, 0], + "ti": [0, 5.757, 0] }, { + "i": { "x": 0.99, "y": 0.99 }, + "o": { "x": 0.01, "y": 0.01 }, "t": 150, - "s": [ - 412, - 154, - 0 - ] - } + "s": [412, 154, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.8, "y": 0.15 }, + "o": { "x": 0.3, "y": 0 }, + "t": 210, + "s": [412, 154, 0], + "to": [0, 0.203, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.1, "y": 1 }, + "o": { "x": 0.05, "y": 0.7 }, + "t": 215, + "s": [412, 178.4, 0], + "to": [0, 0, 0], + "ti": [0, -0.588, 0] + }, + { + "i": { "x": 0.833, "y": 0.833 }, + "o": { "x": 0.167, "y": 0.167 }, + "t": 240, + "s": [412, 215, 0], + "to": [0, 0, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.8, "y": 0.15 }, + "o": { "x": 0.3, "y": 0 }, + "t": 300, + "s": [412, 215, 0], + "to": [0, -0.609, 0], + "ti": [0, 0, 0] + }, + { + "i": { "x": 0.1, "y": 1 }, + "o": { "x": 0.05, "y": 0.7 }, + "t": 305, + "s": [412, 190.6, 0], + "to": [0, 0, 0], + "ti": [0, 5.757, 0] + }, + { "t": 330, "s": [412, 154, 0] } ], "ix": 2, "l": 2 }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.8, - 0.8, - 0.8 - ], - "y": [ - 0.15, - 0.15, - 1 - ] - }, - "o": { - "x": [ - 0.3, - 0.3, - 0.3 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.8, 0.8, 0.8], "y": [0.15, 0.15, 1] }, + "o": { "x": [0.3, 0.3, 0.3], "y": [0, 0, 0] }, "t": 30, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.1, - 0.1, - 0.1 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.05, - 0.05, - 0.05 - ], - "y": [ - 0.7, - 0.7, - 0 - ] - }, + "i": { "x": [0.1, 0.1, 0.1], "y": [1, 1, 1] }, + "o": { "x": [0.05, 0.05, 0.05], "y": [0.7, 0.7, 0] }, "t": 35, - "s": [ - 79.2, - 79.2, - 100 - ] + "s": [79.2, 79.2, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 60, - "s": [ - 48, - 48, - 100 - ] + "s": [48, 48, 100] }, { - "i": { - "x": [ - 0.8, - 0.8, - 0.8 - ], - "y": [ - 0.15, - 0.15, - 1 - ] - }, - "o": { - "x": [ - 0.3, - 0.3, - 0.3 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.8, 0.8, 0.8], "y": [0.15, 0.15, 1] }, + "o": { "x": [0.3, 0.3, 0.3], "y": [0, 0, 0] }, "t": 120, - "s": [ - 48, - 48, - 100 - ] + "s": [48, 48, 100] }, { - "i": { - "x": [ - 0.1, - 0.1, - 0.1 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.05, - 0.05, - 0.05 - ], - "y": [ - 0.7, - 0.7, - 0 - ] - }, + "i": { "x": [0.1, 0.1, 0.1], "y": [1, 1, 1] }, + "o": { "x": [0.05, 0.05, 0.05], "y": [0.7, 0.7, 0] }, "t": 125, - "s": [ - 68.8, - 68.8, - 100 - ] + "s": [68.8, 68.8, 100] }, { + "i": { "x": [0.99, 0.99, 0.99], "y": [1, 1, 1] }, + "o": { "x": [0.01, 0.01, 0.01], "y": [0, 0, 0] }, "t": 150, - "s": [ - 100, - 100, - 100 - ] - } + "s": [100, 100, 100] + }, + { + "i": { "x": [0.8, 0.8, 0.8], "y": [0.15, 0.15, 1] }, + "o": { "x": [0.3, 0.3, 0.3], "y": [0, 0, 0] }, + "t": 210, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.1, 0.1, 0.1], "y": [1, 1, 1] }, + "o": { "x": [0.05, 0.05, 0.05], "y": [0.7, 0.7, 0] }, + "t": 215, + "s": [79.2, 79.2, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 240, + "s": [48, 48, 100] + }, + { + "i": { "x": [0.8, 0.8, 0.8], "y": [0.15, 0.15, 1] }, + "o": { "x": [0.3, 0.3, 0.3], "y": [0, 0, 0] }, + "t": 300, + "s": [48, 48, 100] + }, + { + "i": { "x": [0.1, 0.1, 0.1], "y": [1, 1, 1] }, + "o": { "x": [0.05, 0.05, 0.05], "y": [0.7, 0.7, 0] }, + "t": 305, + "s": [68.8, 68.8, 100] + }, + { "t": 330, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -372,46 +205,11 @@ "parent": 3, "sr": 1, "ks": { - "o": { - "a": 0, - "k": 100, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - -3, - -1, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6, - "l": 2 - } + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-3, -1, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "shapes": [ @@ -426,130 +224,40 @@ "a": 0, "k": { "i": [ - [ - -12.194, - 8.13 - ], - [ - -14.642, - -0.049 - ], - [ - -13.858, - -13.91 - ], - [ - 0, - -19.64 - ], - [ - 8.129, - -12.146 - ], - [ - 13.516, - -5.632 - ], - [ - 14.348, - 2.841 - ], - [ - 10.333, - 10.334 - ], - [ - 2.889, - 14.35 - ], - [ - -5.583, - 13.518 - ] + [-12.194, 8.13], + [-14.642, -0.049], + [-13.858, -13.91], + [0, -19.64], + [8.129, -12.146], + [13.516, -5.632], + [14.348, 2.841], + [10.333, 10.334], + [2.889, 14.35], + [-5.583, 13.518] ], "o": [ - [ - 12.194, - -8.13 - ], - [ - 19.637, - 0 - ], - [ - 13.858, - 13.861 - ], - [ - 0, - 14.595 - ], - [ - -8.129, - 12.195 - ], - [ - -13.516, - 5.583 - ], - [ - -14.348, - -2.89 - ], - [ - -10.333, - -10.383 - ], - [ - -2.889, - -14.35 - ], - [ - 5.583, - -13.518 - ] + [12.194, -8.13], + [19.637, 0], + [13.858, 13.861], + [0, 14.595], + [-8.129, 12.195], + [-13.516, 5.583], + [-14.348, -2.89], + [-10.333, -10.383], + [-2.889, -14.35], + [5.583, -13.518] ], "v": [ - [ - -41.079, - -61.559 - ], - [ - 0.055, - -74 - ], - [ - 52.355, - -52.303 - ], - [ - 74, - 0.005 - ], - [ - 61.513, - 41.097 - ], - [ - 28.311, - 68.377 - ], - [ - -14.44, - 72.589 - ], - [ - -52.343, - 52.313 - ], - [ - -72.567, - 14.404 - ], - [ - -68.356, - -28.353 - ] + [-41.079, -61.559], + [0.055, -74], + [52.355, -52.303], + [74, 0.005], + [61.513, 41.097], + [28.311, 68.377], + [-14.44, 72.589], + [-52.343, 52.313], + [-72.567, 14.404], + [-68.356, -28.353] ], "c": true }, @@ -567,154 +275,46 @@ "a": 0, "k": { "i": [ - [ - 1.322, - 1.469 - ], - [ - 1.959, - 0.147 - ], - [ - 1.028, - -0.343 - ], - [ - 0.784, - -0.735 - ], - [ - 0.441, - -0.98 - ], - [ - 0, - -1.077 - ], - [ - -0.441, - -0.98 - ], - [ - -0.784, - -0.735 - ], - [ - -1.028, - -0.343 - ], - [ - -1.077, - 0.049 - ], - [ - -1.322, - 1.42 - ], - [ - 0, - 1.959 - ] + [1.322, 1.469], + [1.959, 0.147], + [1.028, -0.343], + [0.784, -0.735], + [0.441, -0.98], + [0, -1.077], + [-0.441, -0.98], + [-0.784, -0.735], + [-1.028, -0.343], + [-1.077, 0.049], + [-1.322, 1.42], + [0, 1.959] ], "o": [ - [ - -1.322, - -1.42 - ], - [ - -1.077, - -0.098 - ], - [ - -1.028, - 0.343 - ], - [ - -0.784, - 0.735 - ], - [ - -0.392, - 0.98 - ], - [ - 0, - 1.077 - ], - [ - 0.441, - 0.98 - ], - [ - 0.784, - 0.735 - ], - [ - 1.028, - 0.392 - ], - [ - 1.959, - -0.196 - ], - [ - 1.322, - -1.42 - ], - [ - 0, - -1.959 - ] + [-1.322, -1.42], + [-1.077, -0.098], + [-1.028, 0.343], + [-0.784, 0.735], + [-0.392, 0.98], + [0, 1.077], + [0.441, 0.98], + [0.784, 0.735], + [1.028, 0.392], + [1.959, -0.196], + [1.322, -1.42], + [0, -1.959] ], "v": [ - [ - 5.148, - -35.895 - ], - [ - 0.055, - -38.344 - ], - [ - -3.128, - -37.952 - ], - [ - -5.87, - -36.336 - ], - [ - -7.731, - -33.741 - ], - [ - -8.367, - -30.605 - ], - [ - -7.731, - -27.471 - ], - [ - -5.87, - -24.875 - ], - [ - -3.128, - -23.259 - ], - [ - 0.055, - -22.819 - ], - [ - 5.148, - -25.317 - ], - [ - 7.205, - -30.605 - ] + [5.148, -35.895], + [0.055, -38.344], + [-3.128, -37.952], + [-5.87, -36.336], + [-7.731, -33.741], + [-8.367, -30.605], + [-7.731, -27.471], + [-5.87, -24.875], + [-3.128, -23.259], + [0.055, -22.819], + [5.148, -25.317], + [7.205, -30.605] ], "c": true }, @@ -732,166 +332,49 @@ "a": 0, "k": { "i": [ - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - -7.688, - 1.959 - ], - [ - 0, - 0 - ], - [ - 21.645, - 5.143 - ], - [ - 0, - 0 - ], - [ - -7.835, - -0.637 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ] + [0, 0], + [0, 0], + [0, 0], + [-7.688, 1.959], + [0, 0], + [21.645, 5.143], + [0, 0], + [-7.835, -0.637], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] ], "o": [ - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 7.933, - -0.588 - ], - [ - 0, - 0 - ], - [ - -21.645, - 5.143 - ], - [ - 0, - 0 - ], - [ - 7.639, - 1.959 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ] + [0, 0], + [0, 0], + [7.933, -0.588], + [0, 0], + [-21.645, 5.143], + [0, 0], + [7.639, 1.959], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] ], "v": [ - [ - 11.661, - 39.187 - ], - [ - 11.661, - -11.211 - ], - [ - 11.465, - -11.211 - ], - [ - 34.922, - -15.08 - ], - [ - 33.012, - -22.819 - ], - [ - -32.901, - -22.819 - ], - [ - -34.86, - -15.08 - ], - [ - -11.6, - -11.211 - ], - [ - -11.6, - 39.138 - ], - [ - -3.862, - 39.138 - ], - [ - -3.862, - 15.874 - ], - [ - 3.924, - 15.874 - ], - [ - 3.924, - 39.187 - ] + [11.661, 39.187], + [11.661, -11.211], + [11.465, -11.211], + [34.922, -15.08], + [33.012, -22.819], + [-32.901, -22.819], + [-34.86, -15.08], + [-11.6, -11.211], + [-11.6, 39.138], + [-3.862, 39.138], + [-3.862, 15.874], + [3.924, 15.874], + [3.924, 39.187] ], "c": true }, @@ -905,19 +388,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.909803921569, - 0.917647058824, - 0.929411764706, - 1 - ], + "k": [0.909803921569, 0.917647058824, 0.929411764706, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -926,50 +400,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -997,46 +434,11 @@ "parent": 1, "sr": 1, "ks": { - "o": { - "a": 0, - "k": 100, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 98, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6, - "l": 2 - } + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [0, 0, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [98, 0, 0], "ix": 1, "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "shapes": [ @@ -1051,94 +453,31 @@ "a": 0, "k": { "i": [ - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - 17.884, - 17.997 - ], - [ - 0, - 25.479 - ], - [ - -17.884, - 17.997 - ], - [ - -25.32, - 0 - ], - [ - 0, - 0 - ] + [0, 0], + [0, 0], + [17.884, 17.997], + [0, 25.479], + [-17.884, 17.997], + [-25.32, 0], + [0, 0] ], "o": [ - [ - 0, - 0 - ], - [ - -25.32, - 0 - ], - [ - -17.884, - -17.997 - ], - [ - 0, - -25.479 - ], - [ - 17.884, - -18.046 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ] + [0, 0], + [-25.32, 0], + [-17.884, -17.997], + [0, -25.479], + [17.884, -18.046], + [0, 0], + [0, 0] ], "v": [ - [ - 98, - 96 - ], - [ - -2.6, - 96 - ], - [ - -70.056, - 67.88 - ], - [ - -98, - 0.001 - ], - [ - -70.056, - -67.88 - ], - [ - -2.6, - -96 - ], - [ - 98, - -96 - ] + [98, 96], + [-2.6, 96], + [-70.056, 67.88], + [-98, 0.001], + [-70.056, -67.88], + [-2.6, -96], + [98, -96] ], "c": false }, @@ -1152,24 +491,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.909803921569, - 0.917647058824, - 0.929411764706, - 1 - ], + "k": [0.909803921569, 0.917647058824, 0.929411764706, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 4, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 4, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -1180,50 +506,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -1250,46 +539,11 @@ "cl": "black", "sr": 1, "ks": { - "o": { - "a": 0, - "k": 100, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 206, - 150, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6, - "l": 2 - } + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [206, 150, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "shapes": [ @@ -1304,106 +558,34 @@ "a": 0, "k": { "i": [ - [ - -15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 15.5 - ], - [ - 0, - 0 - ], - [ - 15.2, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - -15.7 - ], - [ - 0, - 0 - ] + [-15.3, 0], + [0, 0], + [0, 15.5], + [0, 0], + [15.2, 0], + [0, 0], + [0, -15.7], + [0, 0] ], "o": [ - [ - 0, - 0 - ], - [ - 15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - -15.7 - ], - [ - 0, - 0 - ], - [ - -15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 15.7 - ] + [0, 0], + [15.3, 0], + [0, 0], + [0, -15.7], + [0, 0], + [-15.3, 0], + [0, 0], + [0, 15.7] ], "v": [ - [ - -178.2, - 150 - ], - [ - 178.2, - 150 - ], - [ - 206, - 121.7 - ], - [ - 206, - -121.5 - ], - [ - 178.3, - -150 - ], - [ - -178.2, - -150 - ], - [ - -206, - -121.5 - ], - [ - -206, - 121.5 - ] + [-178.2, 150], + [178.2, 150], + [206, 121.7], + [206, -121.5], + [178.3, -150], + [-178.2, -150], + [-206, -121.5], + [-206, 121.5] ], "c": true }, @@ -1415,21 +597,8 @@ }, { "ty": "fl", - "c": { - "a": 0, - "k": [ - 0, - 0, - 0, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "c": { "a": 0, "k": [0, 0, 0, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -1438,50 +607,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -1503,4 +635,4 @@ ], "markers": [], "props": {} -} \ No newline at end of file +} diff --git a/res/raw/accessibility_shortcut_type_tripletap.json b/res/raw/accessibility_shortcut_type_tripletap.json index 18f1736ae17..c74c66b8268 100644 --- a/res/raw/accessibility_shortcut_type_tripletap.json +++ b/res/raw/accessibility_shortcut_type_tripletap.json @@ -2,10 +2,10 @@ "v": "5.12.1", "fr": 60, "ip": 0, - "op": 135, + "op": 126, "w": 412, "h": 300, - "nm": "Accessibility_Triple_Tap_v5_export", + "nm": "Accessibility_Triple_Tap_v5_export 2", "ddd": 0, "assets": [], "layers": [ @@ -21,644 +21,274 @@ "a": 1, "k": [ { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 0, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 1.832, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 9.623, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 11.91, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 16.543, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 18.377, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 26.164, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 28.457, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 33.09, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 34.922, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 42.711, - "s": [ - 50 - ] + "s": [50] }, { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 45, - "s": [ - 0 - ] - } + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 85, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 86.832, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 94.623, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 96.91, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 101.543, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 103.377, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 111.164, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 113.457, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 118.09, + "s": [0] + }, + { "t": 119.921875, "s": [50] } ], "ix": 11 }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 206.01, - 150.01, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [206.01, 150.01, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, - "s": [ - 120, - 120, - 100 - ] + "s": [120, 120, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 5.498, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 7.328, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 11.91, - "s": [ - 120, - 120, - 100 - ] + "s": [120, 120, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 16.543, - "s": [ - 120, - 120, - 100 - ] + "s": [120, 120, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 22.043, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 23.873, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 28.457, - "s": [ - 120, - 120, - 100 - ] + "s": [120, 120, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 33.09, - "s": [ - 120, - 120, - 100 - ] + "s": [120, 120, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 38.588, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 40.418, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 45, - "s": [ - 120, - 120, - 100 - ] - } + "s": [120, 120, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 85, + "s": [120, 120, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 90.498, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 92.328, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 96.91, + "s": [120, 120, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 101.543, + "s": [120, 120, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 107.043, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 108.873, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 113.457, + "s": [120, 120, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 118.09, + "s": [120, 120, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 123.588, + "s": [100, 100, 100] + }, + { "t": 125.41796875, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -677,58 +307,22 @@ "a": 0, "k": { "i": [ - [ - -20.621, - 0 - ], - [ - 0, - 20.621 - ], - [ - 20.621, - 0 - ], - [ - 0, - -20.621 - ] + [-20.621, 0], + [0, 20.621], + [20.621, 0], + [0, -20.621] ], "o": [ - [ - 20.621, - 0 - ], - [ - 0, - -20.621 - ], - [ - -20.621, - 0 - ], - [ - 0, - 20.621 - ] + [20.621, 0], + [0, -20.621], + [-20.621, 0], + [0, 20.621] ], "v": [ - [ - 0, - 37.338 - ], - [ - 37.338, - 0 - ], - [ - 0, - -37.338 - ], - [ - -37.338, - 0 - ] + [0, 37.338], + [37.338, 0], + [0, -37.338], + [-37.338, 0] ], "c": true }, @@ -742,24 +336,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 2.764, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2.764, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -772,19 +353,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -793,50 +365,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -867,644 +402,274 @@ "a": 1, "k": [ { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 0, - "s": [ - 1 - ] + "s": [1] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 1.832, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 9.623, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 11.91, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 16.543, - "s": [ - 1 - ] + "s": [1] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 18.377, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 26.164, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 28.457, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 33.09, - "s": [ - 1 - ] + "s": [1] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 34.922, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 42.711, - "s": [ - 50 - ] + "s": [50] }, { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 45, - "s": [ - 0 - ] - } + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 85, + "s": [1] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 86.832, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 94.623, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 96.91, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 101.543, + "s": [1] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 103.377, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 111.164, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 113.457, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 118.09, + "s": [1] + }, + { "t": 119.921875, "s": [50] } ], "ix": 11 }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 206.012, - 150.012, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [206.012, 150.012, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, - "s": [ - 80, - 80, - 100 - ] + "s": [80, 80, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 5.498, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 7.328, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 11.91, - "s": [ - 80, - 80, - 100 - ] + "s": [80, 80, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 16.543, - "s": [ - 80, - 80, - 100 - ] + "s": [80, 80, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 22.043, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 23.873, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 28.457, - "s": [ - 80, - 80, - 100 - ] + "s": [80, 80, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 33.09, - "s": [ - 80, - 80, - 100 - ] + "s": [80, 80, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 38.588, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 40.418, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 45, - "s": [ - 80, - 80, - 100 - ] - } + "s": [80, 80, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 85, + "s": [80, 80, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 90.498, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 92.328, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 96.91, + "s": [80, 80, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 101.543, + "s": [80, 80, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 107.043, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 108.873, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 113.457, + "s": [80, 80, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 118.09, + "s": [80, 80, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 123.588, + "s": [100, 100, 100] + }, + { "t": 125.41796875, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -1523,58 +688,22 @@ "a": 0, "k": { "i": [ - [ - -31.444, - 0 - ], - [ - 0, - 31.444 - ], - [ - 31.444, - 0 - ], - [ - 0, - -31.444 - ] + [-31.444, 0], + [0, 31.444], + [31.444, 0], + [0, -31.444] ], "o": [ - [ - 31.444, - 0 - ], - [ - 0, - -31.444 - ], - [ - -31.444, - 0 - ], - [ - 0, - 31.444 - ] + [31.444, 0], + [0, -31.444], + [-31.444, 0], + [0, 31.444] ], "v": [ - [ - 0, - 56.934 - ], - [ - 56.934, - 0 - ], - [ - 0, - -56.934 - ], - [ - -56.934, - 0 - ] + [0, 56.934], + [56.934, 0], + [0, -56.934], + [-56.934, 0] ], "c": true }, @@ -1588,24 +717,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 2.764, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2.764, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -1618,19 +734,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -1639,50 +746,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -1713,644 +783,274 @@ "a": 1, "k": [ { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 0, - "s": [ - 1 - ] + "s": [1] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 1.832, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 9.623, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 11.91, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 16.543, - "s": [ - 1 - ] + "s": [1] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 18.377, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 26.164, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 28.457, - "s": [ - 0 - ] + "s": [0] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 33.09, - "s": [ - 1 - ] + "s": [1] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 34.922, - "s": [ - 50 - ] + "s": [50] }, { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 42.711, - "s": [ - 50 - ] + "s": [50] }, { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, "t": 45, - "s": [ - 0 - ] - } + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 85, + "s": [1] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 86.832, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 94.623, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 96.91, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 101.543, + "s": [1] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 103.377, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 111.164, + "s": [50] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 113.457, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 118.09, + "s": [1] + }, + { "t": 119.921875, "s": [50] } ], "ix": 11 }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 206, - 150, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [206, 150, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [ { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, - "s": [ - 60, - 60, - 100 - ] + "s": [60, 60, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 5.498, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 7.328, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 11.91, - "s": [ - 60, - 60, - 100 - ] + "s": [60, 60, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 16.543, - "s": [ - 60, - 60, - 100 - ] + "s": [60, 60, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 22.043, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 23.873, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 28.457, - "s": [ - 60, - 60, - 100 - ] + "s": [60, 60, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 33.09, - "s": [ - 60, - 60, - 100 - ] + "s": [60, 60, 100] }, { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.333, - 0.333, - 0.333 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 38.588, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { - "i": { - "x": [ - 0.667, - 0.667, - 0.667 - ], - "y": [ - 1, - 1, - 1 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0, - 0, - 0 - ] - }, + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 40.418, - "s": [ - 100, - 100, - 100 - ] + "s": [100, 100, 100] }, { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 45, - "s": [ - 60, - 60, - 100 - ] - } + "s": [60, 60, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 85, + "s": [60, 60, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 90.498, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 92.328, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 96.91, + "s": [60, 60, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 101.543, + "s": [60, 60, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 107.043, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 108.873, + "s": [100, 100, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, + "t": 113.457, + "s": [60, 60, 100] + }, + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 118.09, + "s": [60, 60, 100] + }, + { + "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 123.588, + "s": [100, 100, 100] + }, + { "t": 125.41796875, "s": [100, 100, 100] } ], "ix": 6, "l": 2 @@ -2369,58 +1069,22 @@ "a": 0, "k": { "i": [ - [ - -41.974, - 0 - ], - [ - 0, - 41.974 - ], - [ - 41.974, - 0 - ], - [ - 0, - -41.974 - ] + [-41.974, 0], + [0, 41.974], + [41.974, 0], + [0, -41.974] ], "o": [ - [ - 41.974, - 0 - ], - [ - 0, - -41.974 - ], - [ - -41.974, - 0 - ], - [ - 0, - 41.974 - ] + [41.974, 0], + [0, -41.974], + [-41.974, 0], + [0, 41.974] ], "v": [ - [ - 0, - 76 - ], - [ - 76, - 0 - ], - [ - 0, - -76 - ], - [ - -76, - 0 - ] + [0, 76], + [76, 0], + [0, -76], + [-76, 0] ], "c": true }, @@ -2434,24 +1098,11 @@ "ty": "st", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 3 }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 2.764, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 2.764, "ix": 5 }, "lc": 1, "lj": 1, "ml": 4, @@ -2464,19 +1115,10 @@ "ty": "fl", "c": { "a": 0, - "k": [ - 0.40000000596, - 0.615686297417, - 0.964705884457, - 1 - ], + "k": [0.40000000596, 0.615686297417, 0.964705884457, 1], "ix": 4 }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -2485,50 +1127,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -2555,46 +1160,11 @@ "cl": "black", "sr": 1, "ks": { - "o": { - "a": 0, - "k": 100, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 206, - 150, - 0 - ], - "ix": 2, - "l": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1, - "l": 2 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6, - "l": 2 - } + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [206, 150, 0], "ix": 2, "l": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1, "l": 2 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "shapes": [ @@ -2609,106 +1179,34 @@ "a": 0, "k": { "i": [ - [ - -15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 15.5 - ], - [ - 0, - 0 - ], - [ - 15.2, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - -15.7 - ], - [ - 0, - 0 - ] + [-15.3, 0], + [0, 0], + [0, 15.5], + [0, 0], + [15.2, 0], + [0, 0], + [0, -15.7], + [0, 0] ], "o": [ - [ - 0, - 0 - ], - [ - 15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - -15.7 - ], - [ - 0, - 0 - ], - [ - -15.3, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 15.7 - ] + [0, 0], + [15.3, 0], + [0, 0], + [0, -15.7], + [0, 0], + [-15.3, 0], + [0, 0], + [0, 15.7] ], "v": [ - [ - -178.2, - 150 - ], - [ - 178.2, - 150 - ], - [ - 206, - 121.7 - ], - [ - 206, - -121.5 - ], - [ - 178.3, - -150 - ], - [ - -178.2, - -150 - ], - [ - -206, - -121.5 - ], - [ - -206, - 121.5 - ] + [-178.2, 150], + [178.2, 150], + [206, 121.7], + [206, -121.5], + [178.3, -150], + [-178.2, -150], + [-206, -121.5], + [-206, 121.5] ], "c": true }, @@ -2720,21 +1218,8 @@ }, { "ty": "fl", - "c": { - "a": 0, - "k": [ - 0, - 0, - 0, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, + "c": { "a": 0, "k": [0, 0, 0, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, "r": 1, "bm": 0, "nm": "Fill 1", @@ -2743,50 +1228,13 @@ }, { "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "Transform" } ], @@ -2806,12 +1254,6 @@ "bm": 0 } ], - "markers": [ - { - "tm": 135, - "cm": "1", - "dr": 0 - } - ], + "markers": [{ "tm": 211, "cm": "1", "dr": 0 }], "props": {} -} \ No newline at end of file +} diff --git a/res/values/config.xml b/res/values/config.xml index 4e4c5c4c1c0..95f8eba8f84 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -842,4 +842,7 @@ com.android.virtualization.terminal + + + false diff --git a/res/values/strings.xml b/res/values/strings.xml index 525de4796a0..ebd6d60ef55 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11158,6 +11158,23 @@ To quickly open camera, press the power button twice. Works from any screen. + + Double tap power button + + %1$s / %2$s + + Use double tap + + Double Tap Power Button + + Open Camera + + Access Camera + + Open Wallet + + Access Wallet + Flip camera for selfie diff --git a/res/xml/double_tap_power_settings.xml b/res/xml/double_tap_power_settings.xml index fb5dd52b913..783d045b5d5 100644 --- a/res/xml/double_tap_power_settings.xml +++ b/res/xml/double_tap_power_settings.xml @@ -1,6 +1,6 @@ + + + + + + + + diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml index 035c7f7c801..bfb359ae804 100644 --- a/res/xml/gestures.xml +++ b/res/xml/gestures.xml @@ -29,7 +29,7 @@ diff --git a/src/com/android/settings/TestingSettingsBroadcastReceiver.java b/src/com/android/settings/TestingSettingsBroadcastReceiver.java index 30a0d796c1c..9965630ea1b 100644 --- a/src/com/android/settings/TestingSettingsBroadcastReceiver.java +++ b/src/com/android/settings/TestingSettingsBroadcastReceiver.java @@ -19,6 +19,7 @@ package com.android.settings; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.telephony.TelephonyManager; import com.android.settings.Settings.TestingSettingsActivity; @@ -32,11 +33,17 @@ public class TestingSettingsBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null && intent.getAction() != null - && intent.getAction().equals(TelephonyManager.ACTION_SECRET_CODE)) { + && intent.getAction().equals(TelephonyManager.ACTION_SECRET_CODE) + && !isDisabled(context)) { Intent i = new Intent(Intent.ACTION_MAIN); i.setClass(context, TestingSettingsActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } + + private boolean isDisabled(Context context) { + return "user".equals(Build.TYPE) && context.getResources().getBoolean( + R.bool.config_hide_testing_settings_menu_for_user_builds); + } } diff --git a/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java deleted file mode 100644 index 8a3f22d807a..00000000000 --- a/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2022 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.settings.accessibility; - -import android.content.ComponentName; -import android.content.Context; -import android.os.Bundle; -import android.os.Handler; - -import androidx.annotation.Nullable; -import androidx.preference.PreferenceScreen; - -import com.android.settings.R; -import com.android.settings.core.TogglePreferenceController; -import com.android.settingslib.PrimarySwitchPreference; -import com.android.settingslib.core.lifecycle.LifecycleObserver; -import com.android.settingslib.core.lifecycle.events.OnCreate; -import com.android.settingslib.core.lifecycle.events.OnDestroy; -import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState; - -/** PrimarySwitchPreferenceController that shows quick settings tooltip on first use. */ -public abstract class AccessibilityQuickSettingsPrimarySwitchPreferenceController - extends TogglePreferenceController - implements LifecycleObserver, OnCreate, OnDestroy, OnSaveInstanceState { - private static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow"; - private final Handler mHandler; - private PrimarySwitchPreference mPreference; - private AccessibilityQuickSettingsTooltipWindow mTooltipWindow; - private boolean mNeedsQSTooltipReshow = false; - - /** Returns the accessibility tile component name. */ - @Nullable - abstract ComponentName getTileComponentName(); - - /** Returns the accessibility tile tooltip content. */ - abstract CharSequence getTileTooltipContent(); - - public AccessibilityQuickSettingsPrimarySwitchPreferenceController(Context context, - String preferenceKey) { - super(context, preferenceKey); - mHandler = new Handler(context.getMainLooper()); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - // Restore the tooltip. - if (savedInstanceState != null) { - if (savedInstanceState.containsKey(KEY_SAVED_QS_TOOLTIP_RESHOW)) { - mNeedsQSTooltipReshow = savedInstanceState.getBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW); - } - } - } - - @Override - public void onDestroy() { - mHandler.removeCallbacksAndMessages(null); - final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing(); - if (isTooltipWindowShowing) { - mTooltipWindow.dismiss(); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing(); - if (mNeedsQSTooltipReshow || isTooltipWindowShowing) { - outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true); - } - } - - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - mPreference = screen.findPreference(getPreferenceKey()); - if (mNeedsQSTooltipReshow) { - mHandler.post(this::showQuickSettingsTooltipIfNeeded); - } - } - - @Override - public boolean setChecked(boolean isChecked) { - if (isChecked) { - showQuickSettingsTooltipIfNeeded(); - } - return isChecked; - } - - @Override - public boolean isChecked() { - return false; - } - - @Override - public int getAvailabilityStatus() { - return AVAILABLE; - } - - @Override - public int getSliceHighlightMenuRes() { - return R.string.menu_key_accessibility; - } - - private void showQuickSettingsTooltipIfNeeded() { - if (mPreference == null) { - // Returns if no preference found by slice highlight menu. - return; - } - - final ComponentName tileComponentName = getTileComponentName(); - if (tileComponentName == null) { - // Returns if no tile service assigned. - return; - } - - if (!mNeedsQSTooltipReshow && AccessibilityQuickSettingUtils.hasValueInSharedPreferences( - mContext, tileComponentName)) { - // Returns if quick settings tooltip only show once. - return; - } - - // TODO (287728819): Move tooltip showing to SystemUI - // Since the lifecycle of controller is independent of that of the preference, doing - // null check on switch is a temporary solution for the case that switch view - // is not ready when we would like to show the tooltip. If the switch is not ready, - // we give up showing the tooltip and also do not reshow it in the future. - if (mPreference.getSwitch() != null) { - mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(mContext); - mTooltipWindow.setup(getTileTooltipContent(), - R.drawable.accessibility_auto_added_qs_tooltip_illustration); - mTooltipWindow.showAtTopCenter(mPreference.getSwitch()); - } - AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext, tileComponentName); - mNeedsQSTooltipReshow = false; - } -} diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 39ce081f606..6f0ef9e70cb 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -177,9 +177,7 @@ public class AccessibilitySettings extends DashboardFragment implements // Observe changes from accessibility selection menu shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); - } + shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_STICKY_KEYS); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SLOW_KEYS); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BOUNCE_KEYS); diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index 91d75f34631..104b35a9fbe 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -31,7 +31,6 @@ import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -114,9 +113,7 @@ public abstract class AccessibilityShortcutPreferenceFragment extends Restricted final List shortcutFeatureKeys = new ArrayList<>(); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); - } + shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); mSettingsContentObserver = new AccessibilitySettingsContentObserver(new Handler()); mSettingsContentObserver.registerKeysToObserverCallback(shortcutFeatureKeys, key -> { updateShortcutPreferenceData(); @@ -374,38 +371,13 @@ public abstract class AccessibilityShortcutPreferenceFragment extends Restricted showQuickSettingsTooltipIfNeeded(); } + /** + * @deprecated made obsolete by quick settings rollout. + * + * (TODO 367414968: finish removal.) + */ + @Deprecated private void showQuickSettingsTooltipIfNeeded() { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - // Don't show Quick Settings tooltip - return; - } - final ComponentName tileComponentName = getTileComponentName(); - if (tileComponentName == null) { - // Returns if no tile service assigned. - return; - } - - if (!mNeedsQSTooltipReshow && AccessibilityQuickSettingUtils.hasValueInSharedPreferences( - getContext(), tileComponentName)) { - // Returns if quick settings tooltip only show once. - return; - } - - final CharSequence content = getTileTooltipContent(mNeedsQSTooltipType); - if (TextUtils.isEmpty(content)) { - // Returns if no content of tile tooltip assigned. - return; - } - - final int imageResId = mNeedsQSTooltipType == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? R.drawable.accessibility_qs_tooltip_illustration - : R.drawable.accessibility_auto_added_qs_tooltip_illustration; - mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(getContext()); - mTooltipWindow.setup(content, imageResId); - mTooltipWindow.showAtTopCenter(getView()); - AccessibilityQuickSettingUtils.optInValueToSharedPreferences(getContext(), - tileComponentName); - mNeedsQSTooltipReshow = false; } /** diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java b/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java index c613181d489..03b70e5eead 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java @@ -72,7 +72,6 @@ import com.android.settingslib.utils.StringUtil; import com.android.settingslib.widget.LottieColorUtils; import com.airbnb.lottie.LottieAnimationView; -import com.airbnb.lottie.LottieDrawable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -335,7 +334,8 @@ public final class AccessibilityShortcutsTutorial { result -> Log.w(TAG, "Invalid image raw resource id: " + imageRawRes, result)); lottieView.setAnimation(imageRawRes); - lottieView.setRepeatCount(LottieDrawable.INFINITE); + // Follow the Motion Stoppable requirement by using a finite animation. + lottieView.setRepeatCount(0); LottieColorUtils.applyDynamicColors(context, lottieView); lottieView.playAnimation(); @@ -496,10 +496,6 @@ public final class AccessibilityShortcutsTutorial { if ((shortcutTypes & shortcutType) == 0) { continue; } - if ((shortcutTypes & QUICK_SETTINGS) == QUICK_SETTINGS - && !android.view.accessibility.Flags.a11yQsShortcut()) { - continue; - } tutorialPages.add( createShortcutTutorialPage( context, shortcutType, buttonMode, featureName, inSetupWizard)); diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java index 82d32815bf5..d31720dc302 100644 --- a/src/com/android/settings/accessibility/AccessibilityUtil.java +++ b/src/com/android/settings/accessibility/AccessibilityUtil.java @@ -61,7 +61,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Set; -import java.util.StringJoiner; /** Provides utility methods to accessibility settings only. */ public final class AccessibilityUtil { @@ -203,28 +202,23 @@ public final class AccessibilityUtil { * @param context The current context. * @param shortcutTypes A combination of {@link UserShortcutType}. * @param componentName The component name that need to be opted in Settings. + * + * @deprecated use + * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. + * + * (TODO 367414968: finish removal.) */ + @Deprecated static void optInAllValuesToSettings(Context context, int shortcutTypes, @NonNull ComponentName componentName) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ true, - shortcutTypes, - Set.of(componentName.flattenToString()), - UserHandle.myUserId() - ); - } - - return; - } - - if ((shortcutTypes & SOFTWARE) == SOFTWARE) { - optInValueToSettings(context, SOFTWARE, componentName); - } - if (((shortcutTypes & HARDWARE) == HARDWARE)) { - optInValueToSettings(context, HARDWARE, componentName); + AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); + if (a11yManager != null) { + a11yManager.enableShortcutsForTargets( + /* enable= */ true, + shortcutTypes, + Set.of(componentName.flattenToString()), + UserHandle.myUserId() + ); } } @@ -234,38 +228,25 @@ public final class AccessibilityUtil { * @param context The current context. * @param shortcutType The preferred shortcut type user selected. * @param componentName The component name that need to be opted in Settings. + * + * @deprecated use + * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. + * + * (TODO 367414968: finish removal.) */ + @Deprecated @VisibleForTesting static void optInValueToSettings(Context context, @UserShortcutType int shortcutType, @NonNull ComponentName componentName) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ true, - shortcutType, - Set.of(componentName.flattenToString()), - UserHandle.myUserId() - ); - } - return; + AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); + if (a11yManager != null) { + a11yManager.enableShortcutsForTargets( + /* enable= */ true, + shortcutType, + Set.of(componentName.flattenToString()), + UserHandle.myUserId() + ); } - - final String targetKey = convertKeyFromSettings(shortcutType); - final String targetString = Settings.Secure.getString(context.getContentResolver(), - targetKey); - - if (hasValueInSettings(context, shortcutType, componentName)) { - return; - } - - final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR)); - if (!TextUtils.isEmpty(targetString)) { - joiner.add(targetString); - } - joiner.add(componentName.flattenToString()); - - Settings.Secure.putString(context.getContentResolver(), targetKey, joiner.toString()); } /** @@ -275,27 +256,23 @@ public final class AccessibilityUtil { * @param context The current context. * @param shortcutTypes A combination of {@link UserShortcutType}. * @param componentName The component name that need to be opted out from Settings. + * + * @deprecated use + * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. + * + * (TODO 367414968: finish removal.) */ + @Deprecated static void optOutAllValuesFromSettings(Context context, int shortcutTypes, @NonNull ComponentName componentName) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ false, - shortcutTypes, - Set.of(componentName.flattenToString()), - UserHandle.myUserId() - ); - } - return; - } - - if ((shortcutTypes & SOFTWARE) == SOFTWARE) { - optOutValueFromSettings(context, SOFTWARE, componentName); - } - if (((shortcutTypes & HARDWARE) == HARDWARE)) { - optOutValueFromSettings(context, HARDWARE, componentName); + AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); + if (a11yManager != null) { + a11yManager.enableShortcutsForTargets( + /* enable= */ false, + shortcutTypes, + Set.of(componentName.flattenToString()), + UserHandle.myUserId() + ); } } @@ -305,42 +282,25 @@ public final class AccessibilityUtil { * @param context The current context. * @param shortcutType The preferred shortcut type user selected. * @param componentName The component name that need to be opted out from Settings. + * + * @deprecated use + * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. + * + * (TODO 367414968: finish removal.) */ + @Deprecated @VisibleForTesting static void optOutValueFromSettings(Context context, @UserShortcutType int shortcutType, @NonNull ComponentName componentName) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ false, - shortcutType, - Set.of(componentName.flattenToString()), - UserHandle.myUserId() - ); - } - return; + AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); + if (a11yManager != null) { + a11yManager.enableShortcutsForTargets( + /* enable= */ false, + shortcutType, + Set.of(componentName.flattenToString()), + UserHandle.myUserId() + ); } - - final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR)); - final String targetKey = convertKeyFromSettings(shortcutType); - final String targetString = Settings.Secure.getString(context.getContentResolver(), - targetKey); - - if (TextUtils.isEmpty(targetString)) { - return; - } - - sStringColonSplitter.setString(targetString); - while (sStringColonSplitter.hasNext()) { - final String name = sStringColonSplitter.next(); - if (TextUtils.isEmpty(name) || (componentName.flattenToString()).equals(name)) { - continue; - } - joiner.add(name); - } - - Settings.Secure.putString(context.getContentResolver(), targetKey, joiner.toString()); } /** @@ -354,11 +314,6 @@ public final class AccessibilityUtil { static boolean hasValuesInSettings(Context context, int shortcutTypes, @NonNull ComponentName componentName) { for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { - if (!android.view.accessibility.Flags.a11yQsShortcut()) { - if ((shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { - continue; - } - } if (!android.provider.Flags.a11yStandaloneGestureEnabled()) { if ((shortcutType & GESTURE) == GESTURE) { continue; @@ -379,15 +334,16 @@ public final class AccessibilityUtil { * @param shortcutType The preferred shortcut type user selected. * @param componentName The component name that need to be checked existed in Settings. * @return {@code true} if componentName existed in Settings. + * + * @deprecated use + * {@link ShortcutUtils#isShortcutContained(Context, int, String)} instead. + * + * (TODO 367414968: finish removal.) */ + @Deprecated @VisibleForTesting static boolean hasValueInSettings(Context context, @UserShortcutType int shortcutType, @NonNull ComponentName componentName) { - if (!android.view.accessibility.Flags.a11yQsShortcut() - && (shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { - return false; - } - return ShortcutUtils.getShortcutTargetsFromSettings( context, shortcutType, UserHandle.myUserId() ).contains(componentName.flattenToString()); @@ -405,11 +361,6 @@ public final class AccessibilityUtil { @NonNull ComponentName componentName) { int shortcutTypes = DEFAULT; for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { - if (!android.view.accessibility.Flags.a11yQsShortcut()) { - if ((shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { - continue; - } - } if (!android.provider.Flags.a11yStandaloneGestureEnabled()) { if ((shortcutType & GESTURE) == GESTURE) { continue; @@ -428,23 +379,15 @@ public final class AccessibilityUtil { * * @param shortcutType The shortcut type. * @return Mapping key in Settings. + * + * @deprecated use + * {@link ShortcutUtils#convertToKey(int)} instead. + * + * (TODO 367414968: finish removal.) */ + @Deprecated static String convertKeyFromSettings(@UserShortcutType int shortcutType) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - return ShortcutUtils.convertToKey(shortcutType); - } - - switch (shortcutType) { - case SOFTWARE: - return Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS; - case HARDWARE: - return Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE; - case TRIPLETAP: - return Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED; - default: - throw new IllegalArgumentException( - "Unsupported userShortcutType " + shortcutType); - } + return ShortcutUtils.convertToKey(shortcutType); } /** @@ -521,10 +464,6 @@ public final class AccessibilityUtil { final List list = new ArrayList<>(); for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { - if (!android.view.accessibility.Flags.a11yQsShortcut() - && (shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { - continue; - } if (!android.provider.Flags.a11yStandaloneGestureEnabled() && (shortcutType & GESTURE) == GESTURE) { continue; diff --git a/src/com/android/settings/accessibility/ColorAndMotionFragment.java b/src/com/android/settings/accessibility/ColorAndMotionFragment.java index 7b2f04b9c21..2fde27988fd 100644 --- a/src/com/android/settings/accessibility/ColorAndMotionFragment.java +++ b/src/com/android/settings/accessibility/ColorAndMotionFragment.java @@ -76,9 +76,7 @@ public class ColorAndMotionFragment extends DashboardFragment { mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED); mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); - } + mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); if (Flags.forceInvertColor()) { mShortcutFeatureKeys.add(ToggleForceInvertPreferenceController.SETTINGS_KEY); } diff --git a/src/com/android/settings/accessibility/PreferredShortcuts.java b/src/com/android/settings/accessibility/PreferredShortcuts.java index 9006609091d..526b1fa8b39 100644 --- a/src/com/android/settings/accessibility/PreferredShortcuts.java +++ b/src/com/android/settings/accessibility/PreferredShortcuts.java @@ -17,7 +17,6 @@ package com.android.settings.accessibility; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import android.content.ComponentName; @@ -25,7 +24,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.UserHandle; import android.util.ArrayMap; -import android.view.accessibility.Flags; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; @@ -123,11 +121,6 @@ public final class PreferredShortcuts { @NonNull Context context, @NonNull Set components) { final Map> shortcutTypeToTargets = new ArrayMap<>(); for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { - if (!Flags.a11yQsShortcut() - && shortcutType == QUICK_SETTINGS) { - // Skip saving quick setting as preferred shortcut option when flag is not enabled - continue; - } shortcutTypeToTargets.put( shortcutType, ShortcutUtils.getShortcutTargetsFromSettings( diff --git a/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java b/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java index e7f59f49974..4e70103cfc7 100644 --- a/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java +++ b/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java @@ -16,9 +16,6 @@ package com.android.settings.accessibility; -import static com.android.internal.accessibility.AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_TILE_SERVICE_COMPONENT_NAME; - -import android.content.ComponentName; import android.content.Context; import android.database.ContentObserver; import android.hardware.display.ColorDisplayManager; @@ -29,12 +26,12 @@ import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; -import androidx.annotation.Nullable; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.server.display.feature.flags.Flags; import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; @@ -42,7 +39,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop; /** PreferenceController that shows the Reduce Bright Colors summary */ public class ReduceBrightColorsPreferenceController - extends AccessibilityQuickSettingsPrimarySwitchPreferenceController + extends TogglePreferenceController implements LifecycleObserver, OnStart, OnStop { private ContentObserver mSettingsContentObserver; private PrimarySwitchPreference mPreference; @@ -72,7 +69,6 @@ public class ReduceBrightColorsPreferenceController @Override public boolean setChecked(boolean isChecked) { - super.setChecked(isChecked); return mColorDisplayManager.setReduceBrightColorsActivated(isChecked); } @@ -125,20 +121,4 @@ public class ReduceBrightColorsPreferenceController public void onStop() { mContext.getContentResolver().unregisterContentObserver(mSettingsContentObserver); } - - @Nullable - @Override - protected ComponentName getTileComponentName() { - // TODO: When clean up the feature flag, change the parent class from - // AccessibilityQuickSettingsPrimarySwitchPreferenceController to - // TogglePreferenceController - return android.view.accessibility.Flags.a11yQsShortcut() - ? null : REDUCE_BRIGHT_COLORS_TILE_SERVICE_COMPONENT_NAME; - } - - @Override - CharSequence getTileTooltipContent() { - return mContext.getText( - R.string.accessibility_reduce_bright_colors_auto_added_qs_tooltip_content); - } } diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index e41d857bbdb..5ccea524cd0 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -452,15 +452,11 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override protected int getDefaultShortcutTypes() { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - AccessibilityServiceInfo info = getAccessibilityServiceInfo(); - boolean isAccessibilityTool = info != null && info.isAccessibilityTool(); - return !isAccessibilityTool || getTileComponentName() == null - ? super.getDefaultShortcutTypes() - : ShortcutConstants.UserShortcutType.QUICK_SETTINGS; - } - - return super.getDefaultShortcutTypes(); + AccessibilityServiceInfo info = getAccessibilityServiceInfo(); + boolean isAccessibilityTool = info != null && info.isAccessibilityTool(); + return !isAccessibilityTool || getTileComponentName() == null + ? super.getDefaultShortcutTypes() + : ShortcutConstants.UserShortcutType.QUICK_SETTINGS; } private void onAllowButtonFromEnableToggleClicked() { diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index a9f422e3749..b7f46025349 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -167,9 +167,7 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment final List shortcutFeatureKeys = new ArrayList<>(); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS); shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); - } + shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS); return shortcutFeatureKeys; } @@ -750,44 +748,13 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment showQuickSettingsTooltipIfNeeded(); } + /** + * @deprecated made obsolete by quick settings rollout. + * + * (TODO 367414968: finish removal.) + */ + @Deprecated private void showQuickSettingsTooltipIfNeeded() { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - // Don't show Quick Settings tooltip - return; - } - final ComponentName tileComponentName = getTileComponentName(); - if (tileComponentName == null) { - // Returns if no tile service assigned. - return; - } - - Activity activity = getActivity(); - if (activity != null && WizardManagerHelper.isAnySetupWizard(activity.getIntent())) { - // Don't show QuickSettingsTooltip in Setup Wizard - return; - } - - if (!mNeedsQSTooltipReshow && AccessibilityQuickSettingUtils.hasValueInSharedPreferences( - getContext(), tileComponentName)) { - // Returns if quick settings tooltip only show once. - return; - } - - final CharSequence content = getTileTooltipContent(mNeedsQSTooltipType); - if (TextUtils.isEmpty(content)) { - // Returns if no content of tile tooltip assigned. - return; - } - - final int imageResId = mNeedsQSTooltipType == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? R.drawable.accessibility_qs_tooltip_illustration - : R.drawable.accessibility_auto_added_qs_tooltip_illustration; - mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(getContext()); - mTooltipWindow.setup(content, imageResId); - mTooltipWindow.showAtTopCenter(getView()); - AccessibilityQuickSettingUtils.optInValueToSharedPreferences(getContext(), - tileComponentName); - mNeedsQSTooltipReshow = false; } /** Returns user visible name of the tile by given {@link ComponentName}. */ diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 68089d50d7e..f2254609ade 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -56,6 +56,7 @@ import androidx.preference.PreferenceCategory; import androidx.preference.SwitchPreferenceCompat; import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; +import com.android.internal.accessibility.util.ShortcutUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.server.accessibility.Flags; import com.android.settings.DialogCreatable; @@ -74,7 +75,6 @@ import com.google.android.setupcompat.util.WizardManagerHelper; import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.StringJoiner; import java.util.stream.Stream; /** @@ -203,13 +203,13 @@ public class ToggleScreenMagnificationPreferenceFragment extends } final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY); - // LINT.IfChange(:preference_list) + // LINT.IfChange(preference_list) addMagnificationModeSetting(generalCategory); addFollowTypingSetting(generalCategory); addOneFingerPanningSetting(generalCategory); addAlwaysOnSetting(generalCategory); addJoystickSetting(generalCategory); - // LINT.ThenChange(:search_data) + // LINT.ThenChange(search_data) } @Override @@ -588,70 +588,29 @@ public class ToggleScreenMagnificationPreferenceFragment extends optInMagnificationValueToSettings(context, TWOFINGER_DOUBLETAP); } } - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if (((shortcutTypes & QUICK_SETTINGS) - == QUICK_SETTINGS)) { - optInMagnificationValueToSettings(context, QUICK_SETTINGS); - } + if (((shortcutTypes & QUICK_SETTINGS) + == QUICK_SETTINGS)) { + optInMagnificationValueToSettings(context, QUICK_SETTINGS); } } + /** + * @deprecated use + * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. + * + * (TODO 367414968: finish removal.) + */ + @Deprecated private static void optInMagnificationValueToSettings( Context context, @UserShortcutType int shortcutType) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ true, - shortcutType, - Set.of(MAGNIFICATION_CONTROLLER_NAME), - UserHandle.myUserId() - ); - } - return; - } - - if (shortcutType == TRIPLETAP) { - Settings.Secure.putInt(context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ON); - return; - } - - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (shortcutType == TWOFINGER_DOUBLETAP) { - Settings.Secure.putInt( - context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED, - ON); - return; - } - } - - if (hasMagnificationValueInSettings(context, shortcutType)) { - return; - } - - final String targetKey = AccessibilityUtil.convertKeyFromSettings(shortcutType); - final String targetString = Settings.Secure.getString(context.getContentResolver(), - targetKey); - final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR)); - - if (!TextUtils.isEmpty(targetString)) { - joiner.add(targetString); - } - joiner.add(MAGNIFICATION_CONTROLLER_NAME); - - Settings.Secure.putString(context.getContentResolver(), targetKey, joiner.toString()); - // The size setting defaults to unknown. If the user has ever manually changed the size - // before, we do not automatically change it. - if (shortcutType == SOFTWARE - && Settings.Secure.getInt(context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.UNKNOWN) - == FloatingMenuSizePreferenceController.Size.UNKNOWN) { - Settings.Secure.putInt(context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.LARGE); + AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); + if (a11yManager != null) { + a11yManager.enableShortcutsForTargets( + /* enable= */ true, + shortcutType, + Set.of(MAGNIFICATION_CONTROLLER_NAME), + UserHandle.myUserId() + ); } } @@ -676,65 +635,30 @@ public class ToggleScreenMagnificationPreferenceFragment extends optOutMagnificationValueFromSettings(context, TWOFINGER_DOUBLETAP); } } - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if (((shortcutTypes & QUICK_SETTINGS) + if (((shortcutTypes & QUICK_SETTINGS) == QUICK_SETTINGS)) { - optOutMagnificationValueFromSettings(context, QUICK_SETTINGS); - } + optOutMagnificationValueFromSettings(context, QUICK_SETTINGS); } } + /** + * @deprecated use + * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. + * + * (TODO 367414968: finish removal.) + */ + @Deprecated private static void optOutMagnificationValueFromSettings(Context context, @UserShortcutType int shortcutType) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets( - /* enable= */ false, - shortcutType, - Set.of(MAGNIFICATION_CONTROLLER_NAME), - UserHandle.myUserId() - ); - } - return; + AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class); + if (a11yManager != null) { + a11yManager.enableShortcutsForTargets( + /* enable= */ false, + shortcutType, + Set.of(MAGNIFICATION_CONTROLLER_NAME), + UserHandle.myUserId() + ); } - - if (shortcutType == TRIPLETAP) { - Settings.Secure.putInt(context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF); - return; - } - - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (shortcutType == TWOFINGER_DOUBLETAP) { - Settings.Secure.putInt( - context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED, - OFF); - return; - } - } - - final String targetKey = AccessibilityUtil.convertKeyFromSettings(shortcutType); - final String targetString = Settings.Secure.getString(context.getContentResolver(), - targetKey); - - if (TextUtils.isEmpty(targetString)) { - return; - } - - final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR)); - - sStringColonSplitter.setString(targetString); - while (sStringColonSplitter.hasNext()) { - final String name = sStringColonSplitter.next(); - if (TextUtils.isEmpty(name) || MAGNIFICATION_CONTROLLER_NAME.equals(name)) { - continue; - } - joiner.add(name); - } - - Settings.Secure.putString(context.getContentResolver(), targetKey, joiner.toString()); } @VisibleForTesting @@ -788,15 +712,16 @@ public class ToggleScreenMagnificationPreferenceFragment extends return false; } + /** + * @deprecated use + * {@link ShortcutUtils#getEnabledShortcutTypes(Context, String)} instead. + * + * (TODO 367414968: finish removal.) + */ + @Deprecated private static int getUserShortcutTypeFromSettings(Context context) { int shortcutTypes = DEFAULT; for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { - if ((shortcutType & (TWOFINGER_DOUBLETAP | QUICK_SETTINGS | GESTURE | TRIPLETAP)) - == shortcutType - && !android.view.accessibility.Flags.a11yQsShortcut()) { - // These shortcuts will throw if we try to look up their settings without the flag. - continue; - } if (hasMagnificationValueInSettings(context, shortcutType)) { shortcutTypes |= shortcutType; } @@ -831,7 +756,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { - // LINT.IfChange(:search_data) + // LINT.IfChange(search_data) @Override public List getRawDataToIndex(Context context, boolean enabled) { @@ -887,7 +812,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends } return niks; } - // LINT.ThenChange(:preference_list) + // LINT.ThenChange(preference_list) private SearchIndexableRaw createPreferenceSearchData( Context context, Preference pref) { diff --git a/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java index eeecd1f3050..892ae1ef30d 100644 --- a/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java +++ b/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java @@ -25,7 +25,6 @@ import android.os.UserHandle; import android.service.quicksettings.TileService; import android.util.ArraySet; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.annotation.NonNull; import androidx.preference.Preference; @@ -82,8 +81,7 @@ public class QuickSettingsShortcutOptionController extends ShortcutOptionPrefere @Override protected boolean isShortcutAvailable() { - return Flags.a11yQsShortcut() - && TileService.isQuickSettingsSupported() + return TileService.isQuickSettingsSupported() && allTargetsHasQsTile() && allTargetsHasValidQsTileUseCase(); } diff --git a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreference.java b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreference.java index 26855d55bd3..7b61d935e7d 100644 --- a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreference.java +++ b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreference.java @@ -35,7 +35,6 @@ import com.android.settings.R; import com.android.settingslib.widget.LottieColorUtils; import com.airbnb.lottie.LottieAnimationView; -import com.airbnb.lottie.LottieDrawable; /** * A preference represents an accessibility shortcut option with a checkbox and a tutorial image @@ -96,7 +95,8 @@ public class ShortcutOptionPreference extends CheckBoxPreference { .getResourceEntryName(mIntroImageRawResId), result)); imageView.setAnimation(mIntroImageRawResId); - imageView.setRepeatCount(LottieDrawable.INFINITE); + // Follow the Motion Stoppable requirement by using a finite animation. + imageView.setRepeatCount(0); LottieColorUtils.applyDynamicColors(imageView.getContext(), imageView); imageView.playAnimation(); } else { diff --git a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java index defb256c8f5..afb5acf272c 100644 --- a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java +++ b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java @@ -19,7 +19,6 @@ package com.android.settings.accessibility.shortcuts; import android.content.Context; import android.os.UserHandle; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.annotation.NonNull; import androidx.preference.Preference; @@ -111,36 +110,27 @@ public abstract class ShortcutOptionPreferenceController extends BasePreferenceC return !targets.isEmpty() && targets.containsAll(getShortcutTargets()); } + /** * Enable or disable the shortcut for the given accessibility features. + * + * @deprecated use + * {@link AccessibilityManager#enableShortcutsForTargets(boolean, int, Set, int)} instead. + * + * (TODO 367414968: finish removal.) */ + @Deprecated protected void enableShortcutForTargets(boolean enable) { Set shortcutTargets = getShortcutTargets(); @ShortcutConstants.UserShortcutType int shortcutType = getShortcutType(); - if (Flags.a11yQsShortcut()) { - AccessibilityManager a11yManager = mContext.getSystemService( - AccessibilityManager.class); - if (a11yManager != null) { - a11yManager.enableShortcutsForTargets(enable, shortcutType, shortcutTargets, - UserHandle.myUserId()); - } - return; + AccessibilityManager a11yManager = mContext.getSystemService( + AccessibilityManager.class); + if (a11yManager != null) { + a11yManager.enableShortcutsForTargets(enable, shortcutType, shortcutTargets, + UserHandle.myUserId()); } - - if (enable) { - for (String target : shortcutTargets) { - ShortcutUtils.optInValueToSettings(mContext, shortcutType, target); - } - } else { - for (String target : shortcutTargets) { - ShortcutUtils.optOutValueFromSettings(mContext, shortcutType, target); - } - } - ShortcutUtils.updateInvisibleToggleAccessibilityServiceEnableState( - mContext, shortcutTargets, UserHandle.myUserId()); } - /** * Returns true when the user can associate a shortcut to the targets */ diff --git a/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java b/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java index 861bebd83ef..3f35d1cf4b8 100644 --- a/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java +++ b/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java @@ -19,14 +19,11 @@ package com.android.settings.accessibility.shortcuts; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import android.content.Context; -import android.provider.Settings; import android.view.View; -import android.view.accessibility.Flags; import com.android.internal.accessibility.common.ShortcutConstants; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityButtonFragment; -import com.android.settings.accessibility.FloatingMenuSizePreferenceController; import com.android.settings.core.SubSettingLauncher; import com.android.settings.utils.AnnotationSpan; @@ -62,26 +59,4 @@ public abstract class SoftwareShortcutOptionPreferenceController R.string.accessibility_shortcut_edit_dialog_summary_software_floating), linkInfo); } - - @Override - protected void enableShortcutForTargets(boolean enable) { - super.enableShortcutForTargets(enable); - if (Flags.a11yQsShortcut()) { - return; - } - - if (enable) { - // Update the A11y FAB size to large when the Magnification shortcut is enabled - // and the user hasn't changed the floating button size - if (isMagnificationInTargets() - && Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.UNKNOWN) - == FloatingMenuSizePreferenceController.Size.UNKNOWN) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.LARGE); - } - } - } } diff --git a/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java index bdec9a6f290..3f0d80a5966 100644 --- a/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java +++ b/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java @@ -20,7 +20,6 @@ import static com.android.internal.accessibility.AccessibilityShortcutController import android.content.Context; import android.provider.Settings; -import android.view.accessibility.Flags; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -99,17 +98,4 @@ public class TripleTapShortcutOptionController extends ShortcutOptionPreferenceC Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, AccessibilityUtil.State.OFF) == AccessibilityUtil.State.ON; } - - @Override - protected void enableShortcutForTargets(boolean enable) { - if (Flags.a11yQsShortcut()) { - super.enableShortcutForTargets(enable); - return; - } - - Settings.Secure.putInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, - enable ? AccessibilityUtil.State.ON : AccessibilityUtil.State.OFF); - } } diff --git a/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java index 26e8386efbc..c88a1ccb1a2 100644 --- a/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java +++ b/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java @@ -86,16 +86,4 @@ public class TwoFingerDoubleTapShortcutOptionController Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED, AccessibilityUtil.State.OFF) == AccessibilityUtil.State.ON; } - - @Override - protected void enableShortcutForTargets(boolean enable) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - super.enableShortcutForTargets(enable); - return; - } - Settings.Secure.putInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED, - enable ? AccessibilityUtil.State.ON : AccessibilityUtil.State.OFF); - } } diff --git a/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java index f3da35b66da..eb7b82d389f 100644 --- a/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java +++ b/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java @@ -17,14 +17,12 @@ package com.android.settings.accessibility.shortcuts; import android.content.Context; -import android.view.accessibility.Flags; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.internal.accessibility.common.ShortcutConstants; import com.android.settings.R; -import com.android.settings.accessibility.AccessibilityUtil; /** * A controller handles displaying the volume keys shortcut option preference and @@ -61,16 +59,4 @@ public class VolumeKeysShortcutOptionController extends ShortcutOptionPreference protected boolean isShortcutAvailable() { return true; } - - @Override - protected void enableShortcutForTargets(boolean enable) { - super.enableShortcutForTargets(enable); - if (Flags.a11yQsShortcut()) { - return; - } - - if (enable) { - AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(mContext); - } - } } diff --git a/src/com/android/settings/connecteddevice/display/DisplayTopology.kt b/src/com/android/settings/connecteddevice/display/DisplayTopology.kt index 81559027837..162d9d284fb 100644 --- a/src/com/android/settings/connecteddevice/display/DisplayTopology.kt +++ b/src/com/android/settings/connecteddevice/display/DisplayTopology.kt @@ -19,9 +19,118 @@ package com.android.settings.connecteddevice.display import com.android.settings.R import android.content.Context +import android.graphics.Point +import android.graphics.PointF +import android.graphics.RectF import androidx.preference.Preference +import java.util.Locale + +import kotlin.math.max +import kotlin.math.min + +/** + * Contains the parameters needed for transforming global display coordinates to and from topology + * pane coordinates. This is necessary for implementing an interactive display topology pane. The + * pane allows dragging and dropping display blocks into place to define the topology. Conversion to + * pane coordinates is necessary when rendering the original topology. Conversion in the other + * direction, to display coordinates, is necessary for resolve a drag position to display space. + * + * The topology pane coordinates are integral and represent the relative position from the upper- + * left corner of the pane. It uses a scale optimized for showing all displays with minimal or no + * scrolling. The display coordinates are floating point and the origin can be in any position. In + * practice the origin will be the upper-left coordinate of the primary display. + */ +class TopologyScale(paneWidth : Int, displaysPos : Collection) { + /** Scale of block sizes to real-world display sizes. Should be less than 1. */ + val blockRatio : Float + + /** Height of topology pane needed to allow all display blocks to appear with some padding. */ + val paneHeight : Int + + /** Pane's X view coordinate that corresponds with topology's X=0 coordinate. */ + val originPaneX : Int + + /** Pane's Y view coordinate that corresponds with topology's Y=0 coordinate. */ + val originPaneY : Int + + init { + val displayBounds = RectF( + Float.MAX_VALUE, Float.MAX_VALUE, Float.MIN_VALUE, Float.MIN_VALUE) + var smallestDisplayDim = Float.MAX_VALUE + var biggestDisplayHeight = Float.MIN_VALUE + + // displayBounds is the smallest rect encompassing all displays, in display space. + // smallestDisplayDim is the size of the smallest display edge, in display space. + for (pos in displaysPos) { + displayBounds.union(pos) + smallestDisplayDim = minOf(smallestDisplayDim, pos.height(), pos.width()) + biggestDisplayHeight = max(biggestDisplayHeight, pos.height()) + } + + // Set height according to the width and the aspect ratio of the display bounds. + // 0.05 is a reasonable limit to the size of display blocks. It appears to match the + // ratio used in the ChromeOS topology editor. It prevents blocks from being too large, + // which would make dragging and dropping awkward. + val rawBlockRatio = min(0.05, paneWidth.toDouble() * 0.6 / displayBounds.width()) + + // If the `ratio` is set too low because one of the displays will have an edge less than + // 48dp long, increase it such that the smallest edge is that long. This may override the + // 0.05 limit since it is more important than it. + blockRatio = max(48.0 / smallestDisplayDim, rawBlockRatio).toFloat() + + // Essentially, we just set the pane height based on the pre-determined pane width and the + // aspect ratio of the display bounds. But we may need to increase it slightly to achieve + // 20% padding above and below the display bounds - this is where the 0.6 comes from. + val rawPaneHeight = max( + paneWidth.toDouble() / displayBounds.width() * displayBounds.height(), + displayBounds.height() * blockRatio / 0.6) + + // It is easy for the aspect ratio to result in an excessively tall pane, since the width is + // pre-determined and may be considerably wider than necessary. So we prevent the height + // from growing too large here, by limiting vertical padding to the size of the tallest + // display. This improves results for very tall display bounds. + paneHeight = min( + rawPaneHeight.toInt(), + (blockRatio * (displayBounds.height() + biggestDisplayHeight * 2f)).toInt()) + + // Set originPaneXY (the location of 0,0 in display space in the pane's coordinate system) + // such that the display bounds rect is centered in the pane. + // It is unlikely that either of these coordinates will be negative since blockRatio has + // been chosen to allow 20% padding around each side of the display blocks. However, the + // a11y requirement applied above (48.0 / smallestDisplayDim) may cause the blocks to not + // fit. This should be rare in practice, and can be worked around by moving the settings UI + // to a larger display. + val blockMostLeft = (paneWidth - displayBounds.width() * blockRatio) / 2 + val blockMostTop = (paneHeight - displayBounds.height() * blockRatio) / 2 + + originPaneX = (blockMostLeft - displayBounds.left * blockRatio).toInt() + originPaneY = (blockMostTop - displayBounds.top * blockRatio).toInt() + } + + /** Transforms coordinates in view pane space to display space. */ + fun paneToDisplayCoor(panePos : Point) : PointF { + return PointF( + (panePos.x - originPaneX).toFloat() / blockRatio, + (panePos.y - originPaneY).toFloat() / blockRatio) + } + + /** Transforms coordinates in display space to view pane space. */ + fun displayToPaneCoor(displayPos : PointF) : Point { + return Point( + (displayPos.x * blockRatio).toInt() + originPaneX, + (displayPos.y * blockRatio).toInt() + originPaneY) + } + + override fun toString() : String { + return String.format( + Locale.ROOT, + "{TopoScale blockRatio=%f originPaneXY=%d,%d paneHeight=%d}", + blockRatio, originPaneX, originPaneY, paneHeight) + } +} + const val PREFERENCE_KEY = "display_topology_preference" /** diff --git a/src/com/android/settings/gestures/DoubleTapPowerForCameraPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerForCameraPreferenceController.java new file mode 100644 index 00000000000..0c7c65a7ffa --- /dev/null +++ b/src/com/android/settings/gestures/DoubleTapPowerForCameraPreferenceController.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; +import com.android.settingslib.widget.SelectorWithWidgetPreference; + +public class DoubleTapPowerForCameraPreferenceController extends BasePreferenceController + implements LifecycleObserver, OnStart, OnStop { + + @Nullable private Preference mPreference; + private final ContentObserver mSettingsObserver = + new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, @Nullable Uri uri) { + if (mPreference == null || uri == null) { + return; + } + if (uri.equals( + DoubleTapPowerSettingsUtils + .DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED_URI)) { + mPreference.setEnabled( + DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled( + mContext)); + } else if (uri.equals( + DoubleTapPowerSettingsUtils + .DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION_URI)) { + updateState(mPreference); + } + } + }; + + public DoubleTapPowerForCameraPreferenceController( + @NonNull Context context, @NonNull String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + if (!DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureAvailable(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } + return DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext) + ? AVAILABLE + : DISABLED_DEPENDENT_SETTING; + } + + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void updateState(@NonNull Preference preference) { + super.updateState(preference); + if (preference instanceof SelectorWithWidgetPreference) { + ((SelectorWithWidgetPreference) preference) + .setChecked( + DoubleTapPowerSettingsUtils + .isDoubleTapPowerButtonGestureForCameraLaunchEnabled(mContext)); + } + } + + @Override + public boolean handlePreferenceTreeClick(@NonNull Preference preference) { + if (!getPreferenceKey().equals(preference.getKey())) { + return false; + } + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForCameraLaunch(mContext); + if (preference instanceof SelectorWithWidgetPreference) { + ((SelectorWithWidgetPreference) preference).setChecked(true); + } + return true; + } + + @Override + public void onStart() { + DoubleTapPowerSettingsUtils.registerObserver(mContext, mSettingsObserver); + } + + @Override + public void onStop() { + DoubleTapPowerSettingsUtils.unregisterObserver(mContext, mSettingsObserver); + } +} diff --git a/src/com/android/settings/gestures/DoubleTapPowerForWalletPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerForWalletPreferenceController.java new file mode 100644 index 00000000000..56dda4d4953 --- /dev/null +++ b/src/com/android/settings/gestures/DoubleTapPowerForWalletPreferenceController.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; +import com.android.settingslib.widget.SelectorWithWidgetPreference; + +public class DoubleTapPowerForWalletPreferenceController extends BasePreferenceController + implements LifecycleObserver, OnStart, OnStop { + + @Nullable private Preference mPreference; + private final ContentObserver mSettingsObserver = + new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, @Nullable Uri uri) { + if (mPreference == null || uri == null) { + return; + } + if (uri.equals( + DoubleTapPowerSettingsUtils + .DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED_URI)) { + mPreference.setEnabled( + DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled( + mContext)); + } else if (uri.equals( + DoubleTapPowerSettingsUtils + .DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION_URI)) { + updateState(mPreference); + } + } + }; + + public DoubleTapPowerForWalletPreferenceController( + @NonNull Context context, @NonNull String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + if (!DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureAvailable(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } + return DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext) + ? AVAILABLE + : DISABLED_DEPENDENT_SETTING; + } + + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void updateState(@NonNull Preference preference) { + super.updateState(preference); + if (preference instanceof SelectorWithWidgetPreference) { + ((SelectorWithWidgetPreference) preference) + .setChecked( + !DoubleTapPowerSettingsUtils + .isDoubleTapPowerButtonGestureForCameraLaunchEnabled(mContext)); + } + } + + @Override + public boolean handlePreferenceTreeClick(@NonNull Preference preference) { + if (!getPreferenceKey().equals(preference.getKey())) { + return false; + } + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForWalletLaunch(mContext); + if (preference instanceof SelectorWithWidgetPreference) { + ((SelectorWithWidgetPreference) preference).setChecked(true); + } + return true; + } + + @Override + public void onStart() { + DoubleTapPowerSettingsUtils.registerObserver(mContext, mSettingsObserver); + } + + @Override + public void onStop() { + DoubleTapPowerSettingsUtils.unregisterObserver(mContext, mSettingsObserver); + } +} diff --git a/src/com/android/settings/gestures/DoubleTapPowerIllustrationPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerIllustrationPreferenceController.java new file mode 100644 index 00000000000..75af16845dc --- /dev/null +++ b/src/com/android/settings/gestures/DoubleTapPowerIllustrationPreferenceController.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static com.android.settings.gestures.DoubleTapPowerSettingsUtils.DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION_URI; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; +import com.android.settingslib.widget.IllustrationPreference; + +/** Configures the behaviour of the double tap power illustration. */ +public class DoubleTapPowerIllustrationPreferenceController extends BasePreferenceController + implements LifecycleObserver, OnStart, OnStop { + + @Nullable + private IllustrationPreference mIllustrationPreference; + private final ContentObserver mSettingsObserver = + new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, @Nullable Uri uri) { + if (mIllustrationPreference != null && uri != null) { + updateState(mIllustrationPreference); + } + } + }; + + public DoubleTapPowerIllustrationPreferenceController( + @NonNull Context context, @NonNull String key) { + super(context, key); + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } + + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + mIllustrationPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void updateState(@NonNull Preference preference) { + super.updateState(preference); + + ((IllustrationPreference) preference) + .setLottieAnimationResId( + DoubleTapPowerSettingsUtils + .isDoubleTapPowerButtonGestureForCameraLaunchEnabled( + mContext) + ? R.drawable.quickly_open_camera + : R.drawable.double_tap_power_for_wallet); + } + + @Override + public void onStart() { + final ContentResolver resolver = mContext.getContentResolver(); + resolver.registerContentObserver( + DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION_URI, true, mSettingsObserver); + } + + @Override + public void onStop() { + DoubleTapPowerSettingsUtils.unregisterObserver(mContext, mSettingsObserver); + } +} diff --git a/src/com/android/settings/gestures/DoubleTapPowerMainSwitchPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerMainSwitchPreferenceController.java new file mode 100644 index 00000000000..3eb18eb931d --- /dev/null +++ b/src/com/android/settings/gestures/DoubleTapPowerMainSwitchPreferenceController.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static com.android.settings.gestures.DoubleTapPowerSettingsUtils.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED_URI; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.settings.R; +import com.android.settings.widget.SettingsMainSwitchPreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + +/** The controller to handle double tap power button main switch enable or disable state. */ +public class DoubleTapPowerMainSwitchPreferenceController + extends SettingsMainSwitchPreferenceController + implements LifecycleObserver, OnStart, OnStop { + + private final ContentObserver mSettingsObserver = + new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, @Nullable Uri uri) { + if (mSwitchPreference == null || uri == null) { + return; + } + updateState(mSwitchPreference); + } + }; + + public DoubleTapPowerMainSwitchPreferenceController( + @NonNull Context context, @NonNull String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + return DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureAvailable(mContext) + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean isChecked() { + return DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext); + } + + @Override + public boolean setChecked(boolean isChecked) { + return DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled( + mContext, isChecked); + } + + @Override + public void onStart() { + final ContentResolver resolver = mContext.getContentResolver(); + resolver.registerContentObserver( + DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED_URI, true, mSettingsObserver); + } + + @Override + public void onStop() { + DoubleTapPowerSettingsUtils.unregisterObserver(mContext, mSettingsObserver); + } + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_system; + } +} diff --git a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java index 3d2e1768b2e..686d64cf1f5 100644 --- a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java +++ b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java @@ -21,22 +21,17 @@ import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_D import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings; -import android.text.TextUtils; -import androidx.annotation.VisibleForTesting; +import androidx.annotation.NonNull; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; -public class DoubleTapPowerPreferenceController extends GesturePreferenceController { +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; - @VisibleForTesting - static final int ON = 0; - @VisibleForTesting - static final int OFF = 1; +public class DoubleTapPowerPreferenceController extends BasePreferenceController { - private static final String PREF_KEY_VIDEO = "gesture_double_tap_power_video"; - - private final String SECURE_KEY = CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED; - - public DoubleTapPowerPreferenceController(Context context, String key) { + public DoubleTapPowerPreferenceController(@NonNull Context context, @NonNull String key) { super(context, key); } @@ -45,9 +40,13 @@ public class DoubleTapPowerPreferenceController extends GesturePreferenceControl || prefs.getBoolean(DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, false); } - private static boolean isGestureAvailable(Context context) { - return context.getResources() - .getBoolean(com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled); + private static boolean isGestureAvailable(@NonNull Context context) { + if (!android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap()) { + return context.getResources() + .getBoolean( + com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled); + } + return DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureAvailable(context); } @Override @@ -56,30 +55,41 @@ public class DoubleTapPowerPreferenceController extends GesturePreferenceControl } @Override - public boolean isSliceable() { - return TextUtils.equals(getPreferenceKey(), "gesture_double_tap_power"); + public void displayPreference(@NonNull PreferenceScreen screen) { + if (!android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap()) { + final Preference preference = screen.findPreference(getPreferenceKey()); + if (preference != null) { + preference.setTitle(R.string.double_tap_power_for_camera_title); + } + } + super.displayPreference(screen); } @Override - public boolean isPublicSlice() { - return true; - } - - @Override - protected String getVideoPrefKey() { - return PREF_KEY_VIDEO; - } - - @Override - public boolean isChecked() { - final int cameraDisabled = Settings.Secure.getInt(mContext.getContentResolver(), - SECURE_KEY, ON); - return cameraDisabled == ON; - } - - @Override - public boolean setChecked(boolean isChecked) { - return Settings.Secure.putInt(mContext.getContentResolver(), SECURE_KEY, - isChecked ? ON : OFF); + @NonNull + public CharSequence getSummary() { + if (!android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap()) { + final boolean isCameraDoubleTapPowerGestureEnabled = + Settings.Secure.getInt( + mContext.getContentResolver(), + CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, + DoubleTapPowerToOpenCameraPreferenceController.ON) + == DoubleTapPowerToOpenCameraPreferenceController.ON; + return mContext.getText( + isCameraDoubleTapPowerGestureEnabled + ? R.string.gesture_setting_on + : R.string.gesture_setting_off); + } + if (DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext)) { + final CharSequence onString = + mContext.getText(com.android.settings.R.string.gesture_setting_on); + final CharSequence actionString = + DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureForCameraLaunchEnabled( + mContext) + ? mContext.getText(R.string.double_tap_power_camera_action_summary) + : mContext.getText(R.string.double_tap_power_wallet_action_summary); + return mContext.getString(R.string.double_tap_power_summary, onString, actionString); + } + return mContext.getText(com.android.settings.R.string.gesture_setting_off); } } diff --git a/src/com/android/settings/gestures/DoubleTapPowerSettings.java b/src/com/android/settings/gestures/DoubleTapPowerSettings.java index 577758df396..076f23fa660 100644 --- a/src/com/android/settings/gestures/DoubleTapPowerSettings.java +++ b/src/com/android/settings/gestures/DoubleTapPowerSettings.java @@ -19,6 +19,9 @@ package com.android.settings.gestures; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.SharedPreferences; +import android.provider.SearchIndexableResource; + +import androidx.annotation.NonNull; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -27,6 +30,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; +import java.util.List; + @SearchIndexable public class DoubleTapPowerSettings extends DashboardFragment { @@ -56,9 +61,24 @@ public class DoubleTapPowerSettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.double_tap_power_settings; + return android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap() + ? R.xml.double_tap_power_settings + : R.xml.double_tap_power_to_open_camera_settings; } public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.double_tap_power_settings); + new BaseSearchIndexProvider() { + @Override + @NonNull + public List getXmlResourcesToIndex( + @NonNull Context context, boolean enabled) { + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = + android.service.quickaccesswallet.Flags + .launchWalletOptionOnPowerDoubleTap() + ? R.xml.double_tap_power_settings + : R.xml.double_tap_power_to_open_camera_settings; + return List.of(sir); + } + }; } diff --git a/src/com/android/settings/gestures/DoubleTapPowerSettingsUtils.java b/src/com/android/settings/gestures/DoubleTapPowerSettingsUtils.java new file mode 100644 index 00000000000..a1bf9cbd48c --- /dev/null +++ b/src/com/android/settings/gestures/DoubleTapPowerSettingsUtils.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2016 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.settings.gestures; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.provider.Settings; + +import androidx.annotation.NonNull; + +import com.android.internal.R; + +/** Common code for double tap power settings shared between controllers. */ +final class DoubleTapPowerSettingsUtils { + + /** Setting storing whether the double tap power button gesture is enabled. */ + private static final String DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED = + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED; + + static final Uri DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED_URI = + Settings.Secure.getUriFor(DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED); + + /** Setting storing the target action of the double tap power button gesture. */ + private static final String DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION = + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE; + + static final Uri DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION_URI = + Settings.Secure.getUriFor(DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION); + + private static final int DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE = 0; + private static final int DOUBLE_TAP_POWER_BUTTON_WALLET_LAUNCH_VALUE = 1; + + static final int ON = 1; + static final int OFF = 0; + + /** + * @return true if double tap power button gesture is available. + */ + public static boolean isDoubleTapPowerButtonGestureAvailable(@NonNull Context context) { + return context.getResources().getBoolean(R.bool.config_doubleTapPowerGestureEnabled); + } + + /** + * Gets double tap power button gesture enable or disable flag from Settings provider. + * + * @return true if double tap on the power button gesture is currently enabled. + * @param context App context + */ + public static boolean isDoubleTapPowerButtonGestureEnabled(@NonNull Context context) { + return Settings.Secure.getInt( + context.getContentResolver(), DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, ON) + == ON; + } + + /** + * Sets double tap power button gesture enable or disable flag to Settings provider. + * + * @param context App context + * @param enable enable or disable double tap power button gesture. + * @return {@code true} if the setting is updated. + */ + public static boolean setDoubleTapPowerButtonGestureEnabled( + @NonNull Context context, boolean enable) { + return Settings.Secure.putInt( + context.getContentResolver(), + DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, + enable ? ON : OFF); + } + + /** + * @return true if double tap on the power button gesture for camera launch is currently + * enabled. + * @param context App context + */ + public static boolean isDoubleTapPowerButtonGestureForCameraLaunchEnabled( + @NonNull Context context) { + return Settings.Secure.getInt( + context.getContentResolver(), + DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION, + context.getResources() + .getInteger( + com.android.internal.R.integer + .config_defaultDoubleTapPowerGestureAction)) + == DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE; + } + + /** + * Sets double tap power button gesture behavior to launch the camera. + * + * @param context App context + * @return {@code true} if the setting is updated. + */ + public static boolean setDoubleTapPowerButtonForCameraLaunch(@NonNull Context context) { + return Settings.Secure.putInt( + context.getContentResolver(), + DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION, + DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE); + } + + /** + * Sets double tap power button gesture behavior to launch the wallet. + * + * @param context App context + * @return {@code true} if the setting is updated. + */ + public static boolean setDoubleTapPowerButtonForWalletLaunch(@NonNull Context context) { + return Settings.Secure.putInt( + context.getContentResolver(), + DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION, + DOUBLE_TAP_POWER_BUTTON_WALLET_LAUNCH_VALUE); + } + + /** + * Registers observer for settings state. + * + * @param observer Settings Content Observer + */ + public static void registerObserver( + @NonNull Context context, @NonNull ContentObserver observer) { + final ContentResolver resolver = context.getContentResolver(); + resolver.registerContentObserver( + DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED_URI, true, observer); + resolver.registerContentObserver( + DOUBLE_TAP_POWER_BUTTON_GESTURE_TARGET_ACTION_URI, true, observer); + } + + /** Unregisters observer. */ + public static void unregisterObserver( + @NonNull Context context, @NonNull ContentObserver observer) { + final ContentResolver resolver = context.getContentResolver(); + resolver.unregisterContentObserver(observer); + } +} diff --git a/src/com/android/settings/gestures/DoubleTapPowerToOpenCameraPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerToOpenCameraPreferenceController.java new file mode 100644 index 00000000000..4362a661007 --- /dev/null +++ b/src/com/android/settings/gestures/DoubleTapPowerToOpenCameraPreferenceController.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED; + +import android.content.Context; +import android.provider.Settings; +import android.text.TextUtils; + +import androidx.annotation.NonNull; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; + +public class DoubleTapPowerToOpenCameraPreferenceController extends TogglePreferenceController { + + static final int ON = 0; + static final int OFF = 1; + + public DoubleTapPowerToOpenCameraPreferenceController( + @NonNull Context context, @NonNull String key) { + super(context, key); + } + + @Override + public int getAvailabilityStatus() { + return mContext.getResources() + .getBoolean( + com.android.internal.R.bool + .config_cameraDoubleTapPowerGestureEnabled) + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean isChecked() { + return Settings.Secure.getInt( + mContext.getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON) + == ON; + } + + @Override + public boolean setChecked(boolean isChecked) { + return Settings.Secure.putInt( + mContext.getContentResolver(), + CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, + isChecked ? ON : OFF); + } + + @Override + public boolean isSliceable() { + return TextUtils.equals(getPreferenceKey(), "gesture_double_tap_power"); + } + + @Override + public boolean isPublicSlice() { + return true; + } + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_system; + } +} diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt index 8d8fcba8b8c..6d9800b5c5a 100644 --- a/src/com/android/settings/network/SimOnboardingActivity.kt +++ b/src/com/android/settings/network/SimOnboardingActivity.kt @@ -109,6 +109,12 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { } var targetSubId = intent.getIntExtra(SUB_ID,SubscriptionManager.INVALID_SUBSCRIPTION_ID) + if (targetSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + targetSubId = intent.getIntExtra( + Settings.EXTRA_SUB_ID, + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ) + } initServiceData(this, targetSubId, callbackListener) if (!onboardingService.isUsableTargetSubscriptionId) { Log.e(TAG, "The subscription id is not usable.") @@ -608,4 +614,4 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { CALLBACK_FINISH(5) } } -} \ No newline at end of file +} diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java index 3d9d41cb6bf..44fd43f7d19 100644 --- a/src/com/android/settings/sim/SimSelectNotification.java +++ b/src/com/android/settings/sim/SimSelectNotification.java @@ -42,6 +42,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.os.UserManager; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -91,6 +92,11 @@ public class SimSelectNotification extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + UserManager userManager = context.getSystemService(UserManager.class); + if (userManager != null && !userManager.isMainUser()) { + Log.d(TAG, "The userId is not the main user"); + return; + } if (!SubscriptionUtil.isSimHardwareVisible(context)) { Log.w(TAG, "Received unexpected intent with null action."); return; diff --git a/src/com/android/settings/wifi/WifiSwitchPreference.kt b/src/com/android/settings/wifi/WifiSwitchPreference.kt index 72bee592d52..2a18d3f5616 100644 --- a/src/com/android/settings/wifi/WifiSwitchPreference.kt +++ b/src/com/android/settings/wifi/WifiSwitchPreference.kt @@ -16,22 +16,31 @@ package com.android.settings.wifi +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.net.wifi.WifiManager import android.os.UserManager import android.provider.Settings import android.util.Log +import android.widget.Toast import androidx.preference.Preference +import androidx.preference.Preference.OnPreferenceChangeListener import com.android.settings.PreferenceRestrictionMixin import com.android.settings.R import com.android.settings.network.SatelliteRepository -import com.android.settings.overlay.FeatureFactory.Companion.featureFactory -import com.android.settings.widget.GenericSwitchController +import com.android.settings.network.SatelliteWarningDialogActivity import com.android.settingslib.RestrictedSwitchPreference import com.android.settingslib.WirelessUtils +import com.android.settingslib.datastore.AbstractKeyedDataObservable +import com.android.settingslib.datastore.DataChangeReason import com.android.settingslib.datastore.KeyValueStore -import com.android.settingslib.datastore.NoOpKeyedObservable -import com.android.settingslib.metadata.* +import com.android.settingslib.metadata.PreferenceLifecycleProvider +import com.android.settingslib.metadata.PreferenceMetadata +import com.android.settingslib.metadata.ReadWritePermit +import com.android.settingslib.metadata.SensitivityLevel +import com.android.settingslib.metadata.SwitchPreference import com.android.settingslib.preference.SwitchPreferenceBinding import java.util.concurrent.Executors import java.util.concurrent.TimeUnit @@ -40,12 +49,10 @@ import java.util.concurrent.TimeUnit class WifiSwitchPreference : SwitchPreference(KEY, R.string.wifi), SwitchPreferenceBinding, + OnPreferenceChangeListener, PreferenceLifecycleProvider, PreferenceRestrictionMixin { - // TODO(b/372733639) Remove WifiEnabler and migrate to catalyst - private var wifiEnabler: WifiEnabler? = null - override val keywords: Int get() = R.string.keywords_wifi @@ -57,21 +64,57 @@ class WifiSwitchPreference : override val useAdminDisabledSummary: Boolean get() = true + override fun createWidget(context: Context) = RestrictedSwitchPreference(context) + + override fun bind(preference: Preference, metadata: PreferenceMetadata) { + super.bind(preference, metadata) + preference.onPreferenceChangeListener = this + } + + override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + val context = preference.context + + // Show dialog and do nothing under satellite mode. + if (context.isSatelliteOn()) { + context.startActivity( + Intent(context, SatelliteWarningDialogActivity::class.java) + .putExtra( + SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, + SatelliteWarningDialogActivity.TYPE_IS_WIFI, + ) + ) + return false + } + + // Show toast message if Wi-Fi is not allowed in airplane mode + if (newValue == true && !context.isRadioAllowed()) { + Toast.makeText(context, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show() + return false + } + + return true + } + override fun getReadPermit(context: Context, myUid: Int, callingUid: Int) = ReadWritePermit.ALLOW override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) = when { - isRadioAllowed(context, value) && !isSatelliteOn(context) -> ReadWritePermit.ALLOW - else -> ReadWritePermit.DISALLOW + (value == true && !context.isRadioAllowed()) || context.isSatelliteOn() -> + ReadWritePermit.DISALLOW + else -> ReadWritePermit.ALLOW } + override val sensitivityLevel + get() = SensitivityLevel.LOW_SENSITIVITY + override fun storage(context: Context): KeyValueStore = WifiSwitchStore(context) @Suppress("UNCHECKED_CAST") private class WifiSwitchStore(private val context: Context) : - NoOpKeyedObservable(), - KeyValueStore { + AbstractKeyedDataObservable(), KeyValueStore { + + private var broadcastReceiver: BroadcastReceiver? = null override fun contains(key: String) = key == KEY && context.getSystemService(WifiManager::class.java) != null @@ -85,60 +128,51 @@ class WifiSwitchPreference : context.getSystemService(WifiManager::class.java)?.isWifiEnabled = value } } - } - override fun onCreate(context: PreferenceLifecycleContext) { - context.requirePreference(KEY).let { - it.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference, newValue: Any -> - if (!isRadioAllowed(context, newValue as Boolean?)) { - Log.w(TAG, "Don't set APM, AIRPLANE_MODE_RADIOS is not allowed") - return@OnPreferenceChangeListener false + override fun onFirstObserverAdded() { + broadcastReceiver = + object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val wifiState = intent.wifiState + // do not notify for enabling/disabling state + if ( + wifiState == WifiManager.WIFI_STATE_ENABLED || + wifiState == WifiManager.WIFI_STATE_DISABLED + ) { + notifyChange(KEY, DataChangeReason.UPDATE) + } } - if (isSatelliteOn(context)) { - Log.w(TAG, "Don't set APM, the satellite is on") - return@OnPreferenceChangeListener false - } - return@OnPreferenceChangeListener true } - val widget = GenericSwitchController(it) - wifiEnabler = WifiEnabler(context, widget, featureFactory.metricsFeatureProvider) - Log.i(TAG, "Create WifiEnabler:$wifiEnabler") + context.registerReceiver( + broadcastReceiver, + IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION), + ) } - } - override fun onResume(context: PreferenceLifecycleContext) { - wifiEnabler?.resume(context) - } - - override fun onPause(context: PreferenceLifecycleContext) { - wifiEnabler?.pause() - } - - override fun onDestroy(context: PreferenceLifecycleContext) { - wifiEnabler?.teardownSwitchController() - wifiEnabler = null - } - - private fun isRadioAllowed(context: Context, newValue: Boolean?): Boolean { - newValue?.let { if (!it) return true } ?: return false - return WirelessUtils.isRadioAllowed(context, Settings.Global.RADIO_WIFI) - } - - private fun isSatelliteOn(context: Context): Boolean { - try { - return SatelliteRepository(context) - .requestIsSessionStarted(Executors.newSingleThreadExecutor()) - .get(2000, TimeUnit.MILLISECONDS) - } catch (e: Exception) { - Log.e(TAG, "Error to get satellite status : $e") + override fun onLastObserverRemoved() { + broadcastReceiver?.let { context.unregisterReceiver(it) } } - return false } companion object { const val TAG = "WifiSwitchPreference" const val KEY = "main_toggle_wifi" + + private fun Context.isRadioAllowed() = + WirelessUtils.isRadioAllowed(this, Settings.Global.RADIO_WIFI) + + private fun Context.isSatelliteOn() = + try { + SatelliteRepository(this) + .requestIsSessionStarted(Executors.newSingleThreadExecutor()) + .get(2000, TimeUnit.MILLISECONDS) + } catch (e: Exception) { + Log.e(TAG, "Error to get satellite status : $e") + false + } + + private val Intent.wifiState + get() = getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN) } } // LINT.ThenChange(WifiSwitchPreferenceController.java) diff --git a/tests/robotests/src/com/android/settings/TestingSettingsBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/TestingSettingsBroadcastReceiverTest.java index 10fdffbc3ed..eb51ae87876 100644 --- a/tests/robotests/src/com/android/settings/TestingSettingsBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/TestingSettingsBroadcastReceiverTest.java @@ -18,9 +18,13 @@ package com.android.settings; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + import android.app.Application; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.telephony.TelephonyManager; import org.junit.Before; @@ -29,6 +33,7 @@ import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; +import org.robolectric.shadows.ShadowBuild; @RunWith(RobolectricTestRunner.class) public class TestingSettingsBroadcastReceiverTest { @@ -78,4 +83,68 @@ public class TestingSettingsBroadcastReceiverTest { final String dest = next.getComponent().getClassName(); assertThat(dest).isEqualTo(Settings.TestingSettingsActivity.class.getName()); } + + @Test + public void onReceive_disabledForUserBuild_BuildType_User_shouldNotStartActivity() { + // TestingSettingsMenu should be disabled if current Build.TYPE is "user" and + // 'config_hide_testing_settings_menu_for_user_builds' is true + ShadowBuild.setType("user"); + + mContext = spy(RuntimeEnvironment.application); + setUpConfig(mContext, true /*disable for user build*/); + + final Intent intent = new Intent(); + intent.setAction(TelephonyManager.ACTION_SECRET_CODE); + + mReceiver.onReceive(mContext, intent); + + final Intent next = Shadows.shadowOf(mApplication).getNextStartedActivity(); + assertThat(next).isNull(); + } + + @Test + public void onReceive_disabledForUserBuild_BuildType_Userdebug_shouldStartActivity() { + // TestingSettingsMenu should not be disabled if current Build.TYPE is "userdebug" and + // 'config_hide_testing_settings_menu_for_user_builds' is true + ShadowBuild.setType("userdebug"); + + mContext = spy(RuntimeEnvironment.application); + setUpConfig(mContext, true /*disable for user build*/); + + final Intent intent = new Intent(); + intent.setAction(TelephonyManager.ACTION_SECRET_CODE); + + mReceiver.onReceive(mContext, intent); + + final Intent next = Shadows.shadowOf(mApplication).getNextStartedActivity(); + assertThat(next).isNotNull(); + final String dest = next.getComponent().getClassName(); + assertThat(dest).isEqualTo(Settings.TestingSettingsActivity.class.getName()); + } + + @Test + public void onReceive_notDisabledForUserBuildType_shouldStartActivity() { + // TestingSettingsMenu should not be disabled if + // 'config_hide_testing_settings_menu_for_user_builds' is false, regardless of Build.TYPE + mContext = spy(RuntimeEnvironment.application); + setUpConfig(mContext, false /*disable for user build*/); + + final Intent intent = new Intent(); + intent.setAction(TelephonyManager.ACTION_SECRET_CODE); + + mReceiver.onReceive(mContext, intent); + + final Intent next = Shadows.shadowOf(mApplication).getNextStartedActivity(); + assertThat(next).isNotNull(); + final String dest = next.getComponent().getClassName(); + assertThat(dest).isEqualTo(Settings.TestingSettingsActivity.class.getName()); + } + + private static void setUpConfig(Context context, boolean disabledForUserBuild) { + when(context.getApplicationContext()).thenReturn(context); + Resources spiedResources = spy(context.getResources()); + when(context.getResources()).thenReturn(spiedResources); + when(spiedResources.getBoolean(R.bool.config_hide_testing_settings_menu_for_user_builds)) + .thenReturn(disabledForUserBuild); + } } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest.java deleted file mode 100644 index 08cbaae4efc..00000000000 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2022 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.settings.accessibility; - -import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_SAVED_QS_TOOLTIP_RESHOW; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -import android.content.ComponentName; -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.widget.LinearLayout; -import android.widget.PopupWindow; - -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.preference.PreferenceViewHolder; -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.testutils.shadow.ShadowFragment; -import com.android.settingslib.PrimarySwitchPreference; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Answers; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; -import org.robolectric.shadow.api.Shadow; -import org.robolectric.shadows.ShadowApplication; -import org.robolectric.shadows.ShadowLooper; - -/** - * Tests for {@link AccessibilityQuickSettingsPrimarySwitchPreferenceController}. - */ -@RunWith(RobolectricTestRunner.class) -public class AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest { - - private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example"; - private static final String PLACEHOLDER_TILE_CLASS_NAME = - PLACEHOLDER_PACKAGE_NAME + "tile.placeholder"; - private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName( - PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME); - private static final CharSequence PLACEHOLDER_TILE_CONTENT = - PLACEHOLDER_TILE_CLASS_NAME + ".tile.content"; - private static final String TEST_KEY = "test_pref_key"; - private static final String TEST_TITLE = "test_title"; - - @Rule - public final MockitoRule mockito = MockitoJUnit.rule(); - - @Spy - private final Context mContext = ApplicationProvider.getApplicationContext(); - - private TestAccessibilityQuickSettingsPrimarySwitchPreferenceController mController; - private PrimarySwitchPreference mPreference; - private TestFragment mFragment; - private PreferenceScreen mScreen; - private PreferenceViewHolder mHolder; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private PreferenceManager mPreferenceManager; - - private static PopupWindow getLatestPopupWindow() { - final ShadowApplication shadowApplication = - Shadow.extract(ApplicationProvider.getApplicationContext()); - return shadowApplication.getLatestPopupWindow(); - } - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - - mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat); - mFragment = spy(new TestFragment()); - when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); - when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); - when(mFragment.getContext()).thenReturn(mContext); - mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null)); - when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager); - doReturn(mScreen).when(mFragment).getPreferenceScreen(); - - mPreference = new PrimarySwitchPreference(mContext); - mPreference.setKey(TEST_KEY); - mPreference.setTitle(TEST_TITLE); - LayoutInflater inflater = LayoutInflater.from(mContext); - mHolder = PreferenceViewHolder.createInstanceForTests(inflater.inflate( - com.android.settingslib.widget.preference.twotarget.R.layout.preference_two_target, null)); - LinearLayout mWidgetView = mHolder.itemView.findViewById(android.R.id.widget_frame); - inflater.inflate(R.layout.preference_widget_primary_switch, mWidgetView, true); - mPreference.onBindViewHolder(mHolder); - - mController = new TestAccessibilityQuickSettingsPrimarySwitchPreferenceController(mContext, - TEST_KEY); - when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); - } - - @Test - public void setChecked_showTooltipView() { - mController.displayPreference(mScreen); - - mController.setChecked(true); - - assertThat(getLatestPopupWindow().isShowing()).isTrue(); - } - - @Test - public void setChecked_notCallDisplayPreference_notShowTooltipView() { - // Simulates the slice highlight menu that does not call {@link #displayPreference} before - // {@link #setChecked} called. - mController.setChecked(true); - - assertThat(getLatestPopupWindow()).isNull(); - } - - @Test - public void setChecked_tooltipViewShown_notShowTooltipView() { - mController.displayPreference(mScreen); - mController.setChecked(true); - getLatestPopupWindow().dismiss(); - mController.setChecked(false); - - mController.setChecked(true); - - assertThat(getLatestPopupWindow().isShowing()).isFalse(); - } - - @Test - @Config(shadows = ShadowFragment.class) - public void restoreValueFromSavedInstanceState_showTooltipView() { - final Bundle savedInstanceState = new Bundle(); - savedInstanceState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true); - mController.onCreate(savedInstanceState); - - mController.displayPreference(mScreen); - ShadowLooper.idleMainLooper(); - - assertThat(getLatestPopupWindow().isShowing()).isTrue(); - } - - public static class TestAccessibilityQuickSettingsPrimarySwitchPreferenceController - extends AccessibilityQuickSettingsPrimarySwitchPreferenceController { - - public TestAccessibilityQuickSettingsPrimarySwitchPreferenceController(Context context, - String preferenceKey) { - super(context, preferenceKey); - } - - @Override - ComponentName getTileComponentName() { - return PLACEHOLDER_TILE_COMPONENT_NAME; - } - - @Override - CharSequence getTileTooltipContent() { - return PLACEHOLDER_TILE_CONTENT; - } - } - - private static class TestFragment extends SettingsPreferenceFragment { - - @Override - protected boolean shouldSkipForInitialSUW() { - return false; - } - - @Override - public int getMetricsCategory() { - return 0; - } - } -} diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java index 56384f446e8..0c942e317dc 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java @@ -376,21 +376,7 @@ public class AccessibilitySettingsTest { } @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void onCreate_flagDisabled_haveRegisterToSpecificUrisAndActions() { - setupFragment(); - - assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, - AccessibilitySettingsContentObserver.class).isTrue(); - assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, - AccessibilitySettingsContentObserver.class).isTrue(); - assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_QS_TARGETS, - AccessibilitySettingsContentObserver.class).isFalse(); - } - - @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void onCreate_flagEnabled_haveRegisterToSpecificUrisAndActions() { + public void onCreate_haveRegisterToSpecificUrisAndActions() { setupFragment(); assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java index 9d18c44e392..ca18e269a50 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java @@ -19,7 +19,6 @@ package com.android.settings.accessibility; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; -import static com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment.KEY_SAVED_QS_TOOLTIP_RESHOW; import static com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import static com.google.common.truth.Truth.assertThat; @@ -38,14 +37,11 @@ import android.content.Context; import android.content.Intent; import android.icu.text.CaseMap; import android.os.Bundle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.accessibility.Flags; import android.widget.PopupWindow; import androidx.annotation.Nullable; @@ -156,25 +152,6 @@ public class AccessibilityShortcutPreferenceFragmentTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - @Config(shadows = ShadowFragment.class) - public void restoreValueFromSavedInstanceState_showTooltipView() { - mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat); - mFragment.showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_EDIT); - assertThat(getLatestPopupWindow().isShowing()).isTrue(); - - final Bundle savedInstanceState = new Bundle(); - savedInstanceState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true); - mFragment.onAttach(mContext); - mFragment.onCreate(savedInstanceState); - mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY); - mFragment.onViewCreated(mFragment.getView(), savedInstanceState); - - assertThat(getLatestPopupWindow().isShowing()).isTrue(); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) @Config(shadows = ShadowFragment.class) public void showQuickSettingsTooltipIfNeeded_qsFlagOn_dontShowTooltipView() { mFragment.showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_EDIT); @@ -219,7 +196,6 @@ public class AccessibilityShortcutPreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void getShortcutTypeSummary_shortcutSummaryIsCorrectlySet() { final PreferredShortcut userPreferredShortcut = new PreferredShortcut( PLACEHOLDER_COMPONENT_NAME.flattenToString(), diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java index cd8743d595b..779866229ce 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java @@ -133,7 +133,6 @@ public final class AccessibilityShortcutsTutorialTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void createTutorialPages_turnOnQuickSettingShortcut_hasOnePage() { mShortcutTypes |= QUICK_SETTINGS; @@ -260,7 +259,6 @@ public final class AccessibilityShortcutsTutorialTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void createAccessibilityTutorialDialog_qsShortcut_inSuwTalkbackOn_verifyText() { mShortcutTypes |= QUICK_SETTINGS; setTouchExplorationEnabled(true); @@ -292,7 +290,6 @@ public final class AccessibilityShortcutsTutorialTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void createAccessibilityTutorialDialog_qsShortcut_notInSuwTalkbackOn_verifyText() { mShortcutTypes |= QUICK_SETTINGS; setTouchExplorationEnabled(true); @@ -318,7 +315,6 @@ public final class AccessibilityShortcutsTutorialTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void createAccessibilityTutorialDialog_qsShortcut_inSuwTalkbackOff_verifyText() { mShortcutTypes |= QUICK_SETTINGS; setTouchExplorationEnabled(false); @@ -349,7 +345,6 @@ public final class AccessibilityShortcutsTutorialTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void createAccessibilityTutorialDialog_qsShortcut_notInSuwTalkbackOff_verifyText() { mShortcutTypes |= QUICK_SETTINGS; setTouchExplorationEnabled(false); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java index ee3d9360e2c..24db847dffa 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java @@ -46,7 +46,6 @@ import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.test.core.app.ApplicationProvider; @@ -203,7 +202,6 @@ public final class AccessibilityUtilTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void getUserShortcutTypeFromSettings_threeShortcutTypesChosen() { setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString()); setShortcut(HARDWARE, MOCK_COMPONENT_NAME.flattenToString()); @@ -220,22 +218,6 @@ public final class AccessibilityUtilTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void optInAllValuesToSettings_optInValue_haveMatchString() { - clearShortcuts(); - int shortcutTypes = SOFTWARE | HARDWARE; - - AccessibilityUtil.optInAllValuesToSettings(mContext, shortcutTypes, MOCK_COMPONENT_NAME); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo( - MOCK_COMPONENT_NAME.flattenToString()); - assertThat(getStringFromSettings(HARDWARE_SHORTCUT_KEY)).isEqualTo( - MOCK_COMPONENT_NAME.flattenToString()); - - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void optInAllValuesToSettings_optInValue_callsA11yManager() { AccessibilityManager a11yManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext); @@ -252,20 +234,6 @@ public final class AccessibilityUtilTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void optInValueToSettings_optInValue_haveMatchString() { - setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString()); - - AccessibilityUtil.optInValueToSettings(mContext, SOFTWARE, - MOCK_COMPONENT_NAME2); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo( - MOCK_COMPONENT_NAME.flattenToString() + ":" - + MOCK_COMPONENT_NAME2.flattenToString()); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void optInValueToSettings_optInValue_callsA11yManager() { AccessibilityManager a11yManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext); @@ -281,37 +249,6 @@ public final class AccessibilityUtilTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void optInValueToSettings_optInTwoValues_haveMatchString() { - setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString()); - - AccessibilityUtil.optInValueToSettings(mContext, SOFTWARE, - MOCK_COMPONENT_NAME2); - AccessibilityUtil.optInValueToSettings(mContext, SOFTWARE, - MOCK_COMPONENT_NAME2); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo( - MOCK_COMPONENT_NAME.flattenToString() + ":" - + MOCK_COMPONENT_NAME2.flattenToString()); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void optOutAllValuesToSettings_optOutValue_emptyString() { - setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString()); - setShortcut(HARDWARE, MOCK_COMPONENT_NAME.flattenToString()); - int shortcutTypes = - SOFTWARE | HARDWARE | TRIPLETAP; - - AccessibilityUtil.optOutAllValuesFromSettings(mContext, shortcutTypes, - MOCK_COMPONENT_NAME); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEmpty(); - assertThat(getStringFromSettings(HARDWARE_SHORTCUT_KEY)).isEmpty(); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void optOutAllValuesToSettings_optOutValue_callsA1yManager() { AccessibilityManager a11yManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext); @@ -331,31 +268,6 @@ public final class AccessibilityUtilTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void optOutValueFromSettings_optOutValue_emptyString() { - setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString()); - - AccessibilityUtil.optOutValueFromSettings(mContext, SOFTWARE, - MOCK_COMPONENT_NAME); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEmpty(); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void optOutValueFromSettings_optOutValue_haveMatchString() { - setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString(), - MOCK_COMPONENT_NAME2.flattenToString()); - - AccessibilityUtil.optOutValueFromSettings(mContext, SOFTWARE, - MOCK_COMPONENT_NAME2); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo( - MOCK_COMPONENT_NAME.flattenToString()); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void optOutValueFromSettings_optOutValue_callsA11yManager() { AccessibilityManager a11yManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext); @@ -389,7 +301,6 @@ public final class AccessibilityUtilTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void convertKeyFromSettings_shortcutTypeMultiFingersMultiTap() { assertThat(AccessibilityUtil.convertKeyFromSettings(TWOFINGER_DOUBLETAP)) .isEqualTo( @@ -397,7 +308,6 @@ public final class AccessibilityUtilTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void convertKeyFromSettings_shortcutTypeQuickSettings() { assertThat(AccessibilityUtil.convertKeyFromSettings(QUICK_SETTINGS)) .isEqualTo(Settings.Secure.ACCESSIBILITY_QS_TARGETS); diff --git a/tests/robotests/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceControllerTest.java index 78f49a66906..76b93b03c94 100644 --- a/tests/robotests/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceControllerTest.java @@ -26,8 +26,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; import android.content.ContentResolver; diff --git a/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java index 355e8c32041..da8059c25ec 100644 --- a/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java @@ -30,10 +30,10 @@ import android.provider.Settings; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; -import com.android.settings.core.BasePreferenceController; import com.android.settings.R; -import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor; +import com.android.settings.core.BasePreferenceController; import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor; import com.android.settings.widget.SeekBarPreference; import com.android.settingslib.core.lifecycle.Lifecycle; diff --git a/tests/robotests/src/com/android/settings/accessibility/MediaVibrationTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MediaVibrationTogglePreferenceControllerTest.java index 501bbb0e102..348ac45c5dd 100644 --- a/tests/robotests/src/com/android/settings/accessibility/MediaVibrationTogglePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/MediaVibrationTogglePreferenceControllerTest.java @@ -31,9 +31,9 @@ import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import androidx.test.core.app.ApplicationProvider; +import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.testutils.shadow.SettingsShadowResources; -import com.android.settings.R; import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.After; @@ -42,8 +42,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.annotation.Config; import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; /** Test for {@link MediaVibrationIntensityPreferenceController}. */ @RunWith(RobolectricTestRunner.class) diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java index 008f542b500..70290af8a61 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java @@ -34,13 +34,8 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.os.Bundle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; -import android.platform.test.flag.junit.SetFlagsRule; -import android.provider.Settings; import android.service.quicksettings.TileService; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; @@ -55,7 +50,6 @@ import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragm import com.android.settings.widget.SettingsMainSwitchPreference; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; @@ -75,8 +69,6 @@ import java.util.Set; @RunWith(RobolectricTestRunner.class) public class ToggleAccessibilityServicePreferenceFragmentTest { - @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example"; private static final String PLACEHOLDER_PACKAGE_NAME2 = "com.placeholder.example2"; private static final String PLACEHOLDER_SERVICE_CLASS_NAME = "a11yservice1"; @@ -314,30 +306,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void getDefaultShortcutTypes_noAssociatedTile_softwareTypeIsDefault() throws Throwable { - PreferredShortcuts.clearPreferredShortcuts(mContext); - setupAccessibilityServiceInfoForFragment( - /* isAccessibilityTool= */ true, - /* tileService= */ null - /* warningRequired= */); - - assertThat(mFragment.getDefaultShortcutTypes()) - .isEqualTo(ShortcutConstants.UserShortcutType.SOFTWARE); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void getDefaultShortcutTypes_hasAssociatedTile_softwareTypeIsDefault() { - PreferredShortcuts.clearPreferredShortcuts(mContext); - when(mFragment.getTileComponentName()).thenReturn(PLACEHOLDER_TILE_COMPONENT_NAME); - - assertThat(mFragment.getDefaultShortcutTypes()) - .isEqualTo(ShortcutConstants.UserShortcutType.SOFTWARE); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void getDefaultShortcutTypes_isAccessibilityTool_hasAssociatedTile_qsTypeIsDefault() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -351,7 +319,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void getDefaultShortcutTypes_isNotAccessibilityTool_hasAssociatedTile_softwareTypeIsDefault() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -365,7 +332,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void getDefaultShortcutTypes_isAccessibilityTool_noAssociatedTile_softwareTypeIsDefault() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -379,7 +345,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void getDefaultShortcutTypes_isNotAccessibilityTool_noAssociatedTile_softwareTypeIsDefault() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -393,7 +358,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_noUserPreferredShortcut_hasQsTile_enableQsShortcut() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -413,7 +377,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_noUserPreferredShortcut_noQsTile_enableSoftwareShortcut() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -433,47 +396,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void toggleShortcutPreference_noUserPreferredShortcut_hasQsTile_flagOff_enableSoftwareShortcut() - throws Throwable { - PreferredShortcuts.clearPreferredShortcuts(mContext); - setupAccessibilityServiceInfoForFragment( - /* isAccessibilityTool= */ true, - /* tileService= */ PLACEHOLDER_TILE_COMPONENT_NAME - /* warningRequired= */); - mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */ null); - - mFragment.mShortcutPreference.setChecked(true); - mFragment.onToggleClicked(mFragment.mShortcutPreference); - - assertThat( - Settings.Secure.getString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)) - .contains(mFragment.mComponentName.flattenToString()); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void toggleShortcutPreference_noUserPreferredShortcut_noQsTile_flagOff_enableSoftwareShortcut() - throws Throwable { - PreferredShortcuts.clearPreferredShortcuts(mContext); - setupAccessibilityServiceInfoForFragment( - /* isAccessibilityTool= */ true, - /* tileService= */ null - /* warningRequired= */); - mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */ null); - - mFragment.mShortcutPreference.setChecked(true); - mFragment.onToggleClicked(mFragment.mShortcutPreference); - - assertThat( - Settings.Secure.getString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)) - .contains(mFragment.mComponentName.flattenToString()); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_userPreferVolumeKeysShortcut_noQsTile_enableVolumeKeysShortcut() throws Throwable { setupAccessibilityServiceInfoForFragment( @@ -498,7 +420,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_userPreferVolumeKeysShortcut_hasQsTile_enableVolumeKeysShortcut() throws Throwable { setupAccessibilityServiceInfoForFragment( diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java index e9711864909..cbd449305d4 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java @@ -139,25 +139,6 @@ public class ToggleColorInversionPreferenceFragmentTest { assertThat(getLatestPopupWindow()).isNull(); } - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void onPreferenceToggled_colorCorrectDisabled_shouldReturnTrueAndShowTooltipView() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, OFF); - mSwitchPreference.setChecked(false); - mFragment.onAttach(mContext); - mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY); - mFragment.onViewCreated(mFragment.getView(), Bundle.EMPTY); - - mFragment.onPreferenceToggled(mSwitchPreference.getKey(), true); - - final boolean isEnabled = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, OFF) == ON; - assertThat(isEnabled).isTrue(); - assertThat(getLatestPopupWindow()).isNotNull(); - assertThat(getLatestPopupWindow().isShowing()).isTrue(); - } - @Test public void onPreferenceToggled_colorCorrectEnabled_shouldReturnFalseAndNotShowTooltipView() { Settings.Secure.putInt(mContext.getContentResolver(), diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java index a33fefbb404..390a8ca6e38 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java @@ -106,23 +106,6 @@ public class ToggleDaltonizerPreferenceFragmentTest { assertThat(getLatestPopupWindow()).isNull(); } - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void onPreferenceToggled_colorCorrectDisabled_shouldReturnTrueAndShowTooltipView() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF); - ToggleDaltonizerPreferenceFragment fragment = getFragmentInResumedState(); - SettingsMainSwitchPreference switchPreference = getMainFeatureToggle(fragment); - - fragment.onPreferenceToggled(switchPreference.getKey(), true); - - final boolean isEnabled = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF) == ON; - assertThat(isEnabled).isTrue(); - assertThat(getLatestPopupWindow()).isNotNull(); - assertThat(getLatestPopupWindow().isShowing()).isTrue(); - } - @Test public void onPreferenceToggled_colorCorrectEnabled_shouldReturnFalseAndNotShowTooltipView() { Settings.Secure.putInt(mContext.getContentResolver(), diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java index 844fabe2647..87ab52dbab5 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java @@ -26,7 +26,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -38,7 +37,6 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.icu.text.CaseMap; import android.os.Bundle; -import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; @@ -142,7 +140,6 @@ public class ToggleFeaturePreferenceFragmentTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) @Config(shadows = {ShadowFragment.class}) public void onResume_flagEnabled_haveRegisterToSpecificUris() { mFragment.onAttach(mContext); @@ -166,31 +163,6 @@ public class ToggleFeaturePreferenceFragmentTest { any(AccessibilitySettingsContentObserver.class)); } - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - @Config(shadows = {ShadowFragment.class}) - public void onResume_flagDisabled_haveRegisterToSpecificUris() { - mFragment.onAttach(mContext); - mFragment.onCreate(Bundle.EMPTY); - - mFragment.onResume(); - - verify(mContentResolver).registerContentObserver( - eq(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)), - eq(false), - any(AccessibilitySettingsContentObserver.class)); - verify(mContentResolver).registerContentObserver( - eq(Settings.Secure.getUriFor( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)), - eq(false), - any(AccessibilitySettingsContentObserver.class)); - verify(mContentResolver, never()).registerContentObserver( - eq(Settings.Secure.getUriFor( - Settings.Secure.ACCESSIBILITY_QS_TARGETS)), - eq(false), - any(AccessibilitySettingsContentObserver.class)); - } - @Test public void updateShortcutPreferenceData_assignDefaultValueToVariable() { mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME; @@ -240,15 +212,6 @@ public class ToggleFeaturePreferenceFragmentTest { assertThat(getLatestPopupWindow()).isNull(); } - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - @Config(shadows = ShadowFragment.class) - public void onPreferenceToggledOnEnabledService_showTooltipView() { - mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ true); - - assertThat(getLatestPopupWindow().isShowing()).isTrue(); - } - @Test @Config(shadows = ShadowFragment.class) public void onPreferenceToggledOnEnabledService_inSuw_toolTipViewShouldNotShow() { @@ -261,18 +224,6 @@ public class ToggleFeaturePreferenceFragmentTest { assertThat(getLatestPopupWindow()).isNull(); } - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - @Config(shadows = ShadowFragment.class) - public void onPreferenceToggledOnEnabledService_tooltipViewShown_notShowTooltipView() { - mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ true); - getLatestPopupWindow().dismiss(); - - mFragment.onPreferenceToggled(mFragment.getUseServicePreferenceKey(), /* enabled= */ true); - - assertThat(getLatestPopupWindow().isShowing()).isFalse(); - } - @Test public void initTopIntroPreference_hasTopIntroTitle_shouldSetAsExpectedValue() { mFragment.mTopIntroTitle = DEFAULT_TOP_INTRO; @@ -365,7 +316,6 @@ public class ToggleFeaturePreferenceFragmentTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) @Config(shadows = ShadowFragment.class) public void showQuickSettingsTooltipIfNeeded_qsFlagOn_dontShowTooltipView() { mFragment.showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_EDIT); @@ -374,7 +324,6 @@ public class ToggleFeaturePreferenceFragmentTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void getShortcutTypeSummary_shortcutSummaryIsCorrectlySet() { final PreferredShortcut userPreferredShortcut = new PreferredShortcut( PLACEHOLDER_COMPONENT_NAME.flattenToString(), diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java index 87632ae8a64..0b385941997 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java @@ -337,8 +337,7 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void onResume_flagEnabled_haveRegisterToSpecificUris() { + public void onResume_haveRegisterToSpecificUris() { ShadowContentResolver shadowContentResolver = Shadows.shadowOf( mContext.getContentResolver()); Uri[] observedUri = new Uri[]{ @@ -367,38 +366,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { } } - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void onResume_flagDisabled_haveRegisterToSpecificUris() { - ShadowContentResolver shadowContentResolver = Shadows.shadowOf( - mContext.getContentResolver()); - Uri[] observedUri = new Uri[]{ - Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS), - Settings.Secure.getUriFor( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE), - Settings.Secure.getUriFor( - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED), - Settings.Secure.getUriFor( - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED) - }; - for (Uri uri : observedUri) { - // verify no observer registered before launching the fragment - assertThat(shadowContentResolver.getContentObservers(uri)).isEmpty(); - } - - mFragController.create(R.id.main_content, /* bundle= */ null).start().resume(); - - for (Uri uri : observedUri) { - Collection observers = shadowContentResolver.getContentObservers(uri); - assertThat(observers.size()).isEqualTo(1); - assertThat(observers.stream().findFirst().get()).isInstanceOf( - AccessibilitySettingsContentObserver.class); - } - assertThat(shadowContentResolver.getContentObservers( - Settings.Secure.getUriFor( - Settings.Secure.ACCESSIBILITY_QS_TARGETS))).hasSize(0); - } - @Test @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE) public void onResume_oneFingerPanningFlagOn_registerToSpecificUri() { @@ -462,20 +429,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { } @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void optInAllValuesToSettings_optInValue_haveMatchString() { - int shortcutTypes = SOFTWARE | TRIPLETAP; - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings(mContext, - shortcutTypes); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo( - MAGNIFICATION_CONTROLLER_NAME); - assertThat(getMagnificationTripleTapStatus()).isTrue(); - } - - @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void optInAllValuesToSettings_optInValue_callA11yManager() { int shortcutTypes = SOFTWARE | TRIPLETAP | HARDWARE @@ -500,45 +453,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { verifyNoMoreInteractions(mAccessibilityManager); } - @Test - @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE) - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void optInAllValuesToSettings_twoFingerTripleTap_haveMatchString() { - int shortcutTypes = TWOFINGER_DOUBLETAP; - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings(mContext, - shortcutTypes); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, OFF)).isEqualTo(ON); - } - - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void optInAllValuesToSettings_existOtherValue_optInValue_haveMatchString() { - putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, PLACEHOLDER_COMPONENT_NAME.flattenToString()); - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings(mContext, - SOFTWARE); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo( - PLACEHOLDER_COMPONENT_NAME.flattenToString() + ":" + MAGNIFICATION_CONTROLLER_NAME); - } - - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void optInAllValuesToSettings_software_sizeValueIsNull_putLargeSizeValue() { - ShadowSettings.ShadowSecure.reset(); - - ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings(mContext, - SOFTWARE); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.UNKNOWN)).isEqualTo( - FloatingMenuSizePreferenceController.Size.LARGE); - } - @Test public void optInAllValuesToSettings_software_sizeValueIsNotNull_sizeValueIsNotChanged() { for (int size : new int[]{FloatingMenuSizePreferenceController.Size.LARGE, @@ -594,24 +508,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { } @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void optOutAllValuesToSettings_optOutValue_emptyString() { - putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME); - putStringIntoSettings(HARDWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME); - setMagnificationTripleTapEnabled(/* enabled= */ true); - int shortcutTypes = - SOFTWARE | HARDWARE | TRIPLETAP; - - ToggleScreenMagnificationPreferenceFragment.optOutAllMagnificationValuesFromSettings( - mContext, shortcutTypes); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEmpty(); - assertThat(getStringFromSettings(HARDWARE_SHORTCUT_KEY)).isEmpty(); - assertThat(getMagnificationTripleTapStatus()).isFalse(); - } - - @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void optOutAllValuesToSettings_optOutValue_callA11yManager() { Set shortcutTargets = Set.of(MAGNIFICATION_CONTROLLER_NAME); putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME); @@ -635,38 +531,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { verifyNoMoreInteractions(mAccessibilityManager); } - @Test - @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE) - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void optOutAllValuesToSettings_twoFingerTripleTap_settingsValueIsOff() { - Settings.Secure.putInt(mContext.getContentResolver(), - TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON); - - ToggleScreenMagnificationPreferenceFragment.optOutAllMagnificationValuesFromSettings( - mContext, TWOFINGER_DOUBLETAP); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON)).isEqualTo(OFF); - } - - @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void optOutValueFromSettings_existOtherValue_optOutValue_haveMatchString() { - putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, - PLACEHOLDER_COMPONENT_NAME.flattenToString() + ":" + MAGNIFICATION_CONTROLLER_NAME); - putStringIntoSettings(HARDWARE_SHORTCUT_KEY, - PLACEHOLDER_COMPONENT_NAME.flattenToString() + ":" + MAGNIFICATION_CONTROLLER_NAME); - int shortcutTypes = SOFTWARE | HARDWARE; - - ToggleScreenMagnificationPreferenceFragment.optOutAllMagnificationValuesFromSettings( - mContext, shortcutTypes); - - assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo( - PLACEHOLDER_COMPONENT_NAME.flattenToString()); - assertThat(getStringFromSettings(HARDWARE_SHORTCUT_KEY)).isEqualTo( - PLACEHOLDER_COMPONENT_NAME.flattenToString()); - } - @Test public void updateShortcutPreferenceData_assignDefaultValueToVariable() { mFragController.create(R.id.main_content, /* bundle= */ null).start().resume(); @@ -979,7 +843,6 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { } @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void getShortcutTypeSummary_shortcutSummaryIsCorrectlySet() { final PreferredShortcut userPreferredShortcut = new PreferredShortcut( MAGNIFICATION_CONTROLLER_NAME, diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java index b3270e95c11..dd898e39175 100644 --- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java @@ -46,7 +46,6 @@ import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.util.Pair; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.annotation.Nullable; import androidx.fragment.app.FragmentActivity; @@ -466,7 +465,6 @@ public class EditShortcutsPreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void fragmentResumed_enableTouchExploration_qsShortcutOptionSummaryUpdated() { String expectedSummary = StringUtil.getIcuPluralsString(mContext, 2, R.string.accessibility_shortcut_edit_dialog_summary_quick_settings); @@ -486,7 +484,6 @@ public class EditShortcutsPreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void fragmentPaused_enableTouchExploration_qsShortcutOptionSummaryNotUpdated() { String expectedSummary = StringUtil.getIcuPluralsString(mContext, 1, R.string.accessibility_shortcut_edit_dialog_summary_quick_settings); @@ -644,7 +641,6 @@ public class EditShortcutsPreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void onQuickSettingsShortcutSettingChanged_preferredShortcutsUpdated() { final String target = TARGET_FAKE_COMPONENT.flattenToString(); mFragmentScenario = createFragScenario( diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java index 55fbd8e3249..8f26c99be11 100644 --- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java @@ -27,11 +27,7 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.content.ComponentName; import android.content.Context; import android.os.UserHandle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; -import android.platform.test.flag.junit.SetFlagsRule; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; @@ -45,7 +41,6 @@ import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settingslib.utils.StringUtil; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -67,8 +62,6 @@ public class QuickSettingsShortcutOptionControllerTest { private static final String TARGET_FLATTEN = TARGET.flattenToString(); private static final ComponentName TARGET_TILE = new ComponentName("FakePackage", "FakeTileClass"); - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private final Context mContext = spy(ApplicationProvider.getApplicationContext()); private QuickSettingsShortcutOptionController mController; @@ -149,13 +142,6 @@ public class QuickSettingsShortcutOptionControllerTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void isShortcutAvailable_a11yQsShortcutFlagDisabled_returnsFalse() { - assertThat(mController.isShortcutAvailable()).isFalse(); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void isShortcutAvailable_qsNotSupported_returnsFalse() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_quickSettingsSupported, false); @@ -164,7 +150,6 @@ public class QuickSettingsShortcutOptionControllerTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void isShortcutAvailable_qsTileProvided_returnsTrue() { when(mAccessibilityManager.getA11yFeatureToTileMap(UserHandle.myUserId())) .thenReturn(Map.of(TARGET, TARGET_TILE)); @@ -173,7 +158,6 @@ public class QuickSettingsShortcutOptionControllerTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void isShortcutAvailable_qsTileNotProvided_returnsFalse() { when(mAccessibilityManager.getA11yFeatureToTileMap(UserHandle.myUserId())) .thenReturn(Collections.emptyMap()); @@ -182,7 +166,6 @@ public class QuickSettingsShortcutOptionControllerTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void isShortcutAvailable_qsTileProvided_invalidUseCase_returnFalse() { AccessibilityServiceInfo mockStandardA11yService = AccessibilityTestUtils.createAccessibilityServiceInfo( @@ -197,7 +180,6 @@ public class QuickSettingsShortcutOptionControllerTest { } @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void isShortcutAvailable_qsTileProvided_validUseCase_returnTrue() { AccessibilityServiceInfo mockAlwaysOnA11yService = AccessibilityTestUtils.createAccessibilityServiceInfo( diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java index 1eeb9446c21..74e9870522a 100644 --- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java @@ -33,14 +33,11 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.os.UserHandle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.text.SpannableStringBuilder; import android.view.View; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.fragment.app.FragmentActivity; @@ -50,10 +47,8 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SubSettings; import com.android.settings.accessibility.AccessibilityButtonFragment; -import com.android.settings.accessibility.FloatingMenuSizePreferenceController; import com.android.settings.testutils.AccessibilityTestUtils; import com.android.settings.utils.AnnotationSpan; -import com.android.settingslib.accessibility.AccessibilityUtils; import org.junit.Before; import org.junit.Rule; @@ -178,23 +173,6 @@ public class SoftwareShortcutOptionPreferenceControllerTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableShortcut_shortcutTurnedOn() { - String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString(); - mController.setShortcutTargets(Set.of(target)); - assertThat(ShortcutUtils.isComponentIdExistingInSettings( - mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target - )).isFalse(); - - mController.enableShortcutForTargets(true); - - assertThat(ShortcutUtils.isComponentIdExistingInSettings( - mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target - )).isTrue(); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_enableShortcut_callA11yManager() { String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString(); mController.setShortcutTargets(Set.of(target)); @@ -214,25 +192,6 @@ public class SoftwareShortcutOptionPreferenceControllerTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_disableShortcut_shortcutTurnedOff() { - String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString(); - ShortcutUtils.optInValueToSettings( - mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target); - assertThat(ShortcutUtils.isComponentIdExistingInSettings( - mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target - )).isTrue(); - mController.setShortcutTargets(Set.of(target)); - - mController.enableShortcutForTargets(false); - - assertThat(ShortcutUtils.isComponentIdExistingInSettings( - mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target - )).isFalse(); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_disableShortcut_callA11yManager() { String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString(); ShortcutUtils.optInValueToSettings( @@ -253,89 +212,6 @@ public class SoftwareShortcutOptionPreferenceControllerTest { verifyNoMoreInteractions(mAccessibilityManager); } - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableShortcutWithMagnification_menuSizeIncreased() { - mController.setShortcutTargets(Set.of(TARGET_MAGNIFICATION)); - - mController.enableShortcutForTargets(true); - - assertThat( - Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.UNKNOWN)) - .isEqualTo(FloatingMenuSizePreferenceController.Size.LARGE); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableShortcutWithMagnification_userConfigureSmallMenuSize_menuSizeNotChanged() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.SMALL); - mController.setShortcutTargets(Set.of(TARGET_MAGNIFICATION)); - - mController.enableShortcutForTargets(true); - - assertThat( - Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE, - FloatingMenuSizePreferenceController.Size.UNKNOWN)) - .isEqualTo(FloatingMenuSizePreferenceController.Size.SMALL); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableAlwaysOnServiceShortcut_turnsOnAlwaysOnService() { - mController.setShortcutTargets( - Set.of(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString())); - - mController.enableShortcutForTargets(true); - - assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext)) - .contains(TARGET_ALWAYS_ON_A11Y_SERVICE); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_disableAlwaysOnServiceShortcut_turnsOffAlwaysOnService() { - mController.setShortcutTargets( - Set.of(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString())); - - mController.enableShortcutForTargets(false); - - assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext)) - .doesNotContain(TARGET_ALWAYS_ON_A11Y_SERVICE); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableStandardServiceShortcut_wontTurnOnService() { - mController.setShortcutTargets( - Set.of(TARGET_STANDARD_A11Y_SERVICE.flattenToString())); - - mController.enableShortcutForTargets(true); - - assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext)) - .doesNotContain(TARGET_STANDARD_A11Y_SERVICE); - } - - @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_disableStandardServiceShortcutWithServiceOn_wontTurnOffService() { - mController.setShortcutTargets( - Set.of(TARGET_STANDARD_A11Y_SERVICE.flattenToString())); - AccessibilityUtils.setAccessibilityServiceState( - mContext, TARGET_STANDARD_A11Y_SERVICE, /* enabled= */ true); - - mController.enableShortcutForTargets(false); - - assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext)) - .contains(TARGET_STANDARD_A11Y_SERVICE); - } - private void assertLaunchSettingsPage(String page) { ContextWrapper applicationContext = (Application) mContext.getApplicationContext(); final Intent intent = Shadows.shadowOf(applicationContext).getNextStartedActivity(); diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java index 1ffd042b172..6526862634f 100644 --- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java @@ -28,12 +28,9 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import android.content.ComponentName; import android.content.Context; import android.os.UserHandle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; @@ -182,20 +179,6 @@ public class TripleTapShortcutOptionControllerTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableShortcut_settingUpdated() { - mController.enableShortcutForTargets(true); - - assertThat( - Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, - AccessibilityUtil.State.OFF) - ).isEqualTo(AccessibilityUtil.State.ON); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_enableShortcut_callA11yManager() { mController.enableShortcutForTargets(true); @@ -209,20 +192,6 @@ public class TripleTapShortcutOptionControllerTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_disableShortcut_settingUpdated() { - mController.enableShortcutForTargets(false); - - assertThat( - Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, - AccessibilityUtil.State.OFF) - ).isEqualTo(AccessibilityUtil.State.OFF); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_disableShortcut_callA11yManager() { mController.enableShortcutForTargets(false); diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java index dde60e902fa..53048b00775 100644 --- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java @@ -143,20 +143,6 @@ public class TwoFingerDoubleTapShortcutOptionControllerTest { } @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableShortcut_settingUpdated() { - mController.enableShortcutForTargets(true); - - assertThat( - Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED, - AccessibilityUtil.State.OFF) - ).isEqualTo(AccessibilityUtil.State.ON); - } - - @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_enableShortcut_callA11yManager() { mController.enableShortcutForTargets(true); @@ -170,20 +156,6 @@ public class TwoFingerDoubleTapShortcutOptionControllerTest { } @Test - @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_disableShortcut_settingUpdated() { - mController.enableShortcutForTargets(false); - - assertThat( - Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED, - AccessibilityUtil.State.OFF) - ).isEqualTo(AccessibilityUtil.State.OFF); - } - - @Test - @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_disableShortcut_callA11yManager() { mController.enableShortcutForTargets(false); diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java index 511503aceba..d9eb995d18e 100644 --- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java @@ -25,11 +25,8 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import android.content.ComponentName; import android.content.Context; import android.os.UserHandle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.view.accessibility.AccessibilityManager; -import android.view.accessibility.Flags; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; @@ -111,17 +108,6 @@ public class VolumeKeysShortcutOptionControllerTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_enableVolumeKeysShortcut_shortcutSet() { - mController.enableShortcutForTargets(true); - - assertThat( - ShortcutUtils.isComponentIdExistingInSettings( - mContext, ShortcutConstants.UserShortcutType.HARDWARE, TARGET)).isTrue(); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_enableVolumeKeysShortcut_callA11yManager() { mController.enableShortcutForTargets(true); @@ -135,17 +121,6 @@ public class VolumeKeysShortcutOptionControllerTest { } @Test - @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) - public void enableShortcutForTargets_disableVolumeKeysShortcut_shortcutNotSet() { - mController.enableShortcutForTargets(false); - - assertThat( - ShortcutUtils.isComponentIdExistingInSettings( - mContext, ShortcutConstants.UserShortcutType.HARDWARE, TARGET)).isFalse(); - } - - @Test - @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void enableShortcutForTargets_disableVolumeKeysShortcut_callA11yManager() { mController.enableShortcutForTargets(false); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/display/TopologyScaleTest.kt b/tests/robotests/src/com/android/settings/connecteddevice/display/TopologyScaleTest.kt new file mode 100644 index 00000000000..078436264e7 --- /dev/null +++ b/tests/robotests/src/com/android/settings/connecteddevice/display/TopologyScaleTest.kt @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2024 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.settings.connecteddevice.display + +import android.graphics.Point +import android.graphics.PointF +import android.graphics.RectF +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +fun assertPointF(x: Float, y: Float, delta: Float, actual: PointF) { + assertEquals(x, actual.x, delta) + assertEquals(y, actual.y, delta) +} + +@RunWith(RobolectricTestRunner::class) +class TopologyScaleTest { + @Test + fun oneDisplay4to3Aspect() { + val scale = TopologyScale( + /* paneWidth= */ 640, + listOf(RectF(0f, 0f, 640f, 480f))) + + // blockRatio is higher than 0.05 in order to make the smallest display edge (480 dp) 48dp + // in the pane. + assertEquals( + "{TopoScale blockRatio=0.100000 originPaneXY=288,48 paneHeight=144}", "" + scale) + + assertEquals(Point(352, 96), scale.displayToPaneCoor(PointF(640f, 480f))) + assertEquals(Point(320, 72), scale.displayToPaneCoor(PointF(320f, 240f))) + assertEquals(PointF(640f, 480f), scale.paneToDisplayCoor(Point(352, 96))) + } + + @Test + fun twoUnalignedDisplays() { + val scale = TopologyScale( + /* paneWidth= */ 300, + listOf(RectF(0f, 0f, 1920f, 1200f), RectF(1920f, -300f, 3840f, 900f))) + + assertEquals( + "{TopoScale blockRatio=0.046875 originPaneXY=60,37 paneHeight=117}", "" + scale) + + assertEquals(Point(78, 55), scale.displayToPaneCoor(PointF(400f, 400f))) + assertEquals(Point(42, 37), scale.displayToPaneCoor(PointF(-400f, 0f))) + assertPointF(-384f, 106.6666f, 0.001f, scale.paneToDisplayCoor(Point(42, 42))) + } + + @Test + fun twoDisplaysBlockRatioBumpedForGarSizeMinimumHorizontal() { + val scale = TopologyScale( + /* paneWidth= */ 192, + listOf(RectF(0f, 0f, 240f, 320f), RectF(-240f, -320f, 0f, 0f))) + + // blockRatio is higher than 0.05 in order to make the smallest display edge (240 dp) 48dp + // in the pane. + assertEquals( + "{TopoScale blockRatio=0.200000 originPaneXY=96,128 paneHeight=256}", "" + scale) + + assertEquals(Point(192, 256), scale.displayToPaneCoor(PointF(480f, 640f))) + assertEquals(Point(96, 64), scale.displayToPaneCoor(PointF(0f, -320f))) + assertPointF(220f, -430f, 0.001f, scale.paneToDisplayCoor(Point(140, 42))) + } + + @Test + fun paneVerticalPaddingLimitedByTallestDisplay() { + val scale = TopologyScale( + /* paneWidth= */ 300, + listOf( + RectF(0f, 0f, 640f, 480f), + RectF(0f, 480f, 640f, 960f), + RectF(0f, 960f, 640f, 1440f), + RectF(0f, 1440f, 640f, 1920f), + RectF(0f, 1920f, 640f, 2400f), + RectF(0f, 2400f, 640f, 2880f))) + + assertEquals( + "{TopoScale blockRatio=0.100000 originPaneXY=118,48 paneHeight=384}", "" + scale) + assertEquals(Point(150, 48), scale.displayToPaneCoor(PointF(320f, 0f))) + assertPointF(-180f, 2880f, 0.001f, scale.paneToDisplayCoor(Point(100, 336))) + } +} diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerForCameraPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerForCameraPreferenceControllerTest.java new file mode 100644 index 00000000000..cc710ec29e6 --- /dev/null +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerForCameraPreferenceControllerTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.internal.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.widget.SelectorWithWidgetPreference; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class DoubleTapPowerForCameraPreferenceControllerTest { + + private static final String KEY = "gesture_double_power_tap_launch_camera"; + private Context mContext; + private Resources mResources; + private DoubleTapPowerForCameraPreferenceController mController; + private SelectorWithWidgetPreference mPreference; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + mResources = mock(Resources.class); + when(mContext.getResources()).thenReturn(mResources); + mController = new DoubleTapPowerForCameraPreferenceController(mContext, KEY); + mPreference = new SelectorWithWidgetPreference(mContext); + } + + @Test + public void updateState_launchCameraEnabled_preferenceChecked() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForCameraLaunch(mContext); + + mController.updateState(mPreference); + assertThat(mPreference.isChecked()).isTrue(); + } + + @Test + public void updateState_launchCameraDisabled_preferenceNotChecked() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForWalletLaunch(mContext); + + mController.updateState(mPreference); + assertThat(mPreference.isChecked()).isFalse(); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerGestureNotAvailable_preferenceUnsupported() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerButtonDisabled_preferenceDisabled() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(true); + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerCameraLaunchEnabled_preferenceEnabled() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(true); + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, true); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } +} diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerForWalletPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerForWalletPreferenceControllerTest.java new file mode 100644 index 00000000000..c86a82edd0d --- /dev/null +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerForWalletPreferenceControllerTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.internal.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.widget.SelectorWithWidgetPreference; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class DoubleTapPowerForWalletPreferenceControllerTest { + + private static final String KEY = "gesture_double_power_tap_launch_wallet"; + private Context mContext; + private Resources mResources; + private DoubleTapPowerForWalletPreferenceController mController; + private SelectorWithWidgetPreference mPreference; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + mResources = mock(Resources.class); + when(mContext.getResources()).thenReturn(mResources); + mController = new DoubleTapPowerForWalletPreferenceController(mContext, KEY); + mPreference = new SelectorWithWidgetPreference(mContext); + } + + @Test + public void updateState_launchWalletEnabled_preferenceChecked() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForWalletLaunch(mContext); + + mController.updateState(mPreference); + + assertThat(mPreference.isChecked()).isTrue(); + } + + @Test + public void updateState_launchWalletDisabled_preferenceNotChecked() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForCameraLaunch(mContext); + + mController.updateState(mPreference); + + assertThat(mPreference.isChecked()).isFalse(); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerGestureNotAvailable_preferenceUnsupported() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerButtonDisabled_preferenceDisabled() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(true); + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerWalletLaunchEnabled_preferenceEnabled() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(true); + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, true); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } +} diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerIllustrationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerIllustrationPreferenceControllerTest.java new file mode 100644 index 00000000000..1ea2a4ed8bb --- /dev/null +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerIllustrationPreferenceControllerTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.app.Application; + +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settings.R; +import com.android.settingslib.widget.IllustrationPreference; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class DoubleTapPowerIllustrationPreferenceControllerTest { + + private static final String KEY = "gesture_double_tap_power_video"; + private Application mContext; + private IllustrationPreference mPreference; + private DoubleTapPowerIllustrationPreferenceController mController; + + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + mPreference = new IllustrationPreference(mContext); + mController = new DoubleTapPowerIllustrationPreferenceController(mContext, KEY); + + PreferenceScreen mScreen = mock(PreferenceScreen.class); + when(mScreen.findPreference(KEY)).thenReturn(mPreference); + mController.displayPreference(mScreen); + } + + @Test + public void updateState_setDoubleTapPowerForCamera_showsCameraIllustration() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForCameraLaunch(mContext); + + mController.updateState(mPreference); + + assertThat(mPreference.getLottieAnimationResId()).isEqualTo(R.drawable.quickly_open_camera); + } + + @Test + public void updateState_setDoubleTapPowerForWallet_showsWalletIllustration() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForWalletLaunch(mContext); + + mController.updateState(mPreference); + + assertThat(mPreference.getLottieAnimationResId()) + .isEqualTo(R.drawable.double_tap_power_for_wallet); + } +} diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerMainSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerMainSwitchPreferenceControllerTest.java new file mode 100644 index 00000000000..502e52ec6c3 --- /dev/null +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerMainSwitchPreferenceControllerTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.internal.R; +import com.android.settings.core.BasePreferenceController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class DoubleTapPowerMainSwitchPreferenceControllerTest { + + private static final String KEY = "gesture_double_tap_power_enabled_main_switch"; + + private Context mContext; + private Resources mResources; + private DoubleTapPowerMainSwitchPreferenceController mController; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + mResources = mock(Resources.class); + when(mContext.getResources()).thenReturn(mResources); + mController = new DoubleTapPowerMainSwitchPreferenceController(mContext, KEY); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerGestureAvailable_preferenceEnabled() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(true); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerGestureUnavailable_preferenceUnsupported() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void isChecked_setDoubleTapPowerGestureEnabled_mainSwitchChecked() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, true); + + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void isChecked_setDoubleTapPowerGestureDisabled_mainSwitchUnchecked() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, false); + + assertThat(mController.isChecked()).isFalse(); + } + + @Test + public void setChecked_checkMainSwitch_doubleTapPowerGestureEnabled() { + mController.setChecked(true); + assertThat(DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext)) + .isTrue(); + } + + @Test + public void setChecked_uncheckMainSwitch_doubleTapPowerGestureDisabled() { + mController.setChecked(false); + assertThat(DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext)) + .isFalse(); + } +} diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java index 72dd36e60a0..17b03f355bf 100644 --- a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java @@ -17,23 +17,37 @@ package com.android.settings.gestures; import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED; +import static android.provider.Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED; -import static com.android.settings.gestures.DoubleTapPowerPreferenceController.OFF; -import static com.android.settings.gestures.DoubleTapPowerPreferenceController.ON; import static com.android.settings.gestures.DoubleTapPowerPreferenceController.isSuggestionComplete; +import static com.android.settings.gestures.DoubleTapPowerToOpenCameraPreferenceController.OFF; +import static com.android.settings.gestures.DoubleTapPowerToOpenCameraPreferenceController.ON; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; +import android.service.quickaccesswallet.Flags; +import android.text.TextUtils; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl; import com.android.settings.testutils.shadow.SettingsShadowResources; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -44,16 +58,22 @@ import org.robolectric.annotation.Config; @Config(shadows = SettingsShadowResources.class) public class DoubleTapPowerPreferenceControllerTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private Context mContext; private ContentResolver mContentResolver; private DoubleTapPowerPreferenceController mController; + private Preference mPreference; + private PreferenceScreen mScreen; private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power"; @Before public void setUp() { - mContext = RuntimeEnvironment.application; + mContext = RuntimeEnvironment.getApplication(); mContentResolver = mContext.getContentResolver(); mController = new DoubleTapPowerPreferenceController(mContext, KEY_DOUBLE_TAP_POWER); + mPreference = new Preference(mContext); + mScreen = mock(PreferenceScreen.class); + when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); } @After @@ -62,7 +82,26 @@ public class DoubleTapPowerPreferenceControllerTest { } @Test - public void isAvailable_configIsTrue_shouldReturnTrue() { + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isAvailable_flagEnabled_configIsTrue_returnsTrue() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_doubleTapPowerGestureEnabled, Boolean.TRUE); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isAvailable_flagEnabled_configIsFalse_returnsFalse() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_doubleTapPowerGestureEnabled, Boolean.FALSE); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isAvailable_flagDisabled_configIsTrue_returnsTrue() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, Boolean.TRUE); @@ -71,7 +110,8 @@ public class DoubleTapPowerPreferenceControllerTest { } @Test - public void isAvailable_configIsTrue_shouldReturnFalse() { + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isAvailable_flagDisabled_configIsFalse_returnsFalse() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, Boolean.FALSE); @@ -80,43 +120,63 @@ public class DoubleTapPowerPreferenceControllerTest { } @Test - public void testIsChecked_configIsNotSet_shouldReturnTrue() { - // Set the setting to be enabled. - Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON); - mController = new DoubleTapPowerPreferenceController(mContext, KEY_DOUBLE_TAP_POWER); + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isSuggestionCompleted_enableFlag_doubleTapPower_trueWhenNotAvailable() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_doubleTapPowerGestureEnabled, false); - assertThat(mController.isChecked()).isTrue(); + assertThat(isSuggestionComplete(mContext, null /* prefs */)).isTrue(); } @Test - public void testIsChecked_configIsSet_shouldReturnFalse() { - // Set the setting to be disabled. - Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, OFF); - mController = new DoubleTapPowerPreferenceController(mContext, KEY_DOUBLE_TAP_POWER); + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isSuggestionCompleted_enableFlag_doubleTapPower_falseWhenNotVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_doubleTapPowerGestureEnabled, true); + // No stored value in shared preferences if not visited yet. + final SharedPreferences prefs = + new SuggestionFeatureProviderImpl().getSharedPrefs(mContext); - assertThat(mController.isChecked()).isFalse(); + assertThat(isSuggestionComplete(mContext, prefs)).isFalse(); } @Test - public void isSuggestionCompleted_doubleTapPower_trueWhenNotAvailable() { + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isSuggestionCompleted_enableFlag_doubleTapPower_trueWhenVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_doubleTapPowerGestureEnabled, true); + // No stored value in shared preferences if not visited yet. + final SharedPreferences prefs = + new SuggestionFeatureProviderImpl().getSharedPrefs(mContext); + prefs.edit().putBoolean(DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit(); + + assertThat(isSuggestionComplete(mContext, prefs)).isTrue(); + } + + @Test + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isSuggestionCompleted_disableFlag_doubleTapPower_trueWhenNotAvailable() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, false); - assertThat(isSuggestionComplete(mContext, null/* prefs */)).isTrue(); + assertThat(isSuggestionComplete(mContext, null /* prefs */)).isTrue(); } @Test - public void isSuggestionCompleted_doubleTapPower_falseWhenNotVisited() { + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isSuggestionCompleted_disableFlag_doubleTapPower_falseWhenNotVisited() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true); // No stored value in shared preferences if not visited yet. final SharedPreferences prefs = new SuggestionFeatureProviderImpl().getSharedPrefs(mContext); + assertThat(isSuggestionComplete(mContext, prefs)).isFalse(); } @Test - public void isSuggestionCompleted_doubleTapPower_trueWhenVisited() { + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void isSuggestionCompleted_disableFlag_doubleTapPower_trueWhenVisited() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true); // No stored value in shared preferences if not visited yet. @@ -128,21 +188,92 @@ public class DoubleTapPowerPreferenceControllerTest { } @Test - public void isSliceableCorrectKey_returnsTrue() { - final DoubleTapPowerPreferenceController controller = - new DoubleTapPowerPreferenceController(mContext, "gesture_double_tap_power"); - assertThat(controller.isSliceable()).isTrue(); + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void displayPreference_flagDisabled_doubleTapPowerLegacyTitleIsDisplayed() { + mController.displayPreference(mScreen); + + assertThat( + TextUtils.equals( + mPreference.getTitle(), + mContext.getText(R.string.double_tap_power_for_camera_title))) + .isTrue(); } @Test - public void isSliceableIncorrectKey_returnsFalse() { - final DoubleTapPowerPreferenceController controller = - new DoubleTapPowerPreferenceController(mContext, "bad_key"); - assertThat(controller.isSliceable()).isFalse(); + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void getSummary_flagDisabled_doubleTapPowerEnabled_returnsOn() { + // Set the setting to be enabled. + Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON); + + assertThat( + TextUtils.equals( + mController.getSummary(), + mContext.getText(R.string.gesture_setting_on))) + .isTrue(); } @Test - public void isPublicSlice_returnTrue() { - assertThat(mController.isPublicSlice()).isTrue(); + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void getSummary_flagDisabled_doubleTapPowerDisabled_returnsOff() { + // Set the setting to be disabled. + Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, OFF); + + assertThat( + TextUtils.equals( + mController.getSummary(), + mContext.getText(R.string.gesture_setting_off))) + .isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void getSummary_flagEnabled_doubleTapPowerDisabled_returnsOff() { + // Set the setting to be disabled. + Settings.Secure.putInt( + mContentResolver, DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, 0 /* OFF */); + + assertThat( + TextUtils.equals( + mController.getSummary(), + mContext.getText(R.string.gesture_setting_off))) + .isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void getSummary_flagEnabled_doubleTapPowerEnabled_cameraTargetAction_returnsSummary() { + // Set the setting to be enabled. + Settings.Secure.putInt( + mContentResolver, DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, 1 /* ON */); + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForCameraLaunch(mContext); + + assertThat( + TextUtils.equals( + mController.getSummary(), + mContext.getString( + R.string.double_tap_power_summary, + mContext.getText(R.string.gesture_setting_on), + mContext.getText( + R.string.double_tap_power_camera_action_summary)))) + .isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void getSummary_flagEnabled_doubleTapPowerEnabled_walletTargetAction_returnsSummary() { + // Set the setting to be enabled. + Settings.Secure.putInt( + mContentResolver, DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, 1 /* ON */); + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForWalletLaunch(mContext); + + assertThat( + TextUtils.equals( + mController.getSummary(), + mContext.getString( + R.string.double_tap_power_summary, + mContext.getText(R.string.gesture_setting_on), + mContext.getText( + R.string.double_tap_power_wallet_action_summary)))) + .isTrue(); } } diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerSettingsTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerSettingsTest.java index a08b81800a4..7d4f52e67a2 100644 --- a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerSettingsTest.java +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerSettingsTest.java @@ -18,9 +18,16 @@ package com.android.settings.gestures; import static com.google.common.truth.Truth.assertThat; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.SearchIndexableResource; +import android.service.quickaccesswallet.Flags; + +import com.android.settings.R; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -31,6 +38,7 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class DoubleTapPowerSettingsTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private DoubleTapPowerSettings mSettings; @Before @@ -39,12 +47,38 @@ public class DoubleTapPowerSettingsTest { } @Test - public void testSearchIndexProvider_shouldIndexResource() { + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void getPreferenceScreenResId_flagEnabled_returnsFlagEnabledResId() { + assertThat(mSettings.getPreferenceScreenResId()).isEqualTo(R.xml.double_tap_power_settings); + } + + @Test + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void getPreferenceScreenResId_flagDisabled_returnsFlagDisabledResId() { + assertThat(mSettings.getPreferenceScreenResId()) + .isEqualTo(R.xml.double_tap_power_to_open_camera_settings); + } + + @Test + @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void testSearchIndexProvider_flagEnabled_shouldIndexFlagEnabledResource() { final List indexRes = - DoubleTapPowerSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex( - RuntimeEnvironment.application, true /* enabled */); + DoubleTapPowerSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex( + RuntimeEnvironment.getApplication(), true /* enabled */); assertThat(indexRes).isNotNull(); - assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId()); + assertThat(indexRes.get(0).xmlResId).isEqualTo(R.xml.double_tap_power_settings); + } + + @Test + @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) + public void testSearchIndexProvider_flagDisabled_shouldIndexFlagDisabledResource() { + final List indexRes = + DoubleTapPowerSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex( + RuntimeEnvironment.getApplication(), true /* enabled */); + + assertThat(indexRes).isNotNull(); + assertThat(indexRes.get(0).xmlResId) + .isEqualTo(R.xml.double_tap_power_to_open_camera_settings); } } diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerSettingsUtilsTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerSettingsUtilsTest.java new file mode 100644 index 00000000000..817f198a5b2 --- /dev/null +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerSettingsUtilsTest.java @@ -0,0 +1,203 @@ +/* + * 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.settings.gestures; + +import static com.android.settings.gestures.DoubleTapPowerSettingsUtils.OFF; +import static com.android.settings.gestures.DoubleTapPowerSettingsUtils.ON; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; +import android.provider.Settings; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.internal.R; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class DoubleTapPowerSettingsUtilsTest { + + private static final int DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE = 0; + private static final int DOUBLE_TAP_POWER_BUTTON_WALLET_LAUNCH_VALUE = 1; + + private Context mContext; + private Resources mResources; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + mResources = mock(Resources.class); + when(mContext.getResources()).thenReturn(mResources); + } + + @Test + public void isDoubleTapPowerButtonGestureAvailable_setAvailable_returnsTrue() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(true); + + assertThat(DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureAvailable(mContext)) + .isTrue(); + } + + @Test + public void isDoubleTapPowerButtonGestureAvailable_setUnavailable_returnsFalse() { + when(mResources.getBoolean(R.bool.config_doubleTapPowerGestureEnabled)).thenReturn(false); + + assertThat(DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureAvailable(mContext)) + .isFalse(); + } + + @Test + public void isDoubleTapPowerButtonGestureEnabled_setEnabled_returnsTrue() { + Settings.Secure.putInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, + ON); + + assertThat(DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext)) + .isTrue(); + } + + @Test + public void isDoubleTapPowerButtonGestureEnabled_setDisabled_returnsFalse() { + Settings.Secure.putInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, + OFF); + + assertThat(DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext)) + .isFalse(); + } + + @Test + public void isDoubleTapPowerButtonGestureEnabled_valueNotSet_returnsTrue() { + assertThat(DoubleTapPowerSettingsUtils.isDoubleTapPowerButtonGestureEnabled(mContext)) + .isTrue(); + } + + @Test + public void setDoubleTapPowerButtonGestureEnabled_setEnabled_returnsEnabled() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, true); + + assertThat( + Settings.Secure.getInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, + OFF)) + .isEqualTo(ON); + } + + @Test + public void setDoubleTapPowerButtonGestureEnabled_setDisabled_returnsDisabled() { + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonGestureEnabled(mContext, false); + + assertThat( + Settings.Secure.getInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, + ON)) + .isEqualTo(OFF); + } + + @Test + public void isDoubleTapPowerButtonGestureForCameraLaunchEnabled_valueSetToCamera_returnsTrue() { + Settings.Secure.putInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE, + DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE); + + assertThat( + DoubleTapPowerSettingsUtils + .isDoubleTapPowerButtonGestureForCameraLaunchEnabled(mContext)) + .isTrue(); + } + + @Test + public void + isDoubleTapPowerButtonGestureForCameraLaunchEnabled_valueNotSetToCamera_returnsFalse() { + Settings.Secure.putInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE, + DOUBLE_TAP_POWER_BUTTON_WALLET_LAUNCH_VALUE); + + assertThat( + DoubleTapPowerSettingsUtils + .isDoubleTapPowerButtonGestureForCameraLaunchEnabled(mContext)) + .isFalse(); + } + + @Test + public void + isDoubleTapPowerButtonGestureForCameraLaunchEnabled_defaultSetToCamera_returnsTrue() { + when(mResources.getInteger(R.integer.config_defaultDoubleTapPowerGestureAction)) + .thenReturn(DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE); + + assertThat( + DoubleTapPowerSettingsUtils + .isDoubleTapPowerButtonGestureForCameraLaunchEnabled(mContext)) + .isTrue(); + } + + @Test + public void + isDoubleTapPowerButtonGestureForCameraLaunchEnabled_defaultNotCamera_returnsFalse() { + when(mResources.getInteger(R.integer.config_defaultDoubleTapPowerGestureAction)) + .thenReturn(DOUBLE_TAP_POWER_BUTTON_WALLET_LAUNCH_VALUE); + + assertThat( + DoubleTapPowerSettingsUtils + .isDoubleTapPowerButtonGestureForCameraLaunchEnabled(mContext)) + .isFalse(); + } + + @Test + public void setDoubleTapPowerButtonForCameraLaunch_setGestureBehaviorToCameraLaunch() { + boolean result = + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForCameraLaunch(mContext); + + assertThat(result).isTrue(); + assertThat( + Settings.Secure.getInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE, + DOUBLE_TAP_POWER_BUTTON_WALLET_LAUNCH_VALUE)) + .isEqualTo(DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE); + } + + @Test + public void setDoubleTapPowerButtonForWalletLaunch_setGestureBehaviorToWalletLaunch() { + boolean result = + DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForWalletLaunch(mContext); + + assertThat(result).isTrue(); + assertThat( + Settings.Secure.getInt( + mContext.getContentResolver(), + Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE, + DOUBLE_TAP_POWER_BUTTON_CAMERA_LAUNCH_VALUE)) + .isEqualTo(DOUBLE_TAP_POWER_BUTTON_WALLET_LAUNCH_VALUE); + } +} diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerToOpenCameraPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerToOpenCameraPreferenceControllerTest.java new file mode 100644 index 00000000000..54d17ba258c --- /dev/null +++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerToOpenCameraPreferenceControllerTest.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2024 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.settings.gestures; + +import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED; + +import static com.android.settings.gestures.DoubleTapPowerToOpenCameraPreferenceController.OFF; +import static com.android.settings.gestures.DoubleTapPowerToOpenCameraPreferenceController.ON; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; +import android.platform.test.flag.junit.SetFlagsRule; +import android.provider.Settings; + +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.internal.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settings.testutils.shadow.SettingsShadowResources; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(AndroidJUnit4.class) +@Config(shadows = SettingsShadowResources.class) +public class DoubleTapPowerToOpenCameraPreferenceControllerTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private Context mContext; + private Resources mResources; + private DoubleTapPowerToOpenCameraPreferenceController mController; + private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power"; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.getApplication()); + mResources = mock(Resources.class); + when(mContext.getResources()).thenReturn(mResources); + mController = + new DoubleTapPowerToOpenCameraPreferenceController(mContext, KEY_DOUBLE_TAP_POWER); + } + + @After + public void tearDown() { + SettingsShadowResources.reset(); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerGestureDisabled_preferenceUnsupported() { + when(mResources.getBoolean(R.bool.config_cameraDoubleTapPowerGestureEnabled)) + .thenReturn(false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_setDoubleTapPowerGestureEnabled_preferenceSupported() { + when(mResources.getBoolean(R.bool.config_cameraDoubleTapPowerGestureEnabled)) + .thenReturn(true); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + public void isChecked_configIsNotSet_returnsTrue() { + // Set the setting to be enabled. + Settings.Secure.putInt( + mContext.getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON); + + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void isChecked_setConfigFalse_returnsFalse() { + // Set the setting to be disabled. + Settings.Secure.putInt( + mContext.getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, OFF); + + assertThat(mController.isChecked()).isFalse(); + } + + @Test + public void isChecked_setConfigTrue_returnsFalse() { + // Set the setting to be disabled. + Settings.Secure.putInt( + mContext.getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON); + + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void setChecked_checkToggle_cameraDoubleTapPowerGestureEnabled() { + mController.setChecked(true); + + assertThat( + Settings.Secure.getInt( + mContext.getContentResolver(), + CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, + OFF)) + .isEqualTo(ON); + } + + @Test + public void setChecked_uncheckToggle_cameraDoubleTapPowerGestureDisabled() { + mController.setChecked(false); + + assertThat( + Settings.Secure.getInt( + mContext.getContentResolver(), + CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, + ON)) + .isEqualTo(OFF); + } + + @Test + public void isSliceableCorrectKey_returnsTrue() { + final DoubleTapPowerToOpenCameraPreferenceController controller = + new DoubleTapPowerToOpenCameraPreferenceController( + mContext, "gesture_double_tap_power"); + + assertThat(controller.isSliceable()).isTrue(); + } + + @Test + public void isSliceableIncorrectKey_returnsFalse() { + final DoubleTapPowerToOpenCameraPreferenceController controller = + new DoubleTapPowerToOpenCameraPreferenceController(mContext, "bad_key"); + + assertThat(controller.isSliceable()).isFalse(); + } + + @Test + public void isPublicSlice_returnTrue() { + assertThat(mController.isPublicSlice()).isTrue(); + } +} diff --git a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java index 36f6cd4058e..0171dc402f5 100644 --- a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java +++ b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java @@ -54,6 +54,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.os.UserManager; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -103,6 +104,8 @@ public class SimSelectNotificationTest { private DisplayMetrics mDisplayMetrics; @Mock private SimDialogActivity mActivity; + @Mock + private UserManager mUserManager; private final String mFakeDisplayName = "fake_display_name"; private final CharSequence mFakeNotificationChannelTitle = "fake_notification_channel_title"; @@ -128,6 +131,8 @@ public class SimSelectNotificationTest { .thenReturn(mNotificationManager); when(mContext.getSystemService(Context.TELEPHONY_SERVICE)) .thenReturn(mTelephonyManager); + when(mContext.getSystemService(UserManager.class)) + .thenReturn(mUserManager); when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); when(mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) .thenReturn(mSubscriptionManager); @@ -135,6 +140,7 @@ public class SimSelectNotificationTest { when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mPackageManager.checkPermission(any(), any())) .thenReturn(PackageManager.PERMISSION_GRANTED); + when(mUserManager.isMainUser()).thenReturn(true); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mTelephonyManager.isDataEnabledForApn(TYPE_MMS)).thenReturn(false); @@ -217,6 +223,18 @@ public class SimSelectNotificationTest { verify(mNotificationManager, never()).createNotificationChannel(any()); } + @Test + public void onReceivePrimarySubListChange_userIdIsNotMain_notificationShouldNotSend() { + when(mUserManager.isMainUser()).thenReturn(false); + Intent intent = new Intent(TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED); + intent.putExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE, + EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA); + + // If MMS data is already enabled, there's no need to trigger the notification. + mSimSelectNotification.onReceive(mContext, intent); + verify(mNotificationManager, never()).createNotificationChannel(any()); + } + @Test public void onReceivePrimarySubListChange_NoExtra_notificationShouldNotSend() { Intent intent = new Intent(TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED); diff --git a/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java b/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java index d068194cd9c..09c746b732b 100644 --- a/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java +++ b/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java @@ -25,12 +25,7 @@ import static com.google.common.truth.Truth.assertThat; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; -import android.platform.test.annotations.RequiresFlagsDisabled; -import android.platform.test.annotations.RequiresFlagsEnabled; -import android.platform.test.flag.junit.CheckFlagsRule; -import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; -import android.view.accessibility.Flags; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -41,7 +36,6 @@ import com.android.internal.accessibility.util.ShortcutUtils; import org.junit.AfterClass; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -61,8 +55,6 @@ public class PreferredShortcutsTest { CLASS_NAME_2); private static final ContentResolver sContentResolver = ApplicationProvider.getApplicationContext().getContentResolver(); - @Rule - public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); private final Context mContext = ApplicationProvider.getApplicationContext(); @Before @@ -175,7 +167,6 @@ public class PreferredShortcutsTest { } @Test - @RequiresFlagsEnabled(Flags.FLAG_A11Y_QS_SHORTCUT) public void updatePreferredShortcutFromSettings_colorInversionWithQsAndSoftwareShortcut_preferredShortcutsMatches() { String target = COLOR_INVERSION_COMPONENT_NAME.flattenToString(); Settings.Secure.putString(sContentResolver, @@ -192,23 +183,6 @@ public class PreferredShortcutsTest { } - @Test - @RequiresFlagsDisabled(Flags.FLAG_A11Y_QS_SHORTCUT) - public void updatePreferredShortcutFromSettings_colorInversionWithQsAndHardwareShortcut_qsShortcutNotSaved() { - String target = COLOR_INVERSION_COMPONENT_NAME.flattenToString(); - Settings.Secure.putString(sContentResolver, - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, target); - Settings.Secure.putString(sContentResolver, - Settings.Secure.ACCESSIBILITY_QS_TARGETS, target); - assertThat(!android.view.accessibility.Flags.a11yQsShortcut()).isTrue(); - - PreferredShortcuts.updatePreferredShortcutsFromSettings(mContext, Set.of(target)); - - int savedPreferredShortcut = PreferredShortcuts.retrieveUserShortcutType( - mContext, target); - assertThat(savedPreferredShortcut).isEqualTo(UserShortcutType.HARDWARE); - } - @Test public void retrieveUserShortcutTypeWithoutDefault_noUserPreferredShortcuts_returnSoftwareShortcut() { String target = COMPONENT_NAME_1.flattenToString(); diff --git a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceControllerTest.java index 7229996b2e3..e1c0277c7e9 100644 --- a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceControllerTest.java @@ -16,8 +16,6 @@ package com.android.settings.accessibility; -import static com.android.internal.accessibility.AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_TILE_SERVICE_COMPONENT_NAME; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; @@ -26,12 +24,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; -import android.platform.test.annotations.RequiresFlagsDisabled; -import android.platform.test.annotations.RequiresFlagsEnabled; -import android.platform.test.flag.junit.CheckFlagsRule; -import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; -import android.view.accessibility.Flags; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -40,7 +33,6 @@ import com.android.internal.R; import org.junit.Before; import org.junit.Ignore; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,8 +40,6 @@ import org.junit.runner.RunWith; public class ReduceBrightColorsPreferenceControllerTest { private static final String PREF_KEY = "rbc_preference"; - @Rule - public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); private Context mContext; private Resources mResources;; private ReduceBrightColorsPreferenceController mController; @@ -98,20 +88,6 @@ public class ReduceBrightColorsPreferenceControllerTest { assertThat(mController.isAvailable()).isFalse(); } - - @Test - @RequiresFlagsDisabled(Flags.FLAG_A11Y_QS_SHORTCUT) - public void getTileComponentName_a11yQsFlagOff_returnComponentName() { - assertThat(mController.getTileComponentName()) - .isEqualTo(REDUCE_BRIGHT_COLORS_TILE_SERVICE_COMPONENT_NAME); - } - - @Test - @RequiresFlagsEnabled(Flags.FLAG_A11Y_QS_SHORTCUT) - public void getTileComponentName_a11yQsFlagOff_returnNull() { - assertThat(mController.getTileComponentName()).isNull(); - } - private int resourceId(String type, String name) { return mContext.getResources().getIdentifier(name, type, mContext.getPackageName()); } diff --git a/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsSosFooterPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsSosFooterPreferenceControllerTest.java index 7aa6535962d..498ebced6b0 100644 --- a/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsSosFooterPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/SatelliteSettingsSosFooterPreferenceControllerTest.java @@ -19,6 +19,7 @@ package com.android.settings.network.telephony; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.os.Looper; @@ -32,6 +33,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -42,8 +44,10 @@ public class SatelliteSettingsSosFooterPreferenceControllerTest { @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); - private Context mContext = null; + @Mock private FooterPreference mFooterPreference; + + private Context mContext = null; private SatelliteSettingsSosFooterPreferenceController mController; @Before @@ -52,8 +56,7 @@ public class SatelliteSettingsSosFooterPreferenceControllerTest { Looper.prepare(); } mContext = spy(ApplicationProvider.getApplicationContext()); - mFooterPreference = spy(new FooterPreference(mContext)); - mFooterPreference.setKey(KEY); + when(mFooterPreference.getKey()).thenReturn(KEY); mController = new SatelliteSettingsSosFooterPreferenceController(mContext, KEY); }