Merge "Show only dialog presentations in the fill dialog"
diff --git a/Android.bp b/Android.bp
index ee5db70..f805947 100644
--- a/Android.bp
+++ b/Android.bp
@@ -110,7 +110,7 @@
// AIDL sources from external directories
":android.hardware.graphics.common-V3-java-source",
- ":android.hardware.security.keymint-V1-java-source",
+ ":android.hardware.security.keymint-V2-java-source",
":android.hardware.security.secureclock-V1-java-source",
":android.hardware.tv.tuner-V1-java-source",
":android.security.apc-java-source",
@@ -191,7 +191,6 @@
"sax/java",
"telecomm/java",
- "apex/media/aidl/stable",
// TODO(b/147699819): remove this
"telephony/java",
],
@@ -289,6 +288,7 @@
// TODO: remove when moved to the below package
"frameworks/base/packages/ConnectivityT/framework-t/aidl-export",
"packages/modules/Connectivity/framework/aidl-export",
+ "packages/modules/Media/apex/aidl/stable",
"hardware/interfaces/graphics/common/aidl",
],
},
@@ -538,6 +538,7 @@
"frameworks/native/libs/permission/aidl",
// TODO: remove when moved to the below package
"frameworks/base/packages/ConnectivityT/framework-t/aidl-export",
+ "packages/modules/Media/apex/aidl/stable",
"packages/modules/Connectivity/framework/aidl-export",
"hardware/interfaces/graphics/common/aidl",
],
@@ -575,11 +576,9 @@
stubs_defaults {
name: "module-classpath-stubs-defaults",
aidl: {
- local_include_dirs: [
- "apex/media/aidl/stable",
- ],
include_dirs: [
"packages/modules/Connectivity/framework/aidl-export",
+ "packages/modules/Media/apex/aidl/stable",
],
},
libs: [
diff --git a/Android.mk b/Android.mk
index 46529eb..d9e202c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -15,6 +15,14 @@
#
LOCAL_PATH := $(call my-dir)
+$(eval $(call declare-1p-copy-files,frameworks/base,.ogg))
+$(eval $(call declare-1p-copy-files,frameworks/base,.kl))
+$(eval $(call declare-1p-copy-files,frameworks/base,.kcm))
+$(eval $(call declare-1p-copy-files,frameworks/base,.idc))
+$(eval $(call declare-1p-copy-files,frameworks/base,dirty-image-objects))
+$(eval $(call declare-1p-copy-files,frameworks/base/config,))
+$(eval $(call declare-1p-copy-files,frameworks/native/data,))
+
# Load framework-specific path mappings used later in the build.
include $(LOCAL_PATH)/pathmap.mk
diff --git a/ApiDocs.bp b/ApiDocs.bp
index b5acfb2..ba31161 100644
--- a/ApiDocs.bp
+++ b/ApiDocs.bp
@@ -87,6 +87,7 @@
":framework-graphics-srcs",
":framework-mediaprovider-sources",
":framework-nearby-sources",
+ ":framework-ondevicepersonalization-sources",
":framework-permission-sources",
":framework-permission-s-sources",
":framework-scheduling-sources",
@@ -144,11 +145,9 @@
"api-versions-jars-dir",
],
aidl: {
- local_include_dirs: [
- "apex/media/aidl/stable",
- ],
include_dirs: [
"packages/modules/Connectivity/framework/aidl-export",
+ "packages/modules/Media/apex/aidl/stable",
],
},
}
diff --git a/apct-tests/perftests/core/OWNERS b/apct-tests/perftests/core/OWNERS
index 18486af..2b3564e 100644
--- a/apct-tests/perftests/core/OWNERS
+++ b/apct-tests/perftests/core/OWNERS
@@ -1 +1,5 @@
include /graphics/java/android/graphics/fonts/OWNERS
+
+# Bug component: 568761
+per-file /apct-tests/perftests/core/res/* = felkachang@google.com,zyy@google.com
+
diff --git a/apct-tests/perftests/core/res/values/colors.xml b/apct-tests/perftests/core/res/values/colors.xml
new file mode 100644
index 0000000..5e56c25
--- /dev/null
+++ b/apct-tests/perftests/core/res/values/colors.xml
@@ -0,0 +1,10022 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!--- The colors with prefix "i_am_color_%x" and %x is from 0 to 10000. They are used by
+ ResourcesPerfTest.java -->
+ <color name="i_am_color_0">#00000000</color>
+ <color name="i_am_color_1">#00000001</color>
+ <color name="i_am_color_2">#00000002</color>
+ <color name="i_am_color_3">#00000003</color>
+ <color name="i_am_color_4">#00000004</color>
+ <color name="i_am_color_5">#00000005</color>
+ <color name="i_am_color_6">#00000006</color>
+ <color name="i_am_color_7">#00000007</color>
+ <color name="i_am_color_8">#00000008</color>
+ <color name="i_am_color_9">#00000009</color>
+ <color name="i_am_color_a">#0000000a</color>
+ <color name="i_am_color_b">#0000000b</color>
+ <color name="i_am_color_c">#0000000c</color>
+ <color name="i_am_color_d">#0000000d</color>
+ <color name="i_am_color_e">#0000000e</color>
+ <color name="i_am_color_f">#0000000f</color>
+ <color name="i_am_color_10">#00000010</color>
+ <color name="i_am_color_11">#00000011</color>
+ <color name="i_am_color_12">#00000012</color>
+ <color name="i_am_color_13">#00000013</color>
+ <color name="i_am_color_14">#00000014</color>
+ <color name="i_am_color_15">#00000015</color>
+ <color name="i_am_color_16">#00000016</color>
+ <color name="i_am_color_17">#00000017</color>
+ <color name="i_am_color_18">#00000018</color>
+ <color name="i_am_color_19">#00000019</color>
+ <color name="i_am_color_1a">#0000001a</color>
+ <color name="i_am_color_1b">#0000001b</color>
+ <color name="i_am_color_1c">#0000001c</color>
+ <color name="i_am_color_1d">#0000001d</color>
+ <color name="i_am_color_1e">#0000001e</color>
+ <color name="i_am_color_1f">#0000001f</color>
+ <color name="i_am_color_20">#00000020</color>
+ <color name="i_am_color_21">#00000021</color>
+ <color name="i_am_color_22">#00000022</color>
+ <color name="i_am_color_23">#00000023</color>
+ <color name="i_am_color_24">#00000024</color>
+ <color name="i_am_color_25">#00000025</color>
+ <color name="i_am_color_26">#00000026</color>
+ <color name="i_am_color_27">#00000027</color>
+ <color name="i_am_color_28">#00000028</color>
+ <color name="i_am_color_29">#00000029</color>
+ <color name="i_am_color_2a">#0000002a</color>
+ <color name="i_am_color_2b">#0000002b</color>
+ <color name="i_am_color_2c">#0000002c</color>
+ <color name="i_am_color_2d">#0000002d</color>
+ <color name="i_am_color_2e">#0000002e</color>
+ <color name="i_am_color_2f">#0000002f</color>
+ <color name="i_am_color_30">#00000030</color>
+ <color name="i_am_color_31">#00000031</color>
+ <color name="i_am_color_32">#00000032</color>
+ <color name="i_am_color_33">#00000033</color>
+ <color name="i_am_color_34">#00000034</color>
+ <color name="i_am_color_35">#00000035</color>
+ <color name="i_am_color_36">#00000036</color>
+ <color name="i_am_color_37">#00000037</color>
+ <color name="i_am_color_38">#00000038</color>
+ <color name="i_am_color_39">#00000039</color>
+ <color name="i_am_color_3a">#0000003a</color>
+ <color name="i_am_color_3b">#0000003b</color>
+ <color name="i_am_color_3c">#0000003c</color>
+ <color name="i_am_color_3d">#0000003d</color>
+ <color name="i_am_color_3e">#0000003e</color>
+ <color name="i_am_color_3f">#0000003f</color>
+ <color name="i_am_color_40">#00000040</color>
+ <color name="i_am_color_41">#00000041</color>
+ <color name="i_am_color_42">#00000042</color>
+ <color name="i_am_color_43">#00000043</color>
+ <color name="i_am_color_44">#00000044</color>
+ <color name="i_am_color_45">#00000045</color>
+ <color name="i_am_color_46">#00000046</color>
+ <color name="i_am_color_47">#00000047</color>
+ <color name="i_am_color_48">#00000048</color>
+ <color name="i_am_color_49">#00000049</color>
+ <color name="i_am_color_4a">#0000004a</color>
+ <color name="i_am_color_4b">#0000004b</color>
+ <color name="i_am_color_4c">#0000004c</color>
+ <color name="i_am_color_4d">#0000004d</color>
+ <color name="i_am_color_4e">#0000004e</color>
+ <color name="i_am_color_4f">#0000004f</color>
+ <color name="i_am_color_50">#00000050</color>
+ <color name="i_am_color_51">#00000051</color>
+ <color name="i_am_color_52">#00000052</color>
+ <color name="i_am_color_53">#00000053</color>
+ <color name="i_am_color_54">#00000054</color>
+ <color name="i_am_color_55">#00000055</color>
+ <color name="i_am_color_56">#00000056</color>
+ <color name="i_am_color_57">#00000057</color>
+ <color name="i_am_color_58">#00000058</color>
+ <color name="i_am_color_59">#00000059</color>
+ <color name="i_am_color_5a">#0000005a</color>
+ <color name="i_am_color_5b">#0000005b</color>
+ <color name="i_am_color_5c">#0000005c</color>
+ <color name="i_am_color_5d">#0000005d</color>
+ <color name="i_am_color_5e">#0000005e</color>
+ <color name="i_am_color_5f">#0000005f</color>
+ <color name="i_am_color_60">#00000060</color>
+ <color name="i_am_color_61">#00000061</color>
+ <color name="i_am_color_62">#00000062</color>
+ <color name="i_am_color_63">#00000063</color>
+ <color name="i_am_color_64">#00000064</color>
+ <color name="i_am_color_65">#00000065</color>
+ <color name="i_am_color_66">#00000066</color>
+ <color name="i_am_color_67">#00000067</color>
+ <color name="i_am_color_68">#00000068</color>
+ <color name="i_am_color_69">#00000069</color>
+ <color name="i_am_color_6a">#0000006a</color>
+ <color name="i_am_color_6b">#0000006b</color>
+ <color name="i_am_color_6c">#0000006c</color>
+ <color name="i_am_color_6d">#0000006d</color>
+ <color name="i_am_color_6e">#0000006e</color>
+ <color name="i_am_color_6f">#0000006f</color>
+ <color name="i_am_color_70">#00000070</color>
+ <color name="i_am_color_71">#00000071</color>
+ <color name="i_am_color_72">#00000072</color>
+ <color name="i_am_color_73">#00000073</color>
+ <color name="i_am_color_74">#00000074</color>
+ <color name="i_am_color_75">#00000075</color>
+ <color name="i_am_color_76">#00000076</color>
+ <color name="i_am_color_77">#00000077</color>
+ <color name="i_am_color_78">#00000078</color>
+ <color name="i_am_color_79">#00000079</color>
+ <color name="i_am_color_7a">#0000007a</color>
+ <color name="i_am_color_7b">#0000007b</color>
+ <color name="i_am_color_7c">#0000007c</color>
+ <color name="i_am_color_7d">#0000007d</color>
+ <color name="i_am_color_7e">#0000007e</color>
+ <color name="i_am_color_7f">#0000007f</color>
+ <color name="i_am_color_80">#00000080</color>
+ <color name="i_am_color_81">#00000081</color>
+ <color name="i_am_color_82">#00000082</color>
+ <color name="i_am_color_83">#00000083</color>
+ <color name="i_am_color_84">#00000084</color>
+ <color name="i_am_color_85">#00000085</color>
+ <color name="i_am_color_86">#00000086</color>
+ <color name="i_am_color_87">#00000087</color>
+ <color name="i_am_color_88">#00000088</color>
+ <color name="i_am_color_89">#00000089</color>
+ <color name="i_am_color_8a">#0000008a</color>
+ <color name="i_am_color_8b">#0000008b</color>
+ <color name="i_am_color_8c">#0000008c</color>
+ <color name="i_am_color_8d">#0000008d</color>
+ <color name="i_am_color_8e">#0000008e</color>
+ <color name="i_am_color_8f">#0000008f</color>
+ <color name="i_am_color_90">#00000090</color>
+ <color name="i_am_color_91">#00000091</color>
+ <color name="i_am_color_92">#00000092</color>
+ <color name="i_am_color_93">#00000093</color>
+ <color name="i_am_color_94">#00000094</color>
+ <color name="i_am_color_95">#00000095</color>
+ <color name="i_am_color_96">#00000096</color>
+ <color name="i_am_color_97">#00000097</color>
+ <color name="i_am_color_98">#00000098</color>
+ <color name="i_am_color_99">#00000099</color>
+ <color name="i_am_color_9a">#0000009a</color>
+ <color name="i_am_color_9b">#0000009b</color>
+ <color name="i_am_color_9c">#0000009c</color>
+ <color name="i_am_color_9d">#0000009d</color>
+ <color name="i_am_color_9e">#0000009e</color>
+ <color name="i_am_color_9f">#0000009f</color>
+ <color name="i_am_color_a0">#000000a0</color>
+ <color name="i_am_color_a1">#000000a1</color>
+ <color name="i_am_color_a2">#000000a2</color>
+ <color name="i_am_color_a3">#000000a3</color>
+ <color name="i_am_color_a4">#000000a4</color>
+ <color name="i_am_color_a5">#000000a5</color>
+ <color name="i_am_color_a6">#000000a6</color>
+ <color name="i_am_color_a7">#000000a7</color>
+ <color name="i_am_color_a8">#000000a8</color>
+ <color name="i_am_color_a9">#000000a9</color>
+ <color name="i_am_color_aa">#000000aa</color>
+ <color name="i_am_color_ab">#000000ab</color>
+ <color name="i_am_color_ac">#000000ac</color>
+ <color name="i_am_color_ad">#000000ad</color>
+ <color name="i_am_color_ae">#000000ae</color>
+ <color name="i_am_color_af">#000000af</color>
+ <color name="i_am_color_b0">#000000b0</color>
+ <color name="i_am_color_b1">#000000b1</color>
+ <color name="i_am_color_b2">#000000b2</color>
+ <color name="i_am_color_b3">#000000b3</color>
+ <color name="i_am_color_b4">#000000b4</color>
+ <color name="i_am_color_b5">#000000b5</color>
+ <color name="i_am_color_b6">#000000b6</color>
+ <color name="i_am_color_b7">#000000b7</color>
+ <color name="i_am_color_b8">#000000b8</color>
+ <color name="i_am_color_b9">#000000b9</color>
+ <color name="i_am_color_ba">#000000ba</color>
+ <color name="i_am_color_bb">#000000bb</color>
+ <color name="i_am_color_bc">#000000bc</color>
+ <color name="i_am_color_bd">#000000bd</color>
+ <color name="i_am_color_be">#000000be</color>
+ <color name="i_am_color_bf">#000000bf</color>
+ <color name="i_am_color_c0">#000000c0</color>
+ <color name="i_am_color_c1">#000000c1</color>
+ <color name="i_am_color_c2">#000000c2</color>
+ <color name="i_am_color_c3">#000000c3</color>
+ <color name="i_am_color_c4">#000000c4</color>
+ <color name="i_am_color_c5">#000000c5</color>
+ <color name="i_am_color_c6">#000000c6</color>
+ <color name="i_am_color_c7">#000000c7</color>
+ <color name="i_am_color_c8">#000000c8</color>
+ <color name="i_am_color_c9">#000000c9</color>
+ <color name="i_am_color_ca">#000000ca</color>
+ <color name="i_am_color_cb">#000000cb</color>
+ <color name="i_am_color_cc">#000000cc</color>
+ <color name="i_am_color_cd">#000000cd</color>
+ <color name="i_am_color_ce">#000000ce</color>
+ <color name="i_am_color_cf">#000000cf</color>
+ <color name="i_am_color_d0">#000000d0</color>
+ <color name="i_am_color_d1">#000000d1</color>
+ <color name="i_am_color_d2">#000000d2</color>
+ <color name="i_am_color_d3">#000000d3</color>
+ <color name="i_am_color_d4">#000000d4</color>
+ <color name="i_am_color_d5">#000000d5</color>
+ <color name="i_am_color_d6">#000000d6</color>
+ <color name="i_am_color_d7">#000000d7</color>
+ <color name="i_am_color_d8">#000000d8</color>
+ <color name="i_am_color_d9">#000000d9</color>
+ <color name="i_am_color_da">#000000da</color>
+ <color name="i_am_color_db">#000000db</color>
+ <color name="i_am_color_dc">#000000dc</color>
+ <color name="i_am_color_dd">#000000dd</color>
+ <color name="i_am_color_de">#000000de</color>
+ <color name="i_am_color_df">#000000df</color>
+ <color name="i_am_color_e0">#000000e0</color>
+ <color name="i_am_color_e1">#000000e1</color>
+ <color name="i_am_color_e2">#000000e2</color>
+ <color name="i_am_color_e3">#000000e3</color>
+ <color name="i_am_color_e4">#000000e4</color>
+ <color name="i_am_color_e5">#000000e5</color>
+ <color name="i_am_color_e6">#000000e6</color>
+ <color name="i_am_color_e7">#000000e7</color>
+ <color name="i_am_color_e8">#000000e8</color>
+ <color name="i_am_color_e9">#000000e9</color>
+ <color name="i_am_color_ea">#000000ea</color>
+ <color name="i_am_color_eb">#000000eb</color>
+ <color name="i_am_color_ec">#000000ec</color>
+ <color name="i_am_color_ed">#000000ed</color>
+ <color name="i_am_color_ee">#000000ee</color>
+ <color name="i_am_color_ef">#000000ef</color>
+ <color name="i_am_color_f0">#000000f0</color>
+ <color name="i_am_color_f1">#000000f1</color>
+ <color name="i_am_color_f2">#000000f2</color>
+ <color name="i_am_color_f3">#000000f3</color>
+ <color name="i_am_color_f4">#000000f4</color>
+ <color name="i_am_color_f5">#000000f5</color>
+ <color name="i_am_color_f6">#000000f6</color>
+ <color name="i_am_color_f7">#000000f7</color>
+ <color name="i_am_color_f8">#000000f8</color>
+ <color name="i_am_color_f9">#000000f9</color>
+ <color name="i_am_color_fa">#000000fa</color>
+ <color name="i_am_color_fb">#000000fb</color>
+ <color name="i_am_color_fc">#000000fc</color>
+ <color name="i_am_color_fd">#000000fd</color>
+ <color name="i_am_color_fe">#000000fe</color>
+ <color name="i_am_color_ff">#000000ff</color>
+ <color name="i_am_color_100">#00000100</color>
+ <color name="i_am_color_101">#00000101</color>
+ <color name="i_am_color_102">#00000102</color>
+ <color name="i_am_color_103">#00000103</color>
+ <color name="i_am_color_104">#00000104</color>
+ <color name="i_am_color_105">#00000105</color>
+ <color name="i_am_color_106">#00000106</color>
+ <color name="i_am_color_107">#00000107</color>
+ <color name="i_am_color_108">#00000108</color>
+ <color name="i_am_color_109">#00000109</color>
+ <color name="i_am_color_10a">#0000010a</color>
+ <color name="i_am_color_10b">#0000010b</color>
+ <color name="i_am_color_10c">#0000010c</color>
+ <color name="i_am_color_10d">#0000010d</color>
+ <color name="i_am_color_10e">#0000010e</color>
+ <color name="i_am_color_10f">#0000010f</color>
+ <color name="i_am_color_110">#00000110</color>
+ <color name="i_am_color_111">#00000111</color>
+ <color name="i_am_color_112">#00000112</color>
+ <color name="i_am_color_113">#00000113</color>
+ <color name="i_am_color_114">#00000114</color>
+ <color name="i_am_color_115">#00000115</color>
+ <color name="i_am_color_116">#00000116</color>
+ <color name="i_am_color_117">#00000117</color>
+ <color name="i_am_color_118">#00000118</color>
+ <color name="i_am_color_119">#00000119</color>
+ <color name="i_am_color_11a">#0000011a</color>
+ <color name="i_am_color_11b">#0000011b</color>
+ <color name="i_am_color_11c">#0000011c</color>
+ <color name="i_am_color_11d">#0000011d</color>
+ <color name="i_am_color_11e">#0000011e</color>
+ <color name="i_am_color_11f">#0000011f</color>
+ <color name="i_am_color_120">#00000120</color>
+ <color name="i_am_color_121">#00000121</color>
+ <color name="i_am_color_122">#00000122</color>
+ <color name="i_am_color_123">#00000123</color>
+ <color name="i_am_color_124">#00000124</color>
+ <color name="i_am_color_125">#00000125</color>
+ <color name="i_am_color_126">#00000126</color>
+ <color name="i_am_color_127">#00000127</color>
+ <color name="i_am_color_128">#00000128</color>
+ <color name="i_am_color_129">#00000129</color>
+ <color name="i_am_color_12a">#0000012a</color>
+ <color name="i_am_color_12b">#0000012b</color>
+ <color name="i_am_color_12c">#0000012c</color>
+ <color name="i_am_color_12d">#0000012d</color>
+ <color name="i_am_color_12e">#0000012e</color>
+ <color name="i_am_color_12f">#0000012f</color>
+ <color name="i_am_color_130">#00000130</color>
+ <color name="i_am_color_131">#00000131</color>
+ <color name="i_am_color_132">#00000132</color>
+ <color name="i_am_color_133">#00000133</color>
+ <color name="i_am_color_134">#00000134</color>
+ <color name="i_am_color_135">#00000135</color>
+ <color name="i_am_color_136">#00000136</color>
+ <color name="i_am_color_137">#00000137</color>
+ <color name="i_am_color_138">#00000138</color>
+ <color name="i_am_color_139">#00000139</color>
+ <color name="i_am_color_13a">#0000013a</color>
+ <color name="i_am_color_13b">#0000013b</color>
+ <color name="i_am_color_13c">#0000013c</color>
+ <color name="i_am_color_13d">#0000013d</color>
+ <color name="i_am_color_13e">#0000013e</color>
+ <color name="i_am_color_13f">#0000013f</color>
+ <color name="i_am_color_140">#00000140</color>
+ <color name="i_am_color_141">#00000141</color>
+ <color name="i_am_color_142">#00000142</color>
+ <color name="i_am_color_143">#00000143</color>
+ <color name="i_am_color_144">#00000144</color>
+ <color name="i_am_color_145">#00000145</color>
+ <color name="i_am_color_146">#00000146</color>
+ <color name="i_am_color_147">#00000147</color>
+ <color name="i_am_color_148">#00000148</color>
+ <color name="i_am_color_149">#00000149</color>
+ <color name="i_am_color_14a">#0000014a</color>
+ <color name="i_am_color_14b">#0000014b</color>
+ <color name="i_am_color_14c">#0000014c</color>
+ <color name="i_am_color_14d">#0000014d</color>
+ <color name="i_am_color_14e">#0000014e</color>
+ <color name="i_am_color_14f">#0000014f</color>
+ <color name="i_am_color_150">#00000150</color>
+ <color name="i_am_color_151">#00000151</color>
+ <color name="i_am_color_152">#00000152</color>
+ <color name="i_am_color_153">#00000153</color>
+ <color name="i_am_color_154">#00000154</color>
+ <color name="i_am_color_155">#00000155</color>
+ <color name="i_am_color_156">#00000156</color>
+ <color name="i_am_color_157">#00000157</color>
+ <color name="i_am_color_158">#00000158</color>
+ <color name="i_am_color_159">#00000159</color>
+ <color name="i_am_color_15a">#0000015a</color>
+ <color name="i_am_color_15b">#0000015b</color>
+ <color name="i_am_color_15c">#0000015c</color>
+ <color name="i_am_color_15d">#0000015d</color>
+ <color name="i_am_color_15e">#0000015e</color>
+ <color name="i_am_color_15f">#0000015f</color>
+ <color name="i_am_color_160">#00000160</color>
+ <color name="i_am_color_161">#00000161</color>
+ <color name="i_am_color_162">#00000162</color>
+ <color name="i_am_color_163">#00000163</color>
+ <color name="i_am_color_164">#00000164</color>
+ <color name="i_am_color_165">#00000165</color>
+ <color name="i_am_color_166">#00000166</color>
+ <color name="i_am_color_167">#00000167</color>
+ <color name="i_am_color_168">#00000168</color>
+ <color name="i_am_color_169">#00000169</color>
+ <color name="i_am_color_16a">#0000016a</color>
+ <color name="i_am_color_16b">#0000016b</color>
+ <color name="i_am_color_16c">#0000016c</color>
+ <color name="i_am_color_16d">#0000016d</color>
+ <color name="i_am_color_16e">#0000016e</color>
+ <color name="i_am_color_16f">#0000016f</color>
+ <color name="i_am_color_170">#00000170</color>
+ <color name="i_am_color_171">#00000171</color>
+ <color name="i_am_color_172">#00000172</color>
+ <color name="i_am_color_173">#00000173</color>
+ <color name="i_am_color_174">#00000174</color>
+ <color name="i_am_color_175">#00000175</color>
+ <color name="i_am_color_176">#00000176</color>
+ <color name="i_am_color_177">#00000177</color>
+ <color name="i_am_color_178">#00000178</color>
+ <color name="i_am_color_179">#00000179</color>
+ <color name="i_am_color_17a">#0000017a</color>
+ <color name="i_am_color_17b">#0000017b</color>
+ <color name="i_am_color_17c">#0000017c</color>
+ <color name="i_am_color_17d">#0000017d</color>
+ <color name="i_am_color_17e">#0000017e</color>
+ <color name="i_am_color_17f">#0000017f</color>
+ <color name="i_am_color_180">#00000180</color>
+ <color name="i_am_color_181">#00000181</color>
+ <color name="i_am_color_182">#00000182</color>
+ <color name="i_am_color_183">#00000183</color>
+ <color name="i_am_color_184">#00000184</color>
+ <color name="i_am_color_185">#00000185</color>
+ <color name="i_am_color_186">#00000186</color>
+ <color name="i_am_color_187">#00000187</color>
+ <color name="i_am_color_188">#00000188</color>
+ <color name="i_am_color_189">#00000189</color>
+ <color name="i_am_color_18a">#0000018a</color>
+ <color name="i_am_color_18b">#0000018b</color>
+ <color name="i_am_color_18c">#0000018c</color>
+ <color name="i_am_color_18d">#0000018d</color>
+ <color name="i_am_color_18e">#0000018e</color>
+ <color name="i_am_color_18f">#0000018f</color>
+ <color name="i_am_color_190">#00000190</color>
+ <color name="i_am_color_191">#00000191</color>
+ <color name="i_am_color_192">#00000192</color>
+ <color name="i_am_color_193">#00000193</color>
+ <color name="i_am_color_194">#00000194</color>
+ <color name="i_am_color_195">#00000195</color>
+ <color name="i_am_color_196">#00000196</color>
+ <color name="i_am_color_197">#00000197</color>
+ <color name="i_am_color_198">#00000198</color>
+ <color name="i_am_color_199">#00000199</color>
+ <color name="i_am_color_19a">#0000019a</color>
+ <color name="i_am_color_19b">#0000019b</color>
+ <color name="i_am_color_19c">#0000019c</color>
+ <color name="i_am_color_19d">#0000019d</color>
+ <color name="i_am_color_19e">#0000019e</color>
+ <color name="i_am_color_19f">#0000019f</color>
+ <color name="i_am_color_1a0">#000001a0</color>
+ <color name="i_am_color_1a1">#000001a1</color>
+ <color name="i_am_color_1a2">#000001a2</color>
+ <color name="i_am_color_1a3">#000001a3</color>
+ <color name="i_am_color_1a4">#000001a4</color>
+ <color name="i_am_color_1a5">#000001a5</color>
+ <color name="i_am_color_1a6">#000001a6</color>
+ <color name="i_am_color_1a7">#000001a7</color>
+ <color name="i_am_color_1a8">#000001a8</color>
+ <color name="i_am_color_1a9">#000001a9</color>
+ <color name="i_am_color_1aa">#000001aa</color>
+ <color name="i_am_color_1ab">#000001ab</color>
+ <color name="i_am_color_1ac">#000001ac</color>
+ <color name="i_am_color_1ad">#000001ad</color>
+ <color name="i_am_color_1ae">#000001ae</color>
+ <color name="i_am_color_1af">#000001af</color>
+ <color name="i_am_color_1b0">#000001b0</color>
+ <color name="i_am_color_1b1">#000001b1</color>
+ <color name="i_am_color_1b2">#000001b2</color>
+ <color name="i_am_color_1b3">#000001b3</color>
+ <color name="i_am_color_1b4">#000001b4</color>
+ <color name="i_am_color_1b5">#000001b5</color>
+ <color name="i_am_color_1b6">#000001b6</color>
+ <color name="i_am_color_1b7">#000001b7</color>
+ <color name="i_am_color_1b8">#000001b8</color>
+ <color name="i_am_color_1b9">#000001b9</color>
+ <color name="i_am_color_1ba">#000001ba</color>
+ <color name="i_am_color_1bb">#000001bb</color>
+ <color name="i_am_color_1bc">#000001bc</color>
+ <color name="i_am_color_1bd">#000001bd</color>
+ <color name="i_am_color_1be">#000001be</color>
+ <color name="i_am_color_1bf">#000001bf</color>
+ <color name="i_am_color_1c0">#000001c0</color>
+ <color name="i_am_color_1c1">#000001c1</color>
+ <color name="i_am_color_1c2">#000001c2</color>
+ <color name="i_am_color_1c3">#000001c3</color>
+ <color name="i_am_color_1c4">#000001c4</color>
+ <color name="i_am_color_1c5">#000001c5</color>
+ <color name="i_am_color_1c6">#000001c6</color>
+ <color name="i_am_color_1c7">#000001c7</color>
+ <color name="i_am_color_1c8">#000001c8</color>
+ <color name="i_am_color_1c9">#000001c9</color>
+ <color name="i_am_color_1ca">#000001ca</color>
+ <color name="i_am_color_1cb">#000001cb</color>
+ <color name="i_am_color_1cc">#000001cc</color>
+ <color name="i_am_color_1cd">#000001cd</color>
+ <color name="i_am_color_1ce">#000001ce</color>
+ <color name="i_am_color_1cf">#000001cf</color>
+ <color name="i_am_color_1d0">#000001d0</color>
+ <color name="i_am_color_1d1">#000001d1</color>
+ <color name="i_am_color_1d2">#000001d2</color>
+ <color name="i_am_color_1d3">#000001d3</color>
+ <color name="i_am_color_1d4">#000001d4</color>
+ <color name="i_am_color_1d5">#000001d5</color>
+ <color name="i_am_color_1d6">#000001d6</color>
+ <color name="i_am_color_1d7">#000001d7</color>
+ <color name="i_am_color_1d8">#000001d8</color>
+ <color name="i_am_color_1d9">#000001d9</color>
+ <color name="i_am_color_1da">#000001da</color>
+ <color name="i_am_color_1db">#000001db</color>
+ <color name="i_am_color_1dc">#000001dc</color>
+ <color name="i_am_color_1dd">#000001dd</color>
+ <color name="i_am_color_1de">#000001de</color>
+ <color name="i_am_color_1df">#000001df</color>
+ <color name="i_am_color_1e0">#000001e0</color>
+ <color name="i_am_color_1e1">#000001e1</color>
+ <color name="i_am_color_1e2">#000001e2</color>
+ <color name="i_am_color_1e3">#000001e3</color>
+ <color name="i_am_color_1e4">#000001e4</color>
+ <color name="i_am_color_1e5">#000001e5</color>
+ <color name="i_am_color_1e6">#000001e6</color>
+ <color name="i_am_color_1e7">#000001e7</color>
+ <color name="i_am_color_1e8">#000001e8</color>
+ <color name="i_am_color_1e9">#000001e9</color>
+ <color name="i_am_color_1ea">#000001ea</color>
+ <color name="i_am_color_1eb">#000001eb</color>
+ <color name="i_am_color_1ec">#000001ec</color>
+ <color name="i_am_color_1ed">#000001ed</color>
+ <color name="i_am_color_1ee">#000001ee</color>
+ <color name="i_am_color_1ef">#000001ef</color>
+ <color name="i_am_color_1f0">#000001f0</color>
+ <color name="i_am_color_1f1">#000001f1</color>
+ <color name="i_am_color_1f2">#000001f2</color>
+ <color name="i_am_color_1f3">#000001f3</color>
+ <color name="i_am_color_1f4">#000001f4</color>
+ <color name="i_am_color_1f5">#000001f5</color>
+ <color name="i_am_color_1f6">#000001f6</color>
+ <color name="i_am_color_1f7">#000001f7</color>
+ <color name="i_am_color_1f8">#000001f8</color>
+ <color name="i_am_color_1f9">#000001f9</color>
+ <color name="i_am_color_1fa">#000001fa</color>
+ <color name="i_am_color_1fb">#000001fb</color>
+ <color name="i_am_color_1fc">#000001fc</color>
+ <color name="i_am_color_1fd">#000001fd</color>
+ <color name="i_am_color_1fe">#000001fe</color>
+ <color name="i_am_color_1ff">#000001ff</color>
+ <color name="i_am_color_200">#00000200</color>
+ <color name="i_am_color_201">#00000201</color>
+ <color name="i_am_color_202">#00000202</color>
+ <color name="i_am_color_203">#00000203</color>
+ <color name="i_am_color_204">#00000204</color>
+ <color name="i_am_color_205">#00000205</color>
+ <color name="i_am_color_206">#00000206</color>
+ <color name="i_am_color_207">#00000207</color>
+ <color name="i_am_color_208">#00000208</color>
+ <color name="i_am_color_209">#00000209</color>
+ <color name="i_am_color_20a">#0000020a</color>
+ <color name="i_am_color_20b">#0000020b</color>
+ <color name="i_am_color_20c">#0000020c</color>
+ <color name="i_am_color_20d">#0000020d</color>
+ <color name="i_am_color_20e">#0000020e</color>
+ <color name="i_am_color_20f">#0000020f</color>
+ <color name="i_am_color_210">#00000210</color>
+ <color name="i_am_color_211">#00000211</color>
+ <color name="i_am_color_212">#00000212</color>
+ <color name="i_am_color_213">#00000213</color>
+ <color name="i_am_color_214">#00000214</color>
+ <color name="i_am_color_215">#00000215</color>
+ <color name="i_am_color_216">#00000216</color>
+ <color name="i_am_color_217">#00000217</color>
+ <color name="i_am_color_218">#00000218</color>
+ <color name="i_am_color_219">#00000219</color>
+ <color name="i_am_color_21a">#0000021a</color>
+ <color name="i_am_color_21b">#0000021b</color>
+ <color name="i_am_color_21c">#0000021c</color>
+ <color name="i_am_color_21d">#0000021d</color>
+ <color name="i_am_color_21e">#0000021e</color>
+ <color name="i_am_color_21f">#0000021f</color>
+ <color name="i_am_color_220">#00000220</color>
+ <color name="i_am_color_221">#00000221</color>
+ <color name="i_am_color_222">#00000222</color>
+ <color name="i_am_color_223">#00000223</color>
+ <color name="i_am_color_224">#00000224</color>
+ <color name="i_am_color_225">#00000225</color>
+ <color name="i_am_color_226">#00000226</color>
+ <color name="i_am_color_227">#00000227</color>
+ <color name="i_am_color_228">#00000228</color>
+ <color name="i_am_color_229">#00000229</color>
+ <color name="i_am_color_22a">#0000022a</color>
+ <color name="i_am_color_22b">#0000022b</color>
+ <color name="i_am_color_22c">#0000022c</color>
+ <color name="i_am_color_22d">#0000022d</color>
+ <color name="i_am_color_22e">#0000022e</color>
+ <color name="i_am_color_22f">#0000022f</color>
+ <color name="i_am_color_230">#00000230</color>
+ <color name="i_am_color_231">#00000231</color>
+ <color name="i_am_color_232">#00000232</color>
+ <color name="i_am_color_233">#00000233</color>
+ <color name="i_am_color_234">#00000234</color>
+ <color name="i_am_color_235">#00000235</color>
+ <color name="i_am_color_236">#00000236</color>
+ <color name="i_am_color_237">#00000237</color>
+ <color name="i_am_color_238">#00000238</color>
+ <color name="i_am_color_239">#00000239</color>
+ <color name="i_am_color_23a">#0000023a</color>
+ <color name="i_am_color_23b">#0000023b</color>
+ <color name="i_am_color_23c">#0000023c</color>
+ <color name="i_am_color_23d">#0000023d</color>
+ <color name="i_am_color_23e">#0000023e</color>
+ <color name="i_am_color_23f">#0000023f</color>
+ <color name="i_am_color_240">#00000240</color>
+ <color name="i_am_color_241">#00000241</color>
+ <color name="i_am_color_242">#00000242</color>
+ <color name="i_am_color_243">#00000243</color>
+ <color name="i_am_color_244">#00000244</color>
+ <color name="i_am_color_245">#00000245</color>
+ <color name="i_am_color_246">#00000246</color>
+ <color name="i_am_color_247">#00000247</color>
+ <color name="i_am_color_248">#00000248</color>
+ <color name="i_am_color_249">#00000249</color>
+ <color name="i_am_color_24a">#0000024a</color>
+ <color name="i_am_color_24b">#0000024b</color>
+ <color name="i_am_color_24c">#0000024c</color>
+ <color name="i_am_color_24d">#0000024d</color>
+ <color name="i_am_color_24e">#0000024e</color>
+ <color name="i_am_color_24f">#0000024f</color>
+ <color name="i_am_color_250">#00000250</color>
+ <color name="i_am_color_251">#00000251</color>
+ <color name="i_am_color_252">#00000252</color>
+ <color name="i_am_color_253">#00000253</color>
+ <color name="i_am_color_254">#00000254</color>
+ <color name="i_am_color_255">#00000255</color>
+ <color name="i_am_color_256">#00000256</color>
+ <color name="i_am_color_257">#00000257</color>
+ <color name="i_am_color_258">#00000258</color>
+ <color name="i_am_color_259">#00000259</color>
+ <color name="i_am_color_25a">#0000025a</color>
+ <color name="i_am_color_25b">#0000025b</color>
+ <color name="i_am_color_25c">#0000025c</color>
+ <color name="i_am_color_25d">#0000025d</color>
+ <color name="i_am_color_25e">#0000025e</color>
+ <color name="i_am_color_25f">#0000025f</color>
+ <color name="i_am_color_260">#00000260</color>
+ <color name="i_am_color_261">#00000261</color>
+ <color name="i_am_color_262">#00000262</color>
+ <color name="i_am_color_263">#00000263</color>
+ <color name="i_am_color_264">#00000264</color>
+ <color name="i_am_color_265">#00000265</color>
+ <color name="i_am_color_266">#00000266</color>
+ <color name="i_am_color_267">#00000267</color>
+ <color name="i_am_color_268">#00000268</color>
+ <color name="i_am_color_269">#00000269</color>
+ <color name="i_am_color_26a">#0000026a</color>
+ <color name="i_am_color_26b">#0000026b</color>
+ <color name="i_am_color_26c">#0000026c</color>
+ <color name="i_am_color_26d">#0000026d</color>
+ <color name="i_am_color_26e">#0000026e</color>
+ <color name="i_am_color_26f">#0000026f</color>
+ <color name="i_am_color_270">#00000270</color>
+ <color name="i_am_color_271">#00000271</color>
+ <color name="i_am_color_272">#00000272</color>
+ <color name="i_am_color_273">#00000273</color>
+ <color name="i_am_color_274">#00000274</color>
+ <color name="i_am_color_275">#00000275</color>
+ <color name="i_am_color_276">#00000276</color>
+ <color name="i_am_color_277">#00000277</color>
+ <color name="i_am_color_278">#00000278</color>
+ <color name="i_am_color_279">#00000279</color>
+ <color name="i_am_color_27a">#0000027a</color>
+ <color name="i_am_color_27b">#0000027b</color>
+ <color name="i_am_color_27c">#0000027c</color>
+ <color name="i_am_color_27d">#0000027d</color>
+ <color name="i_am_color_27e">#0000027e</color>
+ <color name="i_am_color_27f">#0000027f</color>
+ <color name="i_am_color_280">#00000280</color>
+ <color name="i_am_color_281">#00000281</color>
+ <color name="i_am_color_282">#00000282</color>
+ <color name="i_am_color_283">#00000283</color>
+ <color name="i_am_color_284">#00000284</color>
+ <color name="i_am_color_285">#00000285</color>
+ <color name="i_am_color_286">#00000286</color>
+ <color name="i_am_color_287">#00000287</color>
+ <color name="i_am_color_288">#00000288</color>
+ <color name="i_am_color_289">#00000289</color>
+ <color name="i_am_color_28a">#0000028a</color>
+ <color name="i_am_color_28b">#0000028b</color>
+ <color name="i_am_color_28c">#0000028c</color>
+ <color name="i_am_color_28d">#0000028d</color>
+ <color name="i_am_color_28e">#0000028e</color>
+ <color name="i_am_color_28f">#0000028f</color>
+ <color name="i_am_color_290">#00000290</color>
+ <color name="i_am_color_291">#00000291</color>
+ <color name="i_am_color_292">#00000292</color>
+ <color name="i_am_color_293">#00000293</color>
+ <color name="i_am_color_294">#00000294</color>
+ <color name="i_am_color_295">#00000295</color>
+ <color name="i_am_color_296">#00000296</color>
+ <color name="i_am_color_297">#00000297</color>
+ <color name="i_am_color_298">#00000298</color>
+ <color name="i_am_color_299">#00000299</color>
+ <color name="i_am_color_29a">#0000029a</color>
+ <color name="i_am_color_29b">#0000029b</color>
+ <color name="i_am_color_29c">#0000029c</color>
+ <color name="i_am_color_29d">#0000029d</color>
+ <color name="i_am_color_29e">#0000029e</color>
+ <color name="i_am_color_29f">#0000029f</color>
+ <color name="i_am_color_2a0">#000002a0</color>
+ <color name="i_am_color_2a1">#000002a1</color>
+ <color name="i_am_color_2a2">#000002a2</color>
+ <color name="i_am_color_2a3">#000002a3</color>
+ <color name="i_am_color_2a4">#000002a4</color>
+ <color name="i_am_color_2a5">#000002a5</color>
+ <color name="i_am_color_2a6">#000002a6</color>
+ <color name="i_am_color_2a7">#000002a7</color>
+ <color name="i_am_color_2a8">#000002a8</color>
+ <color name="i_am_color_2a9">#000002a9</color>
+ <color name="i_am_color_2aa">#000002aa</color>
+ <color name="i_am_color_2ab">#000002ab</color>
+ <color name="i_am_color_2ac">#000002ac</color>
+ <color name="i_am_color_2ad">#000002ad</color>
+ <color name="i_am_color_2ae">#000002ae</color>
+ <color name="i_am_color_2af">#000002af</color>
+ <color name="i_am_color_2b0">#000002b0</color>
+ <color name="i_am_color_2b1">#000002b1</color>
+ <color name="i_am_color_2b2">#000002b2</color>
+ <color name="i_am_color_2b3">#000002b3</color>
+ <color name="i_am_color_2b4">#000002b4</color>
+ <color name="i_am_color_2b5">#000002b5</color>
+ <color name="i_am_color_2b6">#000002b6</color>
+ <color name="i_am_color_2b7">#000002b7</color>
+ <color name="i_am_color_2b8">#000002b8</color>
+ <color name="i_am_color_2b9">#000002b9</color>
+ <color name="i_am_color_2ba">#000002ba</color>
+ <color name="i_am_color_2bb">#000002bb</color>
+ <color name="i_am_color_2bc">#000002bc</color>
+ <color name="i_am_color_2bd">#000002bd</color>
+ <color name="i_am_color_2be">#000002be</color>
+ <color name="i_am_color_2bf">#000002bf</color>
+ <color name="i_am_color_2c0">#000002c0</color>
+ <color name="i_am_color_2c1">#000002c1</color>
+ <color name="i_am_color_2c2">#000002c2</color>
+ <color name="i_am_color_2c3">#000002c3</color>
+ <color name="i_am_color_2c4">#000002c4</color>
+ <color name="i_am_color_2c5">#000002c5</color>
+ <color name="i_am_color_2c6">#000002c6</color>
+ <color name="i_am_color_2c7">#000002c7</color>
+ <color name="i_am_color_2c8">#000002c8</color>
+ <color name="i_am_color_2c9">#000002c9</color>
+ <color name="i_am_color_2ca">#000002ca</color>
+ <color name="i_am_color_2cb">#000002cb</color>
+ <color name="i_am_color_2cc">#000002cc</color>
+ <color name="i_am_color_2cd">#000002cd</color>
+ <color name="i_am_color_2ce">#000002ce</color>
+ <color name="i_am_color_2cf">#000002cf</color>
+ <color name="i_am_color_2d0">#000002d0</color>
+ <color name="i_am_color_2d1">#000002d1</color>
+ <color name="i_am_color_2d2">#000002d2</color>
+ <color name="i_am_color_2d3">#000002d3</color>
+ <color name="i_am_color_2d4">#000002d4</color>
+ <color name="i_am_color_2d5">#000002d5</color>
+ <color name="i_am_color_2d6">#000002d6</color>
+ <color name="i_am_color_2d7">#000002d7</color>
+ <color name="i_am_color_2d8">#000002d8</color>
+ <color name="i_am_color_2d9">#000002d9</color>
+ <color name="i_am_color_2da">#000002da</color>
+ <color name="i_am_color_2db">#000002db</color>
+ <color name="i_am_color_2dc">#000002dc</color>
+ <color name="i_am_color_2dd">#000002dd</color>
+ <color name="i_am_color_2de">#000002de</color>
+ <color name="i_am_color_2df">#000002df</color>
+ <color name="i_am_color_2e0">#000002e0</color>
+ <color name="i_am_color_2e1">#000002e1</color>
+ <color name="i_am_color_2e2">#000002e2</color>
+ <color name="i_am_color_2e3">#000002e3</color>
+ <color name="i_am_color_2e4">#000002e4</color>
+ <color name="i_am_color_2e5">#000002e5</color>
+ <color name="i_am_color_2e6">#000002e6</color>
+ <color name="i_am_color_2e7">#000002e7</color>
+ <color name="i_am_color_2e8">#000002e8</color>
+ <color name="i_am_color_2e9">#000002e9</color>
+ <color name="i_am_color_2ea">#000002ea</color>
+ <color name="i_am_color_2eb">#000002eb</color>
+ <color name="i_am_color_2ec">#000002ec</color>
+ <color name="i_am_color_2ed">#000002ed</color>
+ <color name="i_am_color_2ee">#000002ee</color>
+ <color name="i_am_color_2ef">#000002ef</color>
+ <color name="i_am_color_2f0">#000002f0</color>
+ <color name="i_am_color_2f1">#000002f1</color>
+ <color name="i_am_color_2f2">#000002f2</color>
+ <color name="i_am_color_2f3">#000002f3</color>
+ <color name="i_am_color_2f4">#000002f4</color>
+ <color name="i_am_color_2f5">#000002f5</color>
+ <color name="i_am_color_2f6">#000002f6</color>
+ <color name="i_am_color_2f7">#000002f7</color>
+ <color name="i_am_color_2f8">#000002f8</color>
+ <color name="i_am_color_2f9">#000002f9</color>
+ <color name="i_am_color_2fa">#000002fa</color>
+ <color name="i_am_color_2fb">#000002fb</color>
+ <color name="i_am_color_2fc">#000002fc</color>
+ <color name="i_am_color_2fd">#000002fd</color>
+ <color name="i_am_color_2fe">#000002fe</color>
+ <color name="i_am_color_2ff">#000002ff</color>
+ <color name="i_am_color_300">#00000300</color>
+ <color name="i_am_color_301">#00000301</color>
+ <color name="i_am_color_302">#00000302</color>
+ <color name="i_am_color_303">#00000303</color>
+ <color name="i_am_color_304">#00000304</color>
+ <color name="i_am_color_305">#00000305</color>
+ <color name="i_am_color_306">#00000306</color>
+ <color name="i_am_color_307">#00000307</color>
+ <color name="i_am_color_308">#00000308</color>
+ <color name="i_am_color_309">#00000309</color>
+ <color name="i_am_color_30a">#0000030a</color>
+ <color name="i_am_color_30b">#0000030b</color>
+ <color name="i_am_color_30c">#0000030c</color>
+ <color name="i_am_color_30d">#0000030d</color>
+ <color name="i_am_color_30e">#0000030e</color>
+ <color name="i_am_color_30f">#0000030f</color>
+ <color name="i_am_color_310">#00000310</color>
+ <color name="i_am_color_311">#00000311</color>
+ <color name="i_am_color_312">#00000312</color>
+ <color name="i_am_color_313">#00000313</color>
+ <color name="i_am_color_314">#00000314</color>
+ <color name="i_am_color_315">#00000315</color>
+ <color name="i_am_color_316">#00000316</color>
+ <color name="i_am_color_317">#00000317</color>
+ <color name="i_am_color_318">#00000318</color>
+ <color name="i_am_color_319">#00000319</color>
+ <color name="i_am_color_31a">#0000031a</color>
+ <color name="i_am_color_31b">#0000031b</color>
+ <color name="i_am_color_31c">#0000031c</color>
+ <color name="i_am_color_31d">#0000031d</color>
+ <color name="i_am_color_31e">#0000031e</color>
+ <color name="i_am_color_31f">#0000031f</color>
+ <color name="i_am_color_320">#00000320</color>
+ <color name="i_am_color_321">#00000321</color>
+ <color name="i_am_color_322">#00000322</color>
+ <color name="i_am_color_323">#00000323</color>
+ <color name="i_am_color_324">#00000324</color>
+ <color name="i_am_color_325">#00000325</color>
+ <color name="i_am_color_326">#00000326</color>
+ <color name="i_am_color_327">#00000327</color>
+ <color name="i_am_color_328">#00000328</color>
+ <color name="i_am_color_329">#00000329</color>
+ <color name="i_am_color_32a">#0000032a</color>
+ <color name="i_am_color_32b">#0000032b</color>
+ <color name="i_am_color_32c">#0000032c</color>
+ <color name="i_am_color_32d">#0000032d</color>
+ <color name="i_am_color_32e">#0000032e</color>
+ <color name="i_am_color_32f">#0000032f</color>
+ <color name="i_am_color_330">#00000330</color>
+ <color name="i_am_color_331">#00000331</color>
+ <color name="i_am_color_332">#00000332</color>
+ <color name="i_am_color_333">#00000333</color>
+ <color name="i_am_color_334">#00000334</color>
+ <color name="i_am_color_335">#00000335</color>
+ <color name="i_am_color_336">#00000336</color>
+ <color name="i_am_color_337">#00000337</color>
+ <color name="i_am_color_338">#00000338</color>
+ <color name="i_am_color_339">#00000339</color>
+ <color name="i_am_color_33a">#0000033a</color>
+ <color name="i_am_color_33b">#0000033b</color>
+ <color name="i_am_color_33c">#0000033c</color>
+ <color name="i_am_color_33d">#0000033d</color>
+ <color name="i_am_color_33e">#0000033e</color>
+ <color name="i_am_color_33f">#0000033f</color>
+ <color name="i_am_color_340">#00000340</color>
+ <color name="i_am_color_341">#00000341</color>
+ <color name="i_am_color_342">#00000342</color>
+ <color name="i_am_color_343">#00000343</color>
+ <color name="i_am_color_344">#00000344</color>
+ <color name="i_am_color_345">#00000345</color>
+ <color name="i_am_color_346">#00000346</color>
+ <color name="i_am_color_347">#00000347</color>
+ <color name="i_am_color_348">#00000348</color>
+ <color name="i_am_color_349">#00000349</color>
+ <color name="i_am_color_34a">#0000034a</color>
+ <color name="i_am_color_34b">#0000034b</color>
+ <color name="i_am_color_34c">#0000034c</color>
+ <color name="i_am_color_34d">#0000034d</color>
+ <color name="i_am_color_34e">#0000034e</color>
+ <color name="i_am_color_34f">#0000034f</color>
+ <color name="i_am_color_350">#00000350</color>
+ <color name="i_am_color_351">#00000351</color>
+ <color name="i_am_color_352">#00000352</color>
+ <color name="i_am_color_353">#00000353</color>
+ <color name="i_am_color_354">#00000354</color>
+ <color name="i_am_color_355">#00000355</color>
+ <color name="i_am_color_356">#00000356</color>
+ <color name="i_am_color_357">#00000357</color>
+ <color name="i_am_color_358">#00000358</color>
+ <color name="i_am_color_359">#00000359</color>
+ <color name="i_am_color_35a">#0000035a</color>
+ <color name="i_am_color_35b">#0000035b</color>
+ <color name="i_am_color_35c">#0000035c</color>
+ <color name="i_am_color_35d">#0000035d</color>
+ <color name="i_am_color_35e">#0000035e</color>
+ <color name="i_am_color_35f">#0000035f</color>
+ <color name="i_am_color_360">#00000360</color>
+ <color name="i_am_color_361">#00000361</color>
+ <color name="i_am_color_362">#00000362</color>
+ <color name="i_am_color_363">#00000363</color>
+ <color name="i_am_color_364">#00000364</color>
+ <color name="i_am_color_365">#00000365</color>
+ <color name="i_am_color_366">#00000366</color>
+ <color name="i_am_color_367">#00000367</color>
+ <color name="i_am_color_368">#00000368</color>
+ <color name="i_am_color_369">#00000369</color>
+ <color name="i_am_color_36a">#0000036a</color>
+ <color name="i_am_color_36b">#0000036b</color>
+ <color name="i_am_color_36c">#0000036c</color>
+ <color name="i_am_color_36d">#0000036d</color>
+ <color name="i_am_color_36e">#0000036e</color>
+ <color name="i_am_color_36f">#0000036f</color>
+ <color name="i_am_color_370">#00000370</color>
+ <color name="i_am_color_371">#00000371</color>
+ <color name="i_am_color_372">#00000372</color>
+ <color name="i_am_color_373">#00000373</color>
+ <color name="i_am_color_374">#00000374</color>
+ <color name="i_am_color_375">#00000375</color>
+ <color name="i_am_color_376">#00000376</color>
+ <color name="i_am_color_377">#00000377</color>
+ <color name="i_am_color_378">#00000378</color>
+ <color name="i_am_color_379">#00000379</color>
+ <color name="i_am_color_37a">#0000037a</color>
+ <color name="i_am_color_37b">#0000037b</color>
+ <color name="i_am_color_37c">#0000037c</color>
+ <color name="i_am_color_37d">#0000037d</color>
+ <color name="i_am_color_37e">#0000037e</color>
+ <color name="i_am_color_37f">#0000037f</color>
+ <color name="i_am_color_380">#00000380</color>
+ <color name="i_am_color_381">#00000381</color>
+ <color name="i_am_color_382">#00000382</color>
+ <color name="i_am_color_383">#00000383</color>
+ <color name="i_am_color_384">#00000384</color>
+ <color name="i_am_color_385">#00000385</color>
+ <color name="i_am_color_386">#00000386</color>
+ <color name="i_am_color_387">#00000387</color>
+ <color name="i_am_color_388">#00000388</color>
+ <color name="i_am_color_389">#00000389</color>
+ <color name="i_am_color_38a">#0000038a</color>
+ <color name="i_am_color_38b">#0000038b</color>
+ <color name="i_am_color_38c">#0000038c</color>
+ <color name="i_am_color_38d">#0000038d</color>
+ <color name="i_am_color_38e">#0000038e</color>
+ <color name="i_am_color_38f">#0000038f</color>
+ <color name="i_am_color_390">#00000390</color>
+ <color name="i_am_color_391">#00000391</color>
+ <color name="i_am_color_392">#00000392</color>
+ <color name="i_am_color_393">#00000393</color>
+ <color name="i_am_color_394">#00000394</color>
+ <color name="i_am_color_395">#00000395</color>
+ <color name="i_am_color_396">#00000396</color>
+ <color name="i_am_color_397">#00000397</color>
+ <color name="i_am_color_398">#00000398</color>
+ <color name="i_am_color_399">#00000399</color>
+ <color name="i_am_color_39a">#0000039a</color>
+ <color name="i_am_color_39b">#0000039b</color>
+ <color name="i_am_color_39c">#0000039c</color>
+ <color name="i_am_color_39d">#0000039d</color>
+ <color name="i_am_color_39e">#0000039e</color>
+ <color name="i_am_color_39f">#0000039f</color>
+ <color name="i_am_color_3a0">#000003a0</color>
+ <color name="i_am_color_3a1">#000003a1</color>
+ <color name="i_am_color_3a2">#000003a2</color>
+ <color name="i_am_color_3a3">#000003a3</color>
+ <color name="i_am_color_3a4">#000003a4</color>
+ <color name="i_am_color_3a5">#000003a5</color>
+ <color name="i_am_color_3a6">#000003a6</color>
+ <color name="i_am_color_3a7">#000003a7</color>
+ <color name="i_am_color_3a8">#000003a8</color>
+ <color name="i_am_color_3a9">#000003a9</color>
+ <color name="i_am_color_3aa">#000003aa</color>
+ <color name="i_am_color_3ab">#000003ab</color>
+ <color name="i_am_color_3ac">#000003ac</color>
+ <color name="i_am_color_3ad">#000003ad</color>
+ <color name="i_am_color_3ae">#000003ae</color>
+ <color name="i_am_color_3af">#000003af</color>
+ <color name="i_am_color_3b0">#000003b0</color>
+ <color name="i_am_color_3b1">#000003b1</color>
+ <color name="i_am_color_3b2">#000003b2</color>
+ <color name="i_am_color_3b3">#000003b3</color>
+ <color name="i_am_color_3b4">#000003b4</color>
+ <color name="i_am_color_3b5">#000003b5</color>
+ <color name="i_am_color_3b6">#000003b6</color>
+ <color name="i_am_color_3b7">#000003b7</color>
+ <color name="i_am_color_3b8">#000003b8</color>
+ <color name="i_am_color_3b9">#000003b9</color>
+ <color name="i_am_color_3ba">#000003ba</color>
+ <color name="i_am_color_3bb">#000003bb</color>
+ <color name="i_am_color_3bc">#000003bc</color>
+ <color name="i_am_color_3bd">#000003bd</color>
+ <color name="i_am_color_3be">#000003be</color>
+ <color name="i_am_color_3bf">#000003bf</color>
+ <color name="i_am_color_3c0">#000003c0</color>
+ <color name="i_am_color_3c1">#000003c1</color>
+ <color name="i_am_color_3c2">#000003c2</color>
+ <color name="i_am_color_3c3">#000003c3</color>
+ <color name="i_am_color_3c4">#000003c4</color>
+ <color name="i_am_color_3c5">#000003c5</color>
+ <color name="i_am_color_3c6">#000003c6</color>
+ <color name="i_am_color_3c7">#000003c7</color>
+ <color name="i_am_color_3c8">#000003c8</color>
+ <color name="i_am_color_3c9">#000003c9</color>
+ <color name="i_am_color_3ca">#000003ca</color>
+ <color name="i_am_color_3cb">#000003cb</color>
+ <color name="i_am_color_3cc">#000003cc</color>
+ <color name="i_am_color_3cd">#000003cd</color>
+ <color name="i_am_color_3ce">#000003ce</color>
+ <color name="i_am_color_3cf">#000003cf</color>
+ <color name="i_am_color_3d0">#000003d0</color>
+ <color name="i_am_color_3d1">#000003d1</color>
+ <color name="i_am_color_3d2">#000003d2</color>
+ <color name="i_am_color_3d3">#000003d3</color>
+ <color name="i_am_color_3d4">#000003d4</color>
+ <color name="i_am_color_3d5">#000003d5</color>
+ <color name="i_am_color_3d6">#000003d6</color>
+ <color name="i_am_color_3d7">#000003d7</color>
+ <color name="i_am_color_3d8">#000003d8</color>
+ <color name="i_am_color_3d9">#000003d9</color>
+ <color name="i_am_color_3da">#000003da</color>
+ <color name="i_am_color_3db">#000003db</color>
+ <color name="i_am_color_3dc">#000003dc</color>
+ <color name="i_am_color_3dd">#000003dd</color>
+ <color name="i_am_color_3de">#000003de</color>
+ <color name="i_am_color_3df">#000003df</color>
+ <color name="i_am_color_3e0">#000003e0</color>
+ <color name="i_am_color_3e1">#000003e1</color>
+ <color name="i_am_color_3e2">#000003e2</color>
+ <color name="i_am_color_3e3">#000003e3</color>
+ <color name="i_am_color_3e4">#000003e4</color>
+ <color name="i_am_color_3e5">#000003e5</color>
+ <color name="i_am_color_3e6">#000003e6</color>
+ <color name="i_am_color_3e7">#000003e7</color>
+ <color name="i_am_color_3e8">#000003e8</color>
+ <color name="i_am_color_3e9">#000003e9</color>
+ <color name="i_am_color_3ea">#000003ea</color>
+ <color name="i_am_color_3eb">#000003eb</color>
+ <color name="i_am_color_3ec">#000003ec</color>
+ <color name="i_am_color_3ed">#000003ed</color>
+ <color name="i_am_color_3ee">#000003ee</color>
+ <color name="i_am_color_3ef">#000003ef</color>
+ <color name="i_am_color_3f0">#000003f0</color>
+ <color name="i_am_color_3f1">#000003f1</color>
+ <color name="i_am_color_3f2">#000003f2</color>
+ <color name="i_am_color_3f3">#000003f3</color>
+ <color name="i_am_color_3f4">#000003f4</color>
+ <color name="i_am_color_3f5">#000003f5</color>
+ <color name="i_am_color_3f6">#000003f6</color>
+ <color name="i_am_color_3f7">#000003f7</color>
+ <color name="i_am_color_3f8">#000003f8</color>
+ <color name="i_am_color_3f9">#000003f9</color>
+ <color name="i_am_color_3fa">#000003fa</color>
+ <color name="i_am_color_3fb">#000003fb</color>
+ <color name="i_am_color_3fc">#000003fc</color>
+ <color name="i_am_color_3fd">#000003fd</color>
+ <color name="i_am_color_3fe">#000003fe</color>
+ <color name="i_am_color_3ff">#000003ff</color>
+ <color name="i_am_color_400">#00000400</color>
+ <color name="i_am_color_401">#00000401</color>
+ <color name="i_am_color_402">#00000402</color>
+ <color name="i_am_color_403">#00000403</color>
+ <color name="i_am_color_404">#00000404</color>
+ <color name="i_am_color_405">#00000405</color>
+ <color name="i_am_color_406">#00000406</color>
+ <color name="i_am_color_407">#00000407</color>
+ <color name="i_am_color_408">#00000408</color>
+ <color name="i_am_color_409">#00000409</color>
+ <color name="i_am_color_40a">#0000040a</color>
+ <color name="i_am_color_40b">#0000040b</color>
+ <color name="i_am_color_40c">#0000040c</color>
+ <color name="i_am_color_40d">#0000040d</color>
+ <color name="i_am_color_40e">#0000040e</color>
+ <color name="i_am_color_40f">#0000040f</color>
+ <color name="i_am_color_410">#00000410</color>
+ <color name="i_am_color_411">#00000411</color>
+ <color name="i_am_color_412">#00000412</color>
+ <color name="i_am_color_413">#00000413</color>
+ <color name="i_am_color_414">#00000414</color>
+ <color name="i_am_color_415">#00000415</color>
+ <color name="i_am_color_416">#00000416</color>
+ <color name="i_am_color_417">#00000417</color>
+ <color name="i_am_color_418">#00000418</color>
+ <color name="i_am_color_419">#00000419</color>
+ <color name="i_am_color_41a">#0000041a</color>
+ <color name="i_am_color_41b">#0000041b</color>
+ <color name="i_am_color_41c">#0000041c</color>
+ <color name="i_am_color_41d">#0000041d</color>
+ <color name="i_am_color_41e">#0000041e</color>
+ <color name="i_am_color_41f">#0000041f</color>
+ <color name="i_am_color_420">#00000420</color>
+ <color name="i_am_color_421">#00000421</color>
+ <color name="i_am_color_422">#00000422</color>
+ <color name="i_am_color_423">#00000423</color>
+ <color name="i_am_color_424">#00000424</color>
+ <color name="i_am_color_425">#00000425</color>
+ <color name="i_am_color_426">#00000426</color>
+ <color name="i_am_color_427">#00000427</color>
+ <color name="i_am_color_428">#00000428</color>
+ <color name="i_am_color_429">#00000429</color>
+ <color name="i_am_color_42a">#0000042a</color>
+ <color name="i_am_color_42b">#0000042b</color>
+ <color name="i_am_color_42c">#0000042c</color>
+ <color name="i_am_color_42d">#0000042d</color>
+ <color name="i_am_color_42e">#0000042e</color>
+ <color name="i_am_color_42f">#0000042f</color>
+ <color name="i_am_color_430">#00000430</color>
+ <color name="i_am_color_431">#00000431</color>
+ <color name="i_am_color_432">#00000432</color>
+ <color name="i_am_color_433">#00000433</color>
+ <color name="i_am_color_434">#00000434</color>
+ <color name="i_am_color_435">#00000435</color>
+ <color name="i_am_color_436">#00000436</color>
+ <color name="i_am_color_437">#00000437</color>
+ <color name="i_am_color_438">#00000438</color>
+ <color name="i_am_color_439">#00000439</color>
+ <color name="i_am_color_43a">#0000043a</color>
+ <color name="i_am_color_43b">#0000043b</color>
+ <color name="i_am_color_43c">#0000043c</color>
+ <color name="i_am_color_43d">#0000043d</color>
+ <color name="i_am_color_43e">#0000043e</color>
+ <color name="i_am_color_43f">#0000043f</color>
+ <color name="i_am_color_440">#00000440</color>
+ <color name="i_am_color_441">#00000441</color>
+ <color name="i_am_color_442">#00000442</color>
+ <color name="i_am_color_443">#00000443</color>
+ <color name="i_am_color_444">#00000444</color>
+ <color name="i_am_color_445">#00000445</color>
+ <color name="i_am_color_446">#00000446</color>
+ <color name="i_am_color_447">#00000447</color>
+ <color name="i_am_color_448">#00000448</color>
+ <color name="i_am_color_449">#00000449</color>
+ <color name="i_am_color_44a">#0000044a</color>
+ <color name="i_am_color_44b">#0000044b</color>
+ <color name="i_am_color_44c">#0000044c</color>
+ <color name="i_am_color_44d">#0000044d</color>
+ <color name="i_am_color_44e">#0000044e</color>
+ <color name="i_am_color_44f">#0000044f</color>
+ <color name="i_am_color_450">#00000450</color>
+ <color name="i_am_color_451">#00000451</color>
+ <color name="i_am_color_452">#00000452</color>
+ <color name="i_am_color_453">#00000453</color>
+ <color name="i_am_color_454">#00000454</color>
+ <color name="i_am_color_455">#00000455</color>
+ <color name="i_am_color_456">#00000456</color>
+ <color name="i_am_color_457">#00000457</color>
+ <color name="i_am_color_458">#00000458</color>
+ <color name="i_am_color_459">#00000459</color>
+ <color name="i_am_color_45a">#0000045a</color>
+ <color name="i_am_color_45b">#0000045b</color>
+ <color name="i_am_color_45c">#0000045c</color>
+ <color name="i_am_color_45d">#0000045d</color>
+ <color name="i_am_color_45e">#0000045e</color>
+ <color name="i_am_color_45f">#0000045f</color>
+ <color name="i_am_color_460">#00000460</color>
+ <color name="i_am_color_461">#00000461</color>
+ <color name="i_am_color_462">#00000462</color>
+ <color name="i_am_color_463">#00000463</color>
+ <color name="i_am_color_464">#00000464</color>
+ <color name="i_am_color_465">#00000465</color>
+ <color name="i_am_color_466">#00000466</color>
+ <color name="i_am_color_467">#00000467</color>
+ <color name="i_am_color_468">#00000468</color>
+ <color name="i_am_color_469">#00000469</color>
+ <color name="i_am_color_46a">#0000046a</color>
+ <color name="i_am_color_46b">#0000046b</color>
+ <color name="i_am_color_46c">#0000046c</color>
+ <color name="i_am_color_46d">#0000046d</color>
+ <color name="i_am_color_46e">#0000046e</color>
+ <color name="i_am_color_46f">#0000046f</color>
+ <color name="i_am_color_470">#00000470</color>
+ <color name="i_am_color_471">#00000471</color>
+ <color name="i_am_color_472">#00000472</color>
+ <color name="i_am_color_473">#00000473</color>
+ <color name="i_am_color_474">#00000474</color>
+ <color name="i_am_color_475">#00000475</color>
+ <color name="i_am_color_476">#00000476</color>
+ <color name="i_am_color_477">#00000477</color>
+ <color name="i_am_color_478">#00000478</color>
+ <color name="i_am_color_479">#00000479</color>
+ <color name="i_am_color_47a">#0000047a</color>
+ <color name="i_am_color_47b">#0000047b</color>
+ <color name="i_am_color_47c">#0000047c</color>
+ <color name="i_am_color_47d">#0000047d</color>
+ <color name="i_am_color_47e">#0000047e</color>
+ <color name="i_am_color_47f">#0000047f</color>
+ <color name="i_am_color_480">#00000480</color>
+ <color name="i_am_color_481">#00000481</color>
+ <color name="i_am_color_482">#00000482</color>
+ <color name="i_am_color_483">#00000483</color>
+ <color name="i_am_color_484">#00000484</color>
+ <color name="i_am_color_485">#00000485</color>
+ <color name="i_am_color_486">#00000486</color>
+ <color name="i_am_color_487">#00000487</color>
+ <color name="i_am_color_488">#00000488</color>
+ <color name="i_am_color_489">#00000489</color>
+ <color name="i_am_color_48a">#0000048a</color>
+ <color name="i_am_color_48b">#0000048b</color>
+ <color name="i_am_color_48c">#0000048c</color>
+ <color name="i_am_color_48d">#0000048d</color>
+ <color name="i_am_color_48e">#0000048e</color>
+ <color name="i_am_color_48f">#0000048f</color>
+ <color name="i_am_color_490">#00000490</color>
+ <color name="i_am_color_491">#00000491</color>
+ <color name="i_am_color_492">#00000492</color>
+ <color name="i_am_color_493">#00000493</color>
+ <color name="i_am_color_494">#00000494</color>
+ <color name="i_am_color_495">#00000495</color>
+ <color name="i_am_color_496">#00000496</color>
+ <color name="i_am_color_497">#00000497</color>
+ <color name="i_am_color_498">#00000498</color>
+ <color name="i_am_color_499">#00000499</color>
+ <color name="i_am_color_49a">#0000049a</color>
+ <color name="i_am_color_49b">#0000049b</color>
+ <color name="i_am_color_49c">#0000049c</color>
+ <color name="i_am_color_49d">#0000049d</color>
+ <color name="i_am_color_49e">#0000049e</color>
+ <color name="i_am_color_49f">#0000049f</color>
+ <color name="i_am_color_4a0">#000004a0</color>
+ <color name="i_am_color_4a1">#000004a1</color>
+ <color name="i_am_color_4a2">#000004a2</color>
+ <color name="i_am_color_4a3">#000004a3</color>
+ <color name="i_am_color_4a4">#000004a4</color>
+ <color name="i_am_color_4a5">#000004a5</color>
+ <color name="i_am_color_4a6">#000004a6</color>
+ <color name="i_am_color_4a7">#000004a7</color>
+ <color name="i_am_color_4a8">#000004a8</color>
+ <color name="i_am_color_4a9">#000004a9</color>
+ <color name="i_am_color_4aa">#000004aa</color>
+ <color name="i_am_color_4ab">#000004ab</color>
+ <color name="i_am_color_4ac">#000004ac</color>
+ <color name="i_am_color_4ad">#000004ad</color>
+ <color name="i_am_color_4ae">#000004ae</color>
+ <color name="i_am_color_4af">#000004af</color>
+ <color name="i_am_color_4b0">#000004b0</color>
+ <color name="i_am_color_4b1">#000004b1</color>
+ <color name="i_am_color_4b2">#000004b2</color>
+ <color name="i_am_color_4b3">#000004b3</color>
+ <color name="i_am_color_4b4">#000004b4</color>
+ <color name="i_am_color_4b5">#000004b5</color>
+ <color name="i_am_color_4b6">#000004b6</color>
+ <color name="i_am_color_4b7">#000004b7</color>
+ <color name="i_am_color_4b8">#000004b8</color>
+ <color name="i_am_color_4b9">#000004b9</color>
+ <color name="i_am_color_4ba">#000004ba</color>
+ <color name="i_am_color_4bb">#000004bb</color>
+ <color name="i_am_color_4bc">#000004bc</color>
+ <color name="i_am_color_4bd">#000004bd</color>
+ <color name="i_am_color_4be">#000004be</color>
+ <color name="i_am_color_4bf">#000004bf</color>
+ <color name="i_am_color_4c0">#000004c0</color>
+ <color name="i_am_color_4c1">#000004c1</color>
+ <color name="i_am_color_4c2">#000004c2</color>
+ <color name="i_am_color_4c3">#000004c3</color>
+ <color name="i_am_color_4c4">#000004c4</color>
+ <color name="i_am_color_4c5">#000004c5</color>
+ <color name="i_am_color_4c6">#000004c6</color>
+ <color name="i_am_color_4c7">#000004c7</color>
+ <color name="i_am_color_4c8">#000004c8</color>
+ <color name="i_am_color_4c9">#000004c9</color>
+ <color name="i_am_color_4ca">#000004ca</color>
+ <color name="i_am_color_4cb">#000004cb</color>
+ <color name="i_am_color_4cc">#000004cc</color>
+ <color name="i_am_color_4cd">#000004cd</color>
+ <color name="i_am_color_4ce">#000004ce</color>
+ <color name="i_am_color_4cf">#000004cf</color>
+ <color name="i_am_color_4d0">#000004d0</color>
+ <color name="i_am_color_4d1">#000004d1</color>
+ <color name="i_am_color_4d2">#000004d2</color>
+ <color name="i_am_color_4d3">#000004d3</color>
+ <color name="i_am_color_4d4">#000004d4</color>
+ <color name="i_am_color_4d5">#000004d5</color>
+ <color name="i_am_color_4d6">#000004d6</color>
+ <color name="i_am_color_4d7">#000004d7</color>
+ <color name="i_am_color_4d8">#000004d8</color>
+ <color name="i_am_color_4d9">#000004d9</color>
+ <color name="i_am_color_4da">#000004da</color>
+ <color name="i_am_color_4db">#000004db</color>
+ <color name="i_am_color_4dc">#000004dc</color>
+ <color name="i_am_color_4dd">#000004dd</color>
+ <color name="i_am_color_4de">#000004de</color>
+ <color name="i_am_color_4df">#000004df</color>
+ <color name="i_am_color_4e0">#000004e0</color>
+ <color name="i_am_color_4e1">#000004e1</color>
+ <color name="i_am_color_4e2">#000004e2</color>
+ <color name="i_am_color_4e3">#000004e3</color>
+ <color name="i_am_color_4e4">#000004e4</color>
+ <color name="i_am_color_4e5">#000004e5</color>
+ <color name="i_am_color_4e6">#000004e6</color>
+ <color name="i_am_color_4e7">#000004e7</color>
+ <color name="i_am_color_4e8">#000004e8</color>
+ <color name="i_am_color_4e9">#000004e9</color>
+ <color name="i_am_color_4ea">#000004ea</color>
+ <color name="i_am_color_4eb">#000004eb</color>
+ <color name="i_am_color_4ec">#000004ec</color>
+ <color name="i_am_color_4ed">#000004ed</color>
+ <color name="i_am_color_4ee">#000004ee</color>
+ <color name="i_am_color_4ef">#000004ef</color>
+ <color name="i_am_color_4f0">#000004f0</color>
+ <color name="i_am_color_4f1">#000004f1</color>
+ <color name="i_am_color_4f2">#000004f2</color>
+ <color name="i_am_color_4f3">#000004f3</color>
+ <color name="i_am_color_4f4">#000004f4</color>
+ <color name="i_am_color_4f5">#000004f5</color>
+ <color name="i_am_color_4f6">#000004f6</color>
+ <color name="i_am_color_4f7">#000004f7</color>
+ <color name="i_am_color_4f8">#000004f8</color>
+ <color name="i_am_color_4f9">#000004f9</color>
+ <color name="i_am_color_4fa">#000004fa</color>
+ <color name="i_am_color_4fb">#000004fb</color>
+ <color name="i_am_color_4fc">#000004fc</color>
+ <color name="i_am_color_4fd">#000004fd</color>
+ <color name="i_am_color_4fe">#000004fe</color>
+ <color name="i_am_color_4ff">#000004ff</color>
+ <color name="i_am_color_500">#00000500</color>
+ <color name="i_am_color_501">#00000501</color>
+ <color name="i_am_color_502">#00000502</color>
+ <color name="i_am_color_503">#00000503</color>
+ <color name="i_am_color_504">#00000504</color>
+ <color name="i_am_color_505">#00000505</color>
+ <color name="i_am_color_506">#00000506</color>
+ <color name="i_am_color_507">#00000507</color>
+ <color name="i_am_color_508">#00000508</color>
+ <color name="i_am_color_509">#00000509</color>
+ <color name="i_am_color_50a">#0000050a</color>
+ <color name="i_am_color_50b">#0000050b</color>
+ <color name="i_am_color_50c">#0000050c</color>
+ <color name="i_am_color_50d">#0000050d</color>
+ <color name="i_am_color_50e">#0000050e</color>
+ <color name="i_am_color_50f">#0000050f</color>
+ <color name="i_am_color_510">#00000510</color>
+ <color name="i_am_color_511">#00000511</color>
+ <color name="i_am_color_512">#00000512</color>
+ <color name="i_am_color_513">#00000513</color>
+ <color name="i_am_color_514">#00000514</color>
+ <color name="i_am_color_515">#00000515</color>
+ <color name="i_am_color_516">#00000516</color>
+ <color name="i_am_color_517">#00000517</color>
+ <color name="i_am_color_518">#00000518</color>
+ <color name="i_am_color_519">#00000519</color>
+ <color name="i_am_color_51a">#0000051a</color>
+ <color name="i_am_color_51b">#0000051b</color>
+ <color name="i_am_color_51c">#0000051c</color>
+ <color name="i_am_color_51d">#0000051d</color>
+ <color name="i_am_color_51e">#0000051e</color>
+ <color name="i_am_color_51f">#0000051f</color>
+ <color name="i_am_color_520">#00000520</color>
+ <color name="i_am_color_521">#00000521</color>
+ <color name="i_am_color_522">#00000522</color>
+ <color name="i_am_color_523">#00000523</color>
+ <color name="i_am_color_524">#00000524</color>
+ <color name="i_am_color_525">#00000525</color>
+ <color name="i_am_color_526">#00000526</color>
+ <color name="i_am_color_527">#00000527</color>
+ <color name="i_am_color_528">#00000528</color>
+ <color name="i_am_color_529">#00000529</color>
+ <color name="i_am_color_52a">#0000052a</color>
+ <color name="i_am_color_52b">#0000052b</color>
+ <color name="i_am_color_52c">#0000052c</color>
+ <color name="i_am_color_52d">#0000052d</color>
+ <color name="i_am_color_52e">#0000052e</color>
+ <color name="i_am_color_52f">#0000052f</color>
+ <color name="i_am_color_530">#00000530</color>
+ <color name="i_am_color_531">#00000531</color>
+ <color name="i_am_color_532">#00000532</color>
+ <color name="i_am_color_533">#00000533</color>
+ <color name="i_am_color_534">#00000534</color>
+ <color name="i_am_color_535">#00000535</color>
+ <color name="i_am_color_536">#00000536</color>
+ <color name="i_am_color_537">#00000537</color>
+ <color name="i_am_color_538">#00000538</color>
+ <color name="i_am_color_539">#00000539</color>
+ <color name="i_am_color_53a">#0000053a</color>
+ <color name="i_am_color_53b">#0000053b</color>
+ <color name="i_am_color_53c">#0000053c</color>
+ <color name="i_am_color_53d">#0000053d</color>
+ <color name="i_am_color_53e">#0000053e</color>
+ <color name="i_am_color_53f">#0000053f</color>
+ <color name="i_am_color_540">#00000540</color>
+ <color name="i_am_color_541">#00000541</color>
+ <color name="i_am_color_542">#00000542</color>
+ <color name="i_am_color_543">#00000543</color>
+ <color name="i_am_color_544">#00000544</color>
+ <color name="i_am_color_545">#00000545</color>
+ <color name="i_am_color_546">#00000546</color>
+ <color name="i_am_color_547">#00000547</color>
+ <color name="i_am_color_548">#00000548</color>
+ <color name="i_am_color_549">#00000549</color>
+ <color name="i_am_color_54a">#0000054a</color>
+ <color name="i_am_color_54b">#0000054b</color>
+ <color name="i_am_color_54c">#0000054c</color>
+ <color name="i_am_color_54d">#0000054d</color>
+ <color name="i_am_color_54e">#0000054e</color>
+ <color name="i_am_color_54f">#0000054f</color>
+ <color name="i_am_color_550">#00000550</color>
+ <color name="i_am_color_551">#00000551</color>
+ <color name="i_am_color_552">#00000552</color>
+ <color name="i_am_color_553">#00000553</color>
+ <color name="i_am_color_554">#00000554</color>
+ <color name="i_am_color_555">#00000555</color>
+ <color name="i_am_color_556">#00000556</color>
+ <color name="i_am_color_557">#00000557</color>
+ <color name="i_am_color_558">#00000558</color>
+ <color name="i_am_color_559">#00000559</color>
+ <color name="i_am_color_55a">#0000055a</color>
+ <color name="i_am_color_55b">#0000055b</color>
+ <color name="i_am_color_55c">#0000055c</color>
+ <color name="i_am_color_55d">#0000055d</color>
+ <color name="i_am_color_55e">#0000055e</color>
+ <color name="i_am_color_55f">#0000055f</color>
+ <color name="i_am_color_560">#00000560</color>
+ <color name="i_am_color_561">#00000561</color>
+ <color name="i_am_color_562">#00000562</color>
+ <color name="i_am_color_563">#00000563</color>
+ <color name="i_am_color_564">#00000564</color>
+ <color name="i_am_color_565">#00000565</color>
+ <color name="i_am_color_566">#00000566</color>
+ <color name="i_am_color_567">#00000567</color>
+ <color name="i_am_color_568">#00000568</color>
+ <color name="i_am_color_569">#00000569</color>
+ <color name="i_am_color_56a">#0000056a</color>
+ <color name="i_am_color_56b">#0000056b</color>
+ <color name="i_am_color_56c">#0000056c</color>
+ <color name="i_am_color_56d">#0000056d</color>
+ <color name="i_am_color_56e">#0000056e</color>
+ <color name="i_am_color_56f">#0000056f</color>
+ <color name="i_am_color_570">#00000570</color>
+ <color name="i_am_color_571">#00000571</color>
+ <color name="i_am_color_572">#00000572</color>
+ <color name="i_am_color_573">#00000573</color>
+ <color name="i_am_color_574">#00000574</color>
+ <color name="i_am_color_575">#00000575</color>
+ <color name="i_am_color_576">#00000576</color>
+ <color name="i_am_color_577">#00000577</color>
+ <color name="i_am_color_578">#00000578</color>
+ <color name="i_am_color_579">#00000579</color>
+ <color name="i_am_color_57a">#0000057a</color>
+ <color name="i_am_color_57b">#0000057b</color>
+ <color name="i_am_color_57c">#0000057c</color>
+ <color name="i_am_color_57d">#0000057d</color>
+ <color name="i_am_color_57e">#0000057e</color>
+ <color name="i_am_color_57f">#0000057f</color>
+ <color name="i_am_color_580">#00000580</color>
+ <color name="i_am_color_581">#00000581</color>
+ <color name="i_am_color_582">#00000582</color>
+ <color name="i_am_color_583">#00000583</color>
+ <color name="i_am_color_584">#00000584</color>
+ <color name="i_am_color_585">#00000585</color>
+ <color name="i_am_color_586">#00000586</color>
+ <color name="i_am_color_587">#00000587</color>
+ <color name="i_am_color_588">#00000588</color>
+ <color name="i_am_color_589">#00000589</color>
+ <color name="i_am_color_58a">#0000058a</color>
+ <color name="i_am_color_58b">#0000058b</color>
+ <color name="i_am_color_58c">#0000058c</color>
+ <color name="i_am_color_58d">#0000058d</color>
+ <color name="i_am_color_58e">#0000058e</color>
+ <color name="i_am_color_58f">#0000058f</color>
+ <color name="i_am_color_590">#00000590</color>
+ <color name="i_am_color_591">#00000591</color>
+ <color name="i_am_color_592">#00000592</color>
+ <color name="i_am_color_593">#00000593</color>
+ <color name="i_am_color_594">#00000594</color>
+ <color name="i_am_color_595">#00000595</color>
+ <color name="i_am_color_596">#00000596</color>
+ <color name="i_am_color_597">#00000597</color>
+ <color name="i_am_color_598">#00000598</color>
+ <color name="i_am_color_599">#00000599</color>
+ <color name="i_am_color_59a">#0000059a</color>
+ <color name="i_am_color_59b">#0000059b</color>
+ <color name="i_am_color_59c">#0000059c</color>
+ <color name="i_am_color_59d">#0000059d</color>
+ <color name="i_am_color_59e">#0000059e</color>
+ <color name="i_am_color_59f">#0000059f</color>
+ <color name="i_am_color_5a0">#000005a0</color>
+ <color name="i_am_color_5a1">#000005a1</color>
+ <color name="i_am_color_5a2">#000005a2</color>
+ <color name="i_am_color_5a3">#000005a3</color>
+ <color name="i_am_color_5a4">#000005a4</color>
+ <color name="i_am_color_5a5">#000005a5</color>
+ <color name="i_am_color_5a6">#000005a6</color>
+ <color name="i_am_color_5a7">#000005a7</color>
+ <color name="i_am_color_5a8">#000005a8</color>
+ <color name="i_am_color_5a9">#000005a9</color>
+ <color name="i_am_color_5aa">#000005aa</color>
+ <color name="i_am_color_5ab">#000005ab</color>
+ <color name="i_am_color_5ac">#000005ac</color>
+ <color name="i_am_color_5ad">#000005ad</color>
+ <color name="i_am_color_5ae">#000005ae</color>
+ <color name="i_am_color_5af">#000005af</color>
+ <color name="i_am_color_5b0">#000005b0</color>
+ <color name="i_am_color_5b1">#000005b1</color>
+ <color name="i_am_color_5b2">#000005b2</color>
+ <color name="i_am_color_5b3">#000005b3</color>
+ <color name="i_am_color_5b4">#000005b4</color>
+ <color name="i_am_color_5b5">#000005b5</color>
+ <color name="i_am_color_5b6">#000005b6</color>
+ <color name="i_am_color_5b7">#000005b7</color>
+ <color name="i_am_color_5b8">#000005b8</color>
+ <color name="i_am_color_5b9">#000005b9</color>
+ <color name="i_am_color_5ba">#000005ba</color>
+ <color name="i_am_color_5bb">#000005bb</color>
+ <color name="i_am_color_5bc">#000005bc</color>
+ <color name="i_am_color_5bd">#000005bd</color>
+ <color name="i_am_color_5be">#000005be</color>
+ <color name="i_am_color_5bf">#000005bf</color>
+ <color name="i_am_color_5c0">#000005c0</color>
+ <color name="i_am_color_5c1">#000005c1</color>
+ <color name="i_am_color_5c2">#000005c2</color>
+ <color name="i_am_color_5c3">#000005c3</color>
+ <color name="i_am_color_5c4">#000005c4</color>
+ <color name="i_am_color_5c5">#000005c5</color>
+ <color name="i_am_color_5c6">#000005c6</color>
+ <color name="i_am_color_5c7">#000005c7</color>
+ <color name="i_am_color_5c8">#000005c8</color>
+ <color name="i_am_color_5c9">#000005c9</color>
+ <color name="i_am_color_5ca">#000005ca</color>
+ <color name="i_am_color_5cb">#000005cb</color>
+ <color name="i_am_color_5cc">#000005cc</color>
+ <color name="i_am_color_5cd">#000005cd</color>
+ <color name="i_am_color_5ce">#000005ce</color>
+ <color name="i_am_color_5cf">#000005cf</color>
+ <color name="i_am_color_5d0">#000005d0</color>
+ <color name="i_am_color_5d1">#000005d1</color>
+ <color name="i_am_color_5d2">#000005d2</color>
+ <color name="i_am_color_5d3">#000005d3</color>
+ <color name="i_am_color_5d4">#000005d4</color>
+ <color name="i_am_color_5d5">#000005d5</color>
+ <color name="i_am_color_5d6">#000005d6</color>
+ <color name="i_am_color_5d7">#000005d7</color>
+ <color name="i_am_color_5d8">#000005d8</color>
+ <color name="i_am_color_5d9">#000005d9</color>
+ <color name="i_am_color_5da">#000005da</color>
+ <color name="i_am_color_5db">#000005db</color>
+ <color name="i_am_color_5dc">#000005dc</color>
+ <color name="i_am_color_5dd">#000005dd</color>
+ <color name="i_am_color_5de">#000005de</color>
+ <color name="i_am_color_5df">#000005df</color>
+ <color name="i_am_color_5e0">#000005e0</color>
+ <color name="i_am_color_5e1">#000005e1</color>
+ <color name="i_am_color_5e2">#000005e2</color>
+ <color name="i_am_color_5e3">#000005e3</color>
+ <color name="i_am_color_5e4">#000005e4</color>
+ <color name="i_am_color_5e5">#000005e5</color>
+ <color name="i_am_color_5e6">#000005e6</color>
+ <color name="i_am_color_5e7">#000005e7</color>
+ <color name="i_am_color_5e8">#000005e8</color>
+ <color name="i_am_color_5e9">#000005e9</color>
+ <color name="i_am_color_5ea">#000005ea</color>
+ <color name="i_am_color_5eb">#000005eb</color>
+ <color name="i_am_color_5ec">#000005ec</color>
+ <color name="i_am_color_5ed">#000005ed</color>
+ <color name="i_am_color_5ee">#000005ee</color>
+ <color name="i_am_color_5ef">#000005ef</color>
+ <color name="i_am_color_5f0">#000005f0</color>
+ <color name="i_am_color_5f1">#000005f1</color>
+ <color name="i_am_color_5f2">#000005f2</color>
+ <color name="i_am_color_5f3">#000005f3</color>
+ <color name="i_am_color_5f4">#000005f4</color>
+ <color name="i_am_color_5f5">#000005f5</color>
+ <color name="i_am_color_5f6">#000005f6</color>
+ <color name="i_am_color_5f7">#000005f7</color>
+ <color name="i_am_color_5f8">#000005f8</color>
+ <color name="i_am_color_5f9">#000005f9</color>
+ <color name="i_am_color_5fa">#000005fa</color>
+ <color name="i_am_color_5fb">#000005fb</color>
+ <color name="i_am_color_5fc">#000005fc</color>
+ <color name="i_am_color_5fd">#000005fd</color>
+ <color name="i_am_color_5fe">#000005fe</color>
+ <color name="i_am_color_5ff">#000005ff</color>
+ <color name="i_am_color_600">#00000600</color>
+ <color name="i_am_color_601">#00000601</color>
+ <color name="i_am_color_602">#00000602</color>
+ <color name="i_am_color_603">#00000603</color>
+ <color name="i_am_color_604">#00000604</color>
+ <color name="i_am_color_605">#00000605</color>
+ <color name="i_am_color_606">#00000606</color>
+ <color name="i_am_color_607">#00000607</color>
+ <color name="i_am_color_608">#00000608</color>
+ <color name="i_am_color_609">#00000609</color>
+ <color name="i_am_color_60a">#0000060a</color>
+ <color name="i_am_color_60b">#0000060b</color>
+ <color name="i_am_color_60c">#0000060c</color>
+ <color name="i_am_color_60d">#0000060d</color>
+ <color name="i_am_color_60e">#0000060e</color>
+ <color name="i_am_color_60f">#0000060f</color>
+ <color name="i_am_color_610">#00000610</color>
+ <color name="i_am_color_611">#00000611</color>
+ <color name="i_am_color_612">#00000612</color>
+ <color name="i_am_color_613">#00000613</color>
+ <color name="i_am_color_614">#00000614</color>
+ <color name="i_am_color_615">#00000615</color>
+ <color name="i_am_color_616">#00000616</color>
+ <color name="i_am_color_617">#00000617</color>
+ <color name="i_am_color_618">#00000618</color>
+ <color name="i_am_color_619">#00000619</color>
+ <color name="i_am_color_61a">#0000061a</color>
+ <color name="i_am_color_61b">#0000061b</color>
+ <color name="i_am_color_61c">#0000061c</color>
+ <color name="i_am_color_61d">#0000061d</color>
+ <color name="i_am_color_61e">#0000061e</color>
+ <color name="i_am_color_61f">#0000061f</color>
+ <color name="i_am_color_620">#00000620</color>
+ <color name="i_am_color_621">#00000621</color>
+ <color name="i_am_color_622">#00000622</color>
+ <color name="i_am_color_623">#00000623</color>
+ <color name="i_am_color_624">#00000624</color>
+ <color name="i_am_color_625">#00000625</color>
+ <color name="i_am_color_626">#00000626</color>
+ <color name="i_am_color_627">#00000627</color>
+ <color name="i_am_color_628">#00000628</color>
+ <color name="i_am_color_629">#00000629</color>
+ <color name="i_am_color_62a">#0000062a</color>
+ <color name="i_am_color_62b">#0000062b</color>
+ <color name="i_am_color_62c">#0000062c</color>
+ <color name="i_am_color_62d">#0000062d</color>
+ <color name="i_am_color_62e">#0000062e</color>
+ <color name="i_am_color_62f">#0000062f</color>
+ <color name="i_am_color_630">#00000630</color>
+ <color name="i_am_color_631">#00000631</color>
+ <color name="i_am_color_632">#00000632</color>
+ <color name="i_am_color_633">#00000633</color>
+ <color name="i_am_color_634">#00000634</color>
+ <color name="i_am_color_635">#00000635</color>
+ <color name="i_am_color_636">#00000636</color>
+ <color name="i_am_color_637">#00000637</color>
+ <color name="i_am_color_638">#00000638</color>
+ <color name="i_am_color_639">#00000639</color>
+ <color name="i_am_color_63a">#0000063a</color>
+ <color name="i_am_color_63b">#0000063b</color>
+ <color name="i_am_color_63c">#0000063c</color>
+ <color name="i_am_color_63d">#0000063d</color>
+ <color name="i_am_color_63e">#0000063e</color>
+ <color name="i_am_color_63f">#0000063f</color>
+ <color name="i_am_color_640">#00000640</color>
+ <color name="i_am_color_641">#00000641</color>
+ <color name="i_am_color_642">#00000642</color>
+ <color name="i_am_color_643">#00000643</color>
+ <color name="i_am_color_644">#00000644</color>
+ <color name="i_am_color_645">#00000645</color>
+ <color name="i_am_color_646">#00000646</color>
+ <color name="i_am_color_647">#00000647</color>
+ <color name="i_am_color_648">#00000648</color>
+ <color name="i_am_color_649">#00000649</color>
+ <color name="i_am_color_64a">#0000064a</color>
+ <color name="i_am_color_64b">#0000064b</color>
+ <color name="i_am_color_64c">#0000064c</color>
+ <color name="i_am_color_64d">#0000064d</color>
+ <color name="i_am_color_64e">#0000064e</color>
+ <color name="i_am_color_64f">#0000064f</color>
+ <color name="i_am_color_650">#00000650</color>
+ <color name="i_am_color_651">#00000651</color>
+ <color name="i_am_color_652">#00000652</color>
+ <color name="i_am_color_653">#00000653</color>
+ <color name="i_am_color_654">#00000654</color>
+ <color name="i_am_color_655">#00000655</color>
+ <color name="i_am_color_656">#00000656</color>
+ <color name="i_am_color_657">#00000657</color>
+ <color name="i_am_color_658">#00000658</color>
+ <color name="i_am_color_659">#00000659</color>
+ <color name="i_am_color_65a">#0000065a</color>
+ <color name="i_am_color_65b">#0000065b</color>
+ <color name="i_am_color_65c">#0000065c</color>
+ <color name="i_am_color_65d">#0000065d</color>
+ <color name="i_am_color_65e">#0000065e</color>
+ <color name="i_am_color_65f">#0000065f</color>
+ <color name="i_am_color_660">#00000660</color>
+ <color name="i_am_color_661">#00000661</color>
+ <color name="i_am_color_662">#00000662</color>
+ <color name="i_am_color_663">#00000663</color>
+ <color name="i_am_color_664">#00000664</color>
+ <color name="i_am_color_665">#00000665</color>
+ <color name="i_am_color_666">#00000666</color>
+ <color name="i_am_color_667">#00000667</color>
+ <color name="i_am_color_668">#00000668</color>
+ <color name="i_am_color_669">#00000669</color>
+ <color name="i_am_color_66a">#0000066a</color>
+ <color name="i_am_color_66b">#0000066b</color>
+ <color name="i_am_color_66c">#0000066c</color>
+ <color name="i_am_color_66d">#0000066d</color>
+ <color name="i_am_color_66e">#0000066e</color>
+ <color name="i_am_color_66f">#0000066f</color>
+ <color name="i_am_color_670">#00000670</color>
+ <color name="i_am_color_671">#00000671</color>
+ <color name="i_am_color_672">#00000672</color>
+ <color name="i_am_color_673">#00000673</color>
+ <color name="i_am_color_674">#00000674</color>
+ <color name="i_am_color_675">#00000675</color>
+ <color name="i_am_color_676">#00000676</color>
+ <color name="i_am_color_677">#00000677</color>
+ <color name="i_am_color_678">#00000678</color>
+ <color name="i_am_color_679">#00000679</color>
+ <color name="i_am_color_67a">#0000067a</color>
+ <color name="i_am_color_67b">#0000067b</color>
+ <color name="i_am_color_67c">#0000067c</color>
+ <color name="i_am_color_67d">#0000067d</color>
+ <color name="i_am_color_67e">#0000067e</color>
+ <color name="i_am_color_67f">#0000067f</color>
+ <color name="i_am_color_680">#00000680</color>
+ <color name="i_am_color_681">#00000681</color>
+ <color name="i_am_color_682">#00000682</color>
+ <color name="i_am_color_683">#00000683</color>
+ <color name="i_am_color_684">#00000684</color>
+ <color name="i_am_color_685">#00000685</color>
+ <color name="i_am_color_686">#00000686</color>
+ <color name="i_am_color_687">#00000687</color>
+ <color name="i_am_color_688">#00000688</color>
+ <color name="i_am_color_689">#00000689</color>
+ <color name="i_am_color_68a">#0000068a</color>
+ <color name="i_am_color_68b">#0000068b</color>
+ <color name="i_am_color_68c">#0000068c</color>
+ <color name="i_am_color_68d">#0000068d</color>
+ <color name="i_am_color_68e">#0000068e</color>
+ <color name="i_am_color_68f">#0000068f</color>
+ <color name="i_am_color_690">#00000690</color>
+ <color name="i_am_color_691">#00000691</color>
+ <color name="i_am_color_692">#00000692</color>
+ <color name="i_am_color_693">#00000693</color>
+ <color name="i_am_color_694">#00000694</color>
+ <color name="i_am_color_695">#00000695</color>
+ <color name="i_am_color_696">#00000696</color>
+ <color name="i_am_color_697">#00000697</color>
+ <color name="i_am_color_698">#00000698</color>
+ <color name="i_am_color_699">#00000699</color>
+ <color name="i_am_color_69a">#0000069a</color>
+ <color name="i_am_color_69b">#0000069b</color>
+ <color name="i_am_color_69c">#0000069c</color>
+ <color name="i_am_color_69d">#0000069d</color>
+ <color name="i_am_color_69e">#0000069e</color>
+ <color name="i_am_color_69f">#0000069f</color>
+ <color name="i_am_color_6a0">#000006a0</color>
+ <color name="i_am_color_6a1">#000006a1</color>
+ <color name="i_am_color_6a2">#000006a2</color>
+ <color name="i_am_color_6a3">#000006a3</color>
+ <color name="i_am_color_6a4">#000006a4</color>
+ <color name="i_am_color_6a5">#000006a5</color>
+ <color name="i_am_color_6a6">#000006a6</color>
+ <color name="i_am_color_6a7">#000006a7</color>
+ <color name="i_am_color_6a8">#000006a8</color>
+ <color name="i_am_color_6a9">#000006a9</color>
+ <color name="i_am_color_6aa">#000006aa</color>
+ <color name="i_am_color_6ab">#000006ab</color>
+ <color name="i_am_color_6ac">#000006ac</color>
+ <color name="i_am_color_6ad">#000006ad</color>
+ <color name="i_am_color_6ae">#000006ae</color>
+ <color name="i_am_color_6af">#000006af</color>
+ <color name="i_am_color_6b0">#000006b0</color>
+ <color name="i_am_color_6b1">#000006b1</color>
+ <color name="i_am_color_6b2">#000006b2</color>
+ <color name="i_am_color_6b3">#000006b3</color>
+ <color name="i_am_color_6b4">#000006b4</color>
+ <color name="i_am_color_6b5">#000006b5</color>
+ <color name="i_am_color_6b6">#000006b6</color>
+ <color name="i_am_color_6b7">#000006b7</color>
+ <color name="i_am_color_6b8">#000006b8</color>
+ <color name="i_am_color_6b9">#000006b9</color>
+ <color name="i_am_color_6ba">#000006ba</color>
+ <color name="i_am_color_6bb">#000006bb</color>
+ <color name="i_am_color_6bc">#000006bc</color>
+ <color name="i_am_color_6bd">#000006bd</color>
+ <color name="i_am_color_6be">#000006be</color>
+ <color name="i_am_color_6bf">#000006bf</color>
+ <color name="i_am_color_6c0">#000006c0</color>
+ <color name="i_am_color_6c1">#000006c1</color>
+ <color name="i_am_color_6c2">#000006c2</color>
+ <color name="i_am_color_6c3">#000006c3</color>
+ <color name="i_am_color_6c4">#000006c4</color>
+ <color name="i_am_color_6c5">#000006c5</color>
+ <color name="i_am_color_6c6">#000006c6</color>
+ <color name="i_am_color_6c7">#000006c7</color>
+ <color name="i_am_color_6c8">#000006c8</color>
+ <color name="i_am_color_6c9">#000006c9</color>
+ <color name="i_am_color_6ca">#000006ca</color>
+ <color name="i_am_color_6cb">#000006cb</color>
+ <color name="i_am_color_6cc">#000006cc</color>
+ <color name="i_am_color_6cd">#000006cd</color>
+ <color name="i_am_color_6ce">#000006ce</color>
+ <color name="i_am_color_6cf">#000006cf</color>
+ <color name="i_am_color_6d0">#000006d0</color>
+ <color name="i_am_color_6d1">#000006d1</color>
+ <color name="i_am_color_6d2">#000006d2</color>
+ <color name="i_am_color_6d3">#000006d3</color>
+ <color name="i_am_color_6d4">#000006d4</color>
+ <color name="i_am_color_6d5">#000006d5</color>
+ <color name="i_am_color_6d6">#000006d6</color>
+ <color name="i_am_color_6d7">#000006d7</color>
+ <color name="i_am_color_6d8">#000006d8</color>
+ <color name="i_am_color_6d9">#000006d9</color>
+ <color name="i_am_color_6da">#000006da</color>
+ <color name="i_am_color_6db">#000006db</color>
+ <color name="i_am_color_6dc">#000006dc</color>
+ <color name="i_am_color_6dd">#000006dd</color>
+ <color name="i_am_color_6de">#000006de</color>
+ <color name="i_am_color_6df">#000006df</color>
+ <color name="i_am_color_6e0">#000006e0</color>
+ <color name="i_am_color_6e1">#000006e1</color>
+ <color name="i_am_color_6e2">#000006e2</color>
+ <color name="i_am_color_6e3">#000006e3</color>
+ <color name="i_am_color_6e4">#000006e4</color>
+ <color name="i_am_color_6e5">#000006e5</color>
+ <color name="i_am_color_6e6">#000006e6</color>
+ <color name="i_am_color_6e7">#000006e7</color>
+ <color name="i_am_color_6e8">#000006e8</color>
+ <color name="i_am_color_6e9">#000006e9</color>
+ <color name="i_am_color_6ea">#000006ea</color>
+ <color name="i_am_color_6eb">#000006eb</color>
+ <color name="i_am_color_6ec">#000006ec</color>
+ <color name="i_am_color_6ed">#000006ed</color>
+ <color name="i_am_color_6ee">#000006ee</color>
+ <color name="i_am_color_6ef">#000006ef</color>
+ <color name="i_am_color_6f0">#000006f0</color>
+ <color name="i_am_color_6f1">#000006f1</color>
+ <color name="i_am_color_6f2">#000006f2</color>
+ <color name="i_am_color_6f3">#000006f3</color>
+ <color name="i_am_color_6f4">#000006f4</color>
+ <color name="i_am_color_6f5">#000006f5</color>
+ <color name="i_am_color_6f6">#000006f6</color>
+ <color name="i_am_color_6f7">#000006f7</color>
+ <color name="i_am_color_6f8">#000006f8</color>
+ <color name="i_am_color_6f9">#000006f9</color>
+ <color name="i_am_color_6fa">#000006fa</color>
+ <color name="i_am_color_6fb">#000006fb</color>
+ <color name="i_am_color_6fc">#000006fc</color>
+ <color name="i_am_color_6fd">#000006fd</color>
+ <color name="i_am_color_6fe">#000006fe</color>
+ <color name="i_am_color_6ff">#000006ff</color>
+ <color name="i_am_color_700">#00000700</color>
+ <color name="i_am_color_701">#00000701</color>
+ <color name="i_am_color_702">#00000702</color>
+ <color name="i_am_color_703">#00000703</color>
+ <color name="i_am_color_704">#00000704</color>
+ <color name="i_am_color_705">#00000705</color>
+ <color name="i_am_color_706">#00000706</color>
+ <color name="i_am_color_707">#00000707</color>
+ <color name="i_am_color_708">#00000708</color>
+ <color name="i_am_color_709">#00000709</color>
+ <color name="i_am_color_70a">#0000070a</color>
+ <color name="i_am_color_70b">#0000070b</color>
+ <color name="i_am_color_70c">#0000070c</color>
+ <color name="i_am_color_70d">#0000070d</color>
+ <color name="i_am_color_70e">#0000070e</color>
+ <color name="i_am_color_70f">#0000070f</color>
+ <color name="i_am_color_710">#00000710</color>
+ <color name="i_am_color_711">#00000711</color>
+ <color name="i_am_color_712">#00000712</color>
+ <color name="i_am_color_713">#00000713</color>
+ <color name="i_am_color_714">#00000714</color>
+ <color name="i_am_color_715">#00000715</color>
+ <color name="i_am_color_716">#00000716</color>
+ <color name="i_am_color_717">#00000717</color>
+ <color name="i_am_color_718">#00000718</color>
+ <color name="i_am_color_719">#00000719</color>
+ <color name="i_am_color_71a">#0000071a</color>
+ <color name="i_am_color_71b">#0000071b</color>
+ <color name="i_am_color_71c">#0000071c</color>
+ <color name="i_am_color_71d">#0000071d</color>
+ <color name="i_am_color_71e">#0000071e</color>
+ <color name="i_am_color_71f">#0000071f</color>
+ <color name="i_am_color_720">#00000720</color>
+ <color name="i_am_color_721">#00000721</color>
+ <color name="i_am_color_722">#00000722</color>
+ <color name="i_am_color_723">#00000723</color>
+ <color name="i_am_color_724">#00000724</color>
+ <color name="i_am_color_725">#00000725</color>
+ <color name="i_am_color_726">#00000726</color>
+ <color name="i_am_color_727">#00000727</color>
+ <color name="i_am_color_728">#00000728</color>
+ <color name="i_am_color_729">#00000729</color>
+ <color name="i_am_color_72a">#0000072a</color>
+ <color name="i_am_color_72b">#0000072b</color>
+ <color name="i_am_color_72c">#0000072c</color>
+ <color name="i_am_color_72d">#0000072d</color>
+ <color name="i_am_color_72e">#0000072e</color>
+ <color name="i_am_color_72f">#0000072f</color>
+ <color name="i_am_color_730">#00000730</color>
+ <color name="i_am_color_731">#00000731</color>
+ <color name="i_am_color_732">#00000732</color>
+ <color name="i_am_color_733">#00000733</color>
+ <color name="i_am_color_734">#00000734</color>
+ <color name="i_am_color_735">#00000735</color>
+ <color name="i_am_color_736">#00000736</color>
+ <color name="i_am_color_737">#00000737</color>
+ <color name="i_am_color_738">#00000738</color>
+ <color name="i_am_color_739">#00000739</color>
+ <color name="i_am_color_73a">#0000073a</color>
+ <color name="i_am_color_73b">#0000073b</color>
+ <color name="i_am_color_73c">#0000073c</color>
+ <color name="i_am_color_73d">#0000073d</color>
+ <color name="i_am_color_73e">#0000073e</color>
+ <color name="i_am_color_73f">#0000073f</color>
+ <color name="i_am_color_740">#00000740</color>
+ <color name="i_am_color_741">#00000741</color>
+ <color name="i_am_color_742">#00000742</color>
+ <color name="i_am_color_743">#00000743</color>
+ <color name="i_am_color_744">#00000744</color>
+ <color name="i_am_color_745">#00000745</color>
+ <color name="i_am_color_746">#00000746</color>
+ <color name="i_am_color_747">#00000747</color>
+ <color name="i_am_color_748">#00000748</color>
+ <color name="i_am_color_749">#00000749</color>
+ <color name="i_am_color_74a">#0000074a</color>
+ <color name="i_am_color_74b">#0000074b</color>
+ <color name="i_am_color_74c">#0000074c</color>
+ <color name="i_am_color_74d">#0000074d</color>
+ <color name="i_am_color_74e">#0000074e</color>
+ <color name="i_am_color_74f">#0000074f</color>
+ <color name="i_am_color_750">#00000750</color>
+ <color name="i_am_color_751">#00000751</color>
+ <color name="i_am_color_752">#00000752</color>
+ <color name="i_am_color_753">#00000753</color>
+ <color name="i_am_color_754">#00000754</color>
+ <color name="i_am_color_755">#00000755</color>
+ <color name="i_am_color_756">#00000756</color>
+ <color name="i_am_color_757">#00000757</color>
+ <color name="i_am_color_758">#00000758</color>
+ <color name="i_am_color_759">#00000759</color>
+ <color name="i_am_color_75a">#0000075a</color>
+ <color name="i_am_color_75b">#0000075b</color>
+ <color name="i_am_color_75c">#0000075c</color>
+ <color name="i_am_color_75d">#0000075d</color>
+ <color name="i_am_color_75e">#0000075e</color>
+ <color name="i_am_color_75f">#0000075f</color>
+ <color name="i_am_color_760">#00000760</color>
+ <color name="i_am_color_761">#00000761</color>
+ <color name="i_am_color_762">#00000762</color>
+ <color name="i_am_color_763">#00000763</color>
+ <color name="i_am_color_764">#00000764</color>
+ <color name="i_am_color_765">#00000765</color>
+ <color name="i_am_color_766">#00000766</color>
+ <color name="i_am_color_767">#00000767</color>
+ <color name="i_am_color_768">#00000768</color>
+ <color name="i_am_color_769">#00000769</color>
+ <color name="i_am_color_76a">#0000076a</color>
+ <color name="i_am_color_76b">#0000076b</color>
+ <color name="i_am_color_76c">#0000076c</color>
+ <color name="i_am_color_76d">#0000076d</color>
+ <color name="i_am_color_76e">#0000076e</color>
+ <color name="i_am_color_76f">#0000076f</color>
+ <color name="i_am_color_770">#00000770</color>
+ <color name="i_am_color_771">#00000771</color>
+ <color name="i_am_color_772">#00000772</color>
+ <color name="i_am_color_773">#00000773</color>
+ <color name="i_am_color_774">#00000774</color>
+ <color name="i_am_color_775">#00000775</color>
+ <color name="i_am_color_776">#00000776</color>
+ <color name="i_am_color_777">#00000777</color>
+ <color name="i_am_color_778">#00000778</color>
+ <color name="i_am_color_779">#00000779</color>
+ <color name="i_am_color_77a">#0000077a</color>
+ <color name="i_am_color_77b">#0000077b</color>
+ <color name="i_am_color_77c">#0000077c</color>
+ <color name="i_am_color_77d">#0000077d</color>
+ <color name="i_am_color_77e">#0000077e</color>
+ <color name="i_am_color_77f">#0000077f</color>
+ <color name="i_am_color_780">#00000780</color>
+ <color name="i_am_color_781">#00000781</color>
+ <color name="i_am_color_782">#00000782</color>
+ <color name="i_am_color_783">#00000783</color>
+ <color name="i_am_color_784">#00000784</color>
+ <color name="i_am_color_785">#00000785</color>
+ <color name="i_am_color_786">#00000786</color>
+ <color name="i_am_color_787">#00000787</color>
+ <color name="i_am_color_788">#00000788</color>
+ <color name="i_am_color_789">#00000789</color>
+ <color name="i_am_color_78a">#0000078a</color>
+ <color name="i_am_color_78b">#0000078b</color>
+ <color name="i_am_color_78c">#0000078c</color>
+ <color name="i_am_color_78d">#0000078d</color>
+ <color name="i_am_color_78e">#0000078e</color>
+ <color name="i_am_color_78f">#0000078f</color>
+ <color name="i_am_color_790">#00000790</color>
+ <color name="i_am_color_791">#00000791</color>
+ <color name="i_am_color_792">#00000792</color>
+ <color name="i_am_color_793">#00000793</color>
+ <color name="i_am_color_794">#00000794</color>
+ <color name="i_am_color_795">#00000795</color>
+ <color name="i_am_color_796">#00000796</color>
+ <color name="i_am_color_797">#00000797</color>
+ <color name="i_am_color_798">#00000798</color>
+ <color name="i_am_color_799">#00000799</color>
+ <color name="i_am_color_79a">#0000079a</color>
+ <color name="i_am_color_79b">#0000079b</color>
+ <color name="i_am_color_79c">#0000079c</color>
+ <color name="i_am_color_79d">#0000079d</color>
+ <color name="i_am_color_79e">#0000079e</color>
+ <color name="i_am_color_79f">#0000079f</color>
+ <color name="i_am_color_7a0">#000007a0</color>
+ <color name="i_am_color_7a1">#000007a1</color>
+ <color name="i_am_color_7a2">#000007a2</color>
+ <color name="i_am_color_7a3">#000007a3</color>
+ <color name="i_am_color_7a4">#000007a4</color>
+ <color name="i_am_color_7a5">#000007a5</color>
+ <color name="i_am_color_7a6">#000007a6</color>
+ <color name="i_am_color_7a7">#000007a7</color>
+ <color name="i_am_color_7a8">#000007a8</color>
+ <color name="i_am_color_7a9">#000007a9</color>
+ <color name="i_am_color_7aa">#000007aa</color>
+ <color name="i_am_color_7ab">#000007ab</color>
+ <color name="i_am_color_7ac">#000007ac</color>
+ <color name="i_am_color_7ad">#000007ad</color>
+ <color name="i_am_color_7ae">#000007ae</color>
+ <color name="i_am_color_7af">#000007af</color>
+ <color name="i_am_color_7b0">#000007b0</color>
+ <color name="i_am_color_7b1">#000007b1</color>
+ <color name="i_am_color_7b2">#000007b2</color>
+ <color name="i_am_color_7b3">#000007b3</color>
+ <color name="i_am_color_7b4">#000007b4</color>
+ <color name="i_am_color_7b5">#000007b5</color>
+ <color name="i_am_color_7b6">#000007b6</color>
+ <color name="i_am_color_7b7">#000007b7</color>
+ <color name="i_am_color_7b8">#000007b8</color>
+ <color name="i_am_color_7b9">#000007b9</color>
+ <color name="i_am_color_7ba">#000007ba</color>
+ <color name="i_am_color_7bb">#000007bb</color>
+ <color name="i_am_color_7bc">#000007bc</color>
+ <color name="i_am_color_7bd">#000007bd</color>
+ <color name="i_am_color_7be">#000007be</color>
+ <color name="i_am_color_7bf">#000007bf</color>
+ <color name="i_am_color_7c0">#000007c0</color>
+ <color name="i_am_color_7c1">#000007c1</color>
+ <color name="i_am_color_7c2">#000007c2</color>
+ <color name="i_am_color_7c3">#000007c3</color>
+ <color name="i_am_color_7c4">#000007c4</color>
+ <color name="i_am_color_7c5">#000007c5</color>
+ <color name="i_am_color_7c6">#000007c6</color>
+ <color name="i_am_color_7c7">#000007c7</color>
+ <color name="i_am_color_7c8">#000007c8</color>
+ <color name="i_am_color_7c9">#000007c9</color>
+ <color name="i_am_color_7ca">#000007ca</color>
+ <color name="i_am_color_7cb">#000007cb</color>
+ <color name="i_am_color_7cc">#000007cc</color>
+ <color name="i_am_color_7cd">#000007cd</color>
+ <color name="i_am_color_7ce">#000007ce</color>
+ <color name="i_am_color_7cf">#000007cf</color>
+ <color name="i_am_color_7d0">#000007d0</color>
+ <color name="i_am_color_7d1">#000007d1</color>
+ <color name="i_am_color_7d2">#000007d2</color>
+ <color name="i_am_color_7d3">#000007d3</color>
+ <color name="i_am_color_7d4">#000007d4</color>
+ <color name="i_am_color_7d5">#000007d5</color>
+ <color name="i_am_color_7d6">#000007d6</color>
+ <color name="i_am_color_7d7">#000007d7</color>
+ <color name="i_am_color_7d8">#000007d8</color>
+ <color name="i_am_color_7d9">#000007d9</color>
+ <color name="i_am_color_7da">#000007da</color>
+ <color name="i_am_color_7db">#000007db</color>
+ <color name="i_am_color_7dc">#000007dc</color>
+ <color name="i_am_color_7dd">#000007dd</color>
+ <color name="i_am_color_7de">#000007de</color>
+ <color name="i_am_color_7df">#000007df</color>
+ <color name="i_am_color_7e0">#000007e0</color>
+ <color name="i_am_color_7e1">#000007e1</color>
+ <color name="i_am_color_7e2">#000007e2</color>
+ <color name="i_am_color_7e3">#000007e3</color>
+ <color name="i_am_color_7e4">#000007e4</color>
+ <color name="i_am_color_7e5">#000007e5</color>
+ <color name="i_am_color_7e6">#000007e6</color>
+ <color name="i_am_color_7e7">#000007e7</color>
+ <color name="i_am_color_7e8">#000007e8</color>
+ <color name="i_am_color_7e9">#000007e9</color>
+ <color name="i_am_color_7ea">#000007ea</color>
+ <color name="i_am_color_7eb">#000007eb</color>
+ <color name="i_am_color_7ec">#000007ec</color>
+ <color name="i_am_color_7ed">#000007ed</color>
+ <color name="i_am_color_7ee">#000007ee</color>
+ <color name="i_am_color_7ef">#000007ef</color>
+ <color name="i_am_color_7f0">#000007f0</color>
+ <color name="i_am_color_7f1">#000007f1</color>
+ <color name="i_am_color_7f2">#000007f2</color>
+ <color name="i_am_color_7f3">#000007f3</color>
+ <color name="i_am_color_7f4">#000007f4</color>
+ <color name="i_am_color_7f5">#000007f5</color>
+ <color name="i_am_color_7f6">#000007f6</color>
+ <color name="i_am_color_7f7">#000007f7</color>
+ <color name="i_am_color_7f8">#000007f8</color>
+ <color name="i_am_color_7f9">#000007f9</color>
+ <color name="i_am_color_7fa">#000007fa</color>
+ <color name="i_am_color_7fb">#000007fb</color>
+ <color name="i_am_color_7fc">#000007fc</color>
+ <color name="i_am_color_7fd">#000007fd</color>
+ <color name="i_am_color_7fe">#000007fe</color>
+ <color name="i_am_color_7ff">#000007ff</color>
+ <color name="i_am_color_800">#00000800</color>
+ <color name="i_am_color_801">#00000801</color>
+ <color name="i_am_color_802">#00000802</color>
+ <color name="i_am_color_803">#00000803</color>
+ <color name="i_am_color_804">#00000804</color>
+ <color name="i_am_color_805">#00000805</color>
+ <color name="i_am_color_806">#00000806</color>
+ <color name="i_am_color_807">#00000807</color>
+ <color name="i_am_color_808">#00000808</color>
+ <color name="i_am_color_809">#00000809</color>
+ <color name="i_am_color_80a">#0000080a</color>
+ <color name="i_am_color_80b">#0000080b</color>
+ <color name="i_am_color_80c">#0000080c</color>
+ <color name="i_am_color_80d">#0000080d</color>
+ <color name="i_am_color_80e">#0000080e</color>
+ <color name="i_am_color_80f">#0000080f</color>
+ <color name="i_am_color_810">#00000810</color>
+ <color name="i_am_color_811">#00000811</color>
+ <color name="i_am_color_812">#00000812</color>
+ <color name="i_am_color_813">#00000813</color>
+ <color name="i_am_color_814">#00000814</color>
+ <color name="i_am_color_815">#00000815</color>
+ <color name="i_am_color_816">#00000816</color>
+ <color name="i_am_color_817">#00000817</color>
+ <color name="i_am_color_818">#00000818</color>
+ <color name="i_am_color_819">#00000819</color>
+ <color name="i_am_color_81a">#0000081a</color>
+ <color name="i_am_color_81b">#0000081b</color>
+ <color name="i_am_color_81c">#0000081c</color>
+ <color name="i_am_color_81d">#0000081d</color>
+ <color name="i_am_color_81e">#0000081e</color>
+ <color name="i_am_color_81f">#0000081f</color>
+ <color name="i_am_color_820">#00000820</color>
+ <color name="i_am_color_821">#00000821</color>
+ <color name="i_am_color_822">#00000822</color>
+ <color name="i_am_color_823">#00000823</color>
+ <color name="i_am_color_824">#00000824</color>
+ <color name="i_am_color_825">#00000825</color>
+ <color name="i_am_color_826">#00000826</color>
+ <color name="i_am_color_827">#00000827</color>
+ <color name="i_am_color_828">#00000828</color>
+ <color name="i_am_color_829">#00000829</color>
+ <color name="i_am_color_82a">#0000082a</color>
+ <color name="i_am_color_82b">#0000082b</color>
+ <color name="i_am_color_82c">#0000082c</color>
+ <color name="i_am_color_82d">#0000082d</color>
+ <color name="i_am_color_82e">#0000082e</color>
+ <color name="i_am_color_82f">#0000082f</color>
+ <color name="i_am_color_830">#00000830</color>
+ <color name="i_am_color_831">#00000831</color>
+ <color name="i_am_color_832">#00000832</color>
+ <color name="i_am_color_833">#00000833</color>
+ <color name="i_am_color_834">#00000834</color>
+ <color name="i_am_color_835">#00000835</color>
+ <color name="i_am_color_836">#00000836</color>
+ <color name="i_am_color_837">#00000837</color>
+ <color name="i_am_color_838">#00000838</color>
+ <color name="i_am_color_839">#00000839</color>
+ <color name="i_am_color_83a">#0000083a</color>
+ <color name="i_am_color_83b">#0000083b</color>
+ <color name="i_am_color_83c">#0000083c</color>
+ <color name="i_am_color_83d">#0000083d</color>
+ <color name="i_am_color_83e">#0000083e</color>
+ <color name="i_am_color_83f">#0000083f</color>
+ <color name="i_am_color_840">#00000840</color>
+ <color name="i_am_color_841">#00000841</color>
+ <color name="i_am_color_842">#00000842</color>
+ <color name="i_am_color_843">#00000843</color>
+ <color name="i_am_color_844">#00000844</color>
+ <color name="i_am_color_845">#00000845</color>
+ <color name="i_am_color_846">#00000846</color>
+ <color name="i_am_color_847">#00000847</color>
+ <color name="i_am_color_848">#00000848</color>
+ <color name="i_am_color_849">#00000849</color>
+ <color name="i_am_color_84a">#0000084a</color>
+ <color name="i_am_color_84b">#0000084b</color>
+ <color name="i_am_color_84c">#0000084c</color>
+ <color name="i_am_color_84d">#0000084d</color>
+ <color name="i_am_color_84e">#0000084e</color>
+ <color name="i_am_color_84f">#0000084f</color>
+ <color name="i_am_color_850">#00000850</color>
+ <color name="i_am_color_851">#00000851</color>
+ <color name="i_am_color_852">#00000852</color>
+ <color name="i_am_color_853">#00000853</color>
+ <color name="i_am_color_854">#00000854</color>
+ <color name="i_am_color_855">#00000855</color>
+ <color name="i_am_color_856">#00000856</color>
+ <color name="i_am_color_857">#00000857</color>
+ <color name="i_am_color_858">#00000858</color>
+ <color name="i_am_color_859">#00000859</color>
+ <color name="i_am_color_85a">#0000085a</color>
+ <color name="i_am_color_85b">#0000085b</color>
+ <color name="i_am_color_85c">#0000085c</color>
+ <color name="i_am_color_85d">#0000085d</color>
+ <color name="i_am_color_85e">#0000085e</color>
+ <color name="i_am_color_85f">#0000085f</color>
+ <color name="i_am_color_860">#00000860</color>
+ <color name="i_am_color_861">#00000861</color>
+ <color name="i_am_color_862">#00000862</color>
+ <color name="i_am_color_863">#00000863</color>
+ <color name="i_am_color_864">#00000864</color>
+ <color name="i_am_color_865">#00000865</color>
+ <color name="i_am_color_866">#00000866</color>
+ <color name="i_am_color_867">#00000867</color>
+ <color name="i_am_color_868">#00000868</color>
+ <color name="i_am_color_869">#00000869</color>
+ <color name="i_am_color_86a">#0000086a</color>
+ <color name="i_am_color_86b">#0000086b</color>
+ <color name="i_am_color_86c">#0000086c</color>
+ <color name="i_am_color_86d">#0000086d</color>
+ <color name="i_am_color_86e">#0000086e</color>
+ <color name="i_am_color_86f">#0000086f</color>
+ <color name="i_am_color_870">#00000870</color>
+ <color name="i_am_color_871">#00000871</color>
+ <color name="i_am_color_872">#00000872</color>
+ <color name="i_am_color_873">#00000873</color>
+ <color name="i_am_color_874">#00000874</color>
+ <color name="i_am_color_875">#00000875</color>
+ <color name="i_am_color_876">#00000876</color>
+ <color name="i_am_color_877">#00000877</color>
+ <color name="i_am_color_878">#00000878</color>
+ <color name="i_am_color_879">#00000879</color>
+ <color name="i_am_color_87a">#0000087a</color>
+ <color name="i_am_color_87b">#0000087b</color>
+ <color name="i_am_color_87c">#0000087c</color>
+ <color name="i_am_color_87d">#0000087d</color>
+ <color name="i_am_color_87e">#0000087e</color>
+ <color name="i_am_color_87f">#0000087f</color>
+ <color name="i_am_color_880">#00000880</color>
+ <color name="i_am_color_881">#00000881</color>
+ <color name="i_am_color_882">#00000882</color>
+ <color name="i_am_color_883">#00000883</color>
+ <color name="i_am_color_884">#00000884</color>
+ <color name="i_am_color_885">#00000885</color>
+ <color name="i_am_color_886">#00000886</color>
+ <color name="i_am_color_887">#00000887</color>
+ <color name="i_am_color_888">#00000888</color>
+ <color name="i_am_color_889">#00000889</color>
+ <color name="i_am_color_88a">#0000088a</color>
+ <color name="i_am_color_88b">#0000088b</color>
+ <color name="i_am_color_88c">#0000088c</color>
+ <color name="i_am_color_88d">#0000088d</color>
+ <color name="i_am_color_88e">#0000088e</color>
+ <color name="i_am_color_88f">#0000088f</color>
+ <color name="i_am_color_890">#00000890</color>
+ <color name="i_am_color_891">#00000891</color>
+ <color name="i_am_color_892">#00000892</color>
+ <color name="i_am_color_893">#00000893</color>
+ <color name="i_am_color_894">#00000894</color>
+ <color name="i_am_color_895">#00000895</color>
+ <color name="i_am_color_896">#00000896</color>
+ <color name="i_am_color_897">#00000897</color>
+ <color name="i_am_color_898">#00000898</color>
+ <color name="i_am_color_899">#00000899</color>
+ <color name="i_am_color_89a">#0000089a</color>
+ <color name="i_am_color_89b">#0000089b</color>
+ <color name="i_am_color_89c">#0000089c</color>
+ <color name="i_am_color_89d">#0000089d</color>
+ <color name="i_am_color_89e">#0000089e</color>
+ <color name="i_am_color_89f">#0000089f</color>
+ <color name="i_am_color_8a0">#000008a0</color>
+ <color name="i_am_color_8a1">#000008a1</color>
+ <color name="i_am_color_8a2">#000008a2</color>
+ <color name="i_am_color_8a3">#000008a3</color>
+ <color name="i_am_color_8a4">#000008a4</color>
+ <color name="i_am_color_8a5">#000008a5</color>
+ <color name="i_am_color_8a6">#000008a6</color>
+ <color name="i_am_color_8a7">#000008a7</color>
+ <color name="i_am_color_8a8">#000008a8</color>
+ <color name="i_am_color_8a9">#000008a9</color>
+ <color name="i_am_color_8aa">#000008aa</color>
+ <color name="i_am_color_8ab">#000008ab</color>
+ <color name="i_am_color_8ac">#000008ac</color>
+ <color name="i_am_color_8ad">#000008ad</color>
+ <color name="i_am_color_8ae">#000008ae</color>
+ <color name="i_am_color_8af">#000008af</color>
+ <color name="i_am_color_8b0">#000008b0</color>
+ <color name="i_am_color_8b1">#000008b1</color>
+ <color name="i_am_color_8b2">#000008b2</color>
+ <color name="i_am_color_8b3">#000008b3</color>
+ <color name="i_am_color_8b4">#000008b4</color>
+ <color name="i_am_color_8b5">#000008b5</color>
+ <color name="i_am_color_8b6">#000008b6</color>
+ <color name="i_am_color_8b7">#000008b7</color>
+ <color name="i_am_color_8b8">#000008b8</color>
+ <color name="i_am_color_8b9">#000008b9</color>
+ <color name="i_am_color_8ba">#000008ba</color>
+ <color name="i_am_color_8bb">#000008bb</color>
+ <color name="i_am_color_8bc">#000008bc</color>
+ <color name="i_am_color_8bd">#000008bd</color>
+ <color name="i_am_color_8be">#000008be</color>
+ <color name="i_am_color_8bf">#000008bf</color>
+ <color name="i_am_color_8c0">#000008c0</color>
+ <color name="i_am_color_8c1">#000008c1</color>
+ <color name="i_am_color_8c2">#000008c2</color>
+ <color name="i_am_color_8c3">#000008c3</color>
+ <color name="i_am_color_8c4">#000008c4</color>
+ <color name="i_am_color_8c5">#000008c5</color>
+ <color name="i_am_color_8c6">#000008c6</color>
+ <color name="i_am_color_8c7">#000008c7</color>
+ <color name="i_am_color_8c8">#000008c8</color>
+ <color name="i_am_color_8c9">#000008c9</color>
+ <color name="i_am_color_8ca">#000008ca</color>
+ <color name="i_am_color_8cb">#000008cb</color>
+ <color name="i_am_color_8cc">#000008cc</color>
+ <color name="i_am_color_8cd">#000008cd</color>
+ <color name="i_am_color_8ce">#000008ce</color>
+ <color name="i_am_color_8cf">#000008cf</color>
+ <color name="i_am_color_8d0">#000008d0</color>
+ <color name="i_am_color_8d1">#000008d1</color>
+ <color name="i_am_color_8d2">#000008d2</color>
+ <color name="i_am_color_8d3">#000008d3</color>
+ <color name="i_am_color_8d4">#000008d4</color>
+ <color name="i_am_color_8d5">#000008d5</color>
+ <color name="i_am_color_8d6">#000008d6</color>
+ <color name="i_am_color_8d7">#000008d7</color>
+ <color name="i_am_color_8d8">#000008d8</color>
+ <color name="i_am_color_8d9">#000008d9</color>
+ <color name="i_am_color_8da">#000008da</color>
+ <color name="i_am_color_8db">#000008db</color>
+ <color name="i_am_color_8dc">#000008dc</color>
+ <color name="i_am_color_8dd">#000008dd</color>
+ <color name="i_am_color_8de">#000008de</color>
+ <color name="i_am_color_8df">#000008df</color>
+ <color name="i_am_color_8e0">#000008e0</color>
+ <color name="i_am_color_8e1">#000008e1</color>
+ <color name="i_am_color_8e2">#000008e2</color>
+ <color name="i_am_color_8e3">#000008e3</color>
+ <color name="i_am_color_8e4">#000008e4</color>
+ <color name="i_am_color_8e5">#000008e5</color>
+ <color name="i_am_color_8e6">#000008e6</color>
+ <color name="i_am_color_8e7">#000008e7</color>
+ <color name="i_am_color_8e8">#000008e8</color>
+ <color name="i_am_color_8e9">#000008e9</color>
+ <color name="i_am_color_8ea">#000008ea</color>
+ <color name="i_am_color_8eb">#000008eb</color>
+ <color name="i_am_color_8ec">#000008ec</color>
+ <color name="i_am_color_8ed">#000008ed</color>
+ <color name="i_am_color_8ee">#000008ee</color>
+ <color name="i_am_color_8ef">#000008ef</color>
+ <color name="i_am_color_8f0">#000008f0</color>
+ <color name="i_am_color_8f1">#000008f1</color>
+ <color name="i_am_color_8f2">#000008f2</color>
+ <color name="i_am_color_8f3">#000008f3</color>
+ <color name="i_am_color_8f4">#000008f4</color>
+ <color name="i_am_color_8f5">#000008f5</color>
+ <color name="i_am_color_8f6">#000008f6</color>
+ <color name="i_am_color_8f7">#000008f7</color>
+ <color name="i_am_color_8f8">#000008f8</color>
+ <color name="i_am_color_8f9">#000008f9</color>
+ <color name="i_am_color_8fa">#000008fa</color>
+ <color name="i_am_color_8fb">#000008fb</color>
+ <color name="i_am_color_8fc">#000008fc</color>
+ <color name="i_am_color_8fd">#000008fd</color>
+ <color name="i_am_color_8fe">#000008fe</color>
+ <color name="i_am_color_8ff">#000008ff</color>
+ <color name="i_am_color_900">#00000900</color>
+ <color name="i_am_color_901">#00000901</color>
+ <color name="i_am_color_902">#00000902</color>
+ <color name="i_am_color_903">#00000903</color>
+ <color name="i_am_color_904">#00000904</color>
+ <color name="i_am_color_905">#00000905</color>
+ <color name="i_am_color_906">#00000906</color>
+ <color name="i_am_color_907">#00000907</color>
+ <color name="i_am_color_908">#00000908</color>
+ <color name="i_am_color_909">#00000909</color>
+ <color name="i_am_color_90a">#0000090a</color>
+ <color name="i_am_color_90b">#0000090b</color>
+ <color name="i_am_color_90c">#0000090c</color>
+ <color name="i_am_color_90d">#0000090d</color>
+ <color name="i_am_color_90e">#0000090e</color>
+ <color name="i_am_color_90f">#0000090f</color>
+ <color name="i_am_color_910">#00000910</color>
+ <color name="i_am_color_911">#00000911</color>
+ <color name="i_am_color_912">#00000912</color>
+ <color name="i_am_color_913">#00000913</color>
+ <color name="i_am_color_914">#00000914</color>
+ <color name="i_am_color_915">#00000915</color>
+ <color name="i_am_color_916">#00000916</color>
+ <color name="i_am_color_917">#00000917</color>
+ <color name="i_am_color_918">#00000918</color>
+ <color name="i_am_color_919">#00000919</color>
+ <color name="i_am_color_91a">#0000091a</color>
+ <color name="i_am_color_91b">#0000091b</color>
+ <color name="i_am_color_91c">#0000091c</color>
+ <color name="i_am_color_91d">#0000091d</color>
+ <color name="i_am_color_91e">#0000091e</color>
+ <color name="i_am_color_91f">#0000091f</color>
+ <color name="i_am_color_920">#00000920</color>
+ <color name="i_am_color_921">#00000921</color>
+ <color name="i_am_color_922">#00000922</color>
+ <color name="i_am_color_923">#00000923</color>
+ <color name="i_am_color_924">#00000924</color>
+ <color name="i_am_color_925">#00000925</color>
+ <color name="i_am_color_926">#00000926</color>
+ <color name="i_am_color_927">#00000927</color>
+ <color name="i_am_color_928">#00000928</color>
+ <color name="i_am_color_929">#00000929</color>
+ <color name="i_am_color_92a">#0000092a</color>
+ <color name="i_am_color_92b">#0000092b</color>
+ <color name="i_am_color_92c">#0000092c</color>
+ <color name="i_am_color_92d">#0000092d</color>
+ <color name="i_am_color_92e">#0000092e</color>
+ <color name="i_am_color_92f">#0000092f</color>
+ <color name="i_am_color_930">#00000930</color>
+ <color name="i_am_color_931">#00000931</color>
+ <color name="i_am_color_932">#00000932</color>
+ <color name="i_am_color_933">#00000933</color>
+ <color name="i_am_color_934">#00000934</color>
+ <color name="i_am_color_935">#00000935</color>
+ <color name="i_am_color_936">#00000936</color>
+ <color name="i_am_color_937">#00000937</color>
+ <color name="i_am_color_938">#00000938</color>
+ <color name="i_am_color_939">#00000939</color>
+ <color name="i_am_color_93a">#0000093a</color>
+ <color name="i_am_color_93b">#0000093b</color>
+ <color name="i_am_color_93c">#0000093c</color>
+ <color name="i_am_color_93d">#0000093d</color>
+ <color name="i_am_color_93e">#0000093e</color>
+ <color name="i_am_color_93f">#0000093f</color>
+ <color name="i_am_color_940">#00000940</color>
+ <color name="i_am_color_941">#00000941</color>
+ <color name="i_am_color_942">#00000942</color>
+ <color name="i_am_color_943">#00000943</color>
+ <color name="i_am_color_944">#00000944</color>
+ <color name="i_am_color_945">#00000945</color>
+ <color name="i_am_color_946">#00000946</color>
+ <color name="i_am_color_947">#00000947</color>
+ <color name="i_am_color_948">#00000948</color>
+ <color name="i_am_color_949">#00000949</color>
+ <color name="i_am_color_94a">#0000094a</color>
+ <color name="i_am_color_94b">#0000094b</color>
+ <color name="i_am_color_94c">#0000094c</color>
+ <color name="i_am_color_94d">#0000094d</color>
+ <color name="i_am_color_94e">#0000094e</color>
+ <color name="i_am_color_94f">#0000094f</color>
+ <color name="i_am_color_950">#00000950</color>
+ <color name="i_am_color_951">#00000951</color>
+ <color name="i_am_color_952">#00000952</color>
+ <color name="i_am_color_953">#00000953</color>
+ <color name="i_am_color_954">#00000954</color>
+ <color name="i_am_color_955">#00000955</color>
+ <color name="i_am_color_956">#00000956</color>
+ <color name="i_am_color_957">#00000957</color>
+ <color name="i_am_color_958">#00000958</color>
+ <color name="i_am_color_959">#00000959</color>
+ <color name="i_am_color_95a">#0000095a</color>
+ <color name="i_am_color_95b">#0000095b</color>
+ <color name="i_am_color_95c">#0000095c</color>
+ <color name="i_am_color_95d">#0000095d</color>
+ <color name="i_am_color_95e">#0000095e</color>
+ <color name="i_am_color_95f">#0000095f</color>
+ <color name="i_am_color_960">#00000960</color>
+ <color name="i_am_color_961">#00000961</color>
+ <color name="i_am_color_962">#00000962</color>
+ <color name="i_am_color_963">#00000963</color>
+ <color name="i_am_color_964">#00000964</color>
+ <color name="i_am_color_965">#00000965</color>
+ <color name="i_am_color_966">#00000966</color>
+ <color name="i_am_color_967">#00000967</color>
+ <color name="i_am_color_968">#00000968</color>
+ <color name="i_am_color_969">#00000969</color>
+ <color name="i_am_color_96a">#0000096a</color>
+ <color name="i_am_color_96b">#0000096b</color>
+ <color name="i_am_color_96c">#0000096c</color>
+ <color name="i_am_color_96d">#0000096d</color>
+ <color name="i_am_color_96e">#0000096e</color>
+ <color name="i_am_color_96f">#0000096f</color>
+ <color name="i_am_color_970">#00000970</color>
+ <color name="i_am_color_971">#00000971</color>
+ <color name="i_am_color_972">#00000972</color>
+ <color name="i_am_color_973">#00000973</color>
+ <color name="i_am_color_974">#00000974</color>
+ <color name="i_am_color_975">#00000975</color>
+ <color name="i_am_color_976">#00000976</color>
+ <color name="i_am_color_977">#00000977</color>
+ <color name="i_am_color_978">#00000978</color>
+ <color name="i_am_color_979">#00000979</color>
+ <color name="i_am_color_97a">#0000097a</color>
+ <color name="i_am_color_97b">#0000097b</color>
+ <color name="i_am_color_97c">#0000097c</color>
+ <color name="i_am_color_97d">#0000097d</color>
+ <color name="i_am_color_97e">#0000097e</color>
+ <color name="i_am_color_97f">#0000097f</color>
+ <color name="i_am_color_980">#00000980</color>
+ <color name="i_am_color_981">#00000981</color>
+ <color name="i_am_color_982">#00000982</color>
+ <color name="i_am_color_983">#00000983</color>
+ <color name="i_am_color_984">#00000984</color>
+ <color name="i_am_color_985">#00000985</color>
+ <color name="i_am_color_986">#00000986</color>
+ <color name="i_am_color_987">#00000987</color>
+ <color name="i_am_color_988">#00000988</color>
+ <color name="i_am_color_989">#00000989</color>
+ <color name="i_am_color_98a">#0000098a</color>
+ <color name="i_am_color_98b">#0000098b</color>
+ <color name="i_am_color_98c">#0000098c</color>
+ <color name="i_am_color_98d">#0000098d</color>
+ <color name="i_am_color_98e">#0000098e</color>
+ <color name="i_am_color_98f">#0000098f</color>
+ <color name="i_am_color_990">#00000990</color>
+ <color name="i_am_color_991">#00000991</color>
+ <color name="i_am_color_992">#00000992</color>
+ <color name="i_am_color_993">#00000993</color>
+ <color name="i_am_color_994">#00000994</color>
+ <color name="i_am_color_995">#00000995</color>
+ <color name="i_am_color_996">#00000996</color>
+ <color name="i_am_color_997">#00000997</color>
+ <color name="i_am_color_998">#00000998</color>
+ <color name="i_am_color_999">#00000999</color>
+ <color name="i_am_color_99a">#0000099a</color>
+ <color name="i_am_color_99b">#0000099b</color>
+ <color name="i_am_color_99c">#0000099c</color>
+ <color name="i_am_color_99d">#0000099d</color>
+ <color name="i_am_color_99e">#0000099e</color>
+ <color name="i_am_color_99f">#0000099f</color>
+ <color name="i_am_color_9a0">#000009a0</color>
+ <color name="i_am_color_9a1">#000009a1</color>
+ <color name="i_am_color_9a2">#000009a2</color>
+ <color name="i_am_color_9a3">#000009a3</color>
+ <color name="i_am_color_9a4">#000009a4</color>
+ <color name="i_am_color_9a5">#000009a5</color>
+ <color name="i_am_color_9a6">#000009a6</color>
+ <color name="i_am_color_9a7">#000009a7</color>
+ <color name="i_am_color_9a8">#000009a8</color>
+ <color name="i_am_color_9a9">#000009a9</color>
+ <color name="i_am_color_9aa">#000009aa</color>
+ <color name="i_am_color_9ab">#000009ab</color>
+ <color name="i_am_color_9ac">#000009ac</color>
+ <color name="i_am_color_9ad">#000009ad</color>
+ <color name="i_am_color_9ae">#000009ae</color>
+ <color name="i_am_color_9af">#000009af</color>
+ <color name="i_am_color_9b0">#000009b0</color>
+ <color name="i_am_color_9b1">#000009b1</color>
+ <color name="i_am_color_9b2">#000009b2</color>
+ <color name="i_am_color_9b3">#000009b3</color>
+ <color name="i_am_color_9b4">#000009b4</color>
+ <color name="i_am_color_9b5">#000009b5</color>
+ <color name="i_am_color_9b6">#000009b6</color>
+ <color name="i_am_color_9b7">#000009b7</color>
+ <color name="i_am_color_9b8">#000009b8</color>
+ <color name="i_am_color_9b9">#000009b9</color>
+ <color name="i_am_color_9ba">#000009ba</color>
+ <color name="i_am_color_9bb">#000009bb</color>
+ <color name="i_am_color_9bc">#000009bc</color>
+ <color name="i_am_color_9bd">#000009bd</color>
+ <color name="i_am_color_9be">#000009be</color>
+ <color name="i_am_color_9bf">#000009bf</color>
+ <color name="i_am_color_9c0">#000009c0</color>
+ <color name="i_am_color_9c1">#000009c1</color>
+ <color name="i_am_color_9c2">#000009c2</color>
+ <color name="i_am_color_9c3">#000009c3</color>
+ <color name="i_am_color_9c4">#000009c4</color>
+ <color name="i_am_color_9c5">#000009c5</color>
+ <color name="i_am_color_9c6">#000009c6</color>
+ <color name="i_am_color_9c7">#000009c7</color>
+ <color name="i_am_color_9c8">#000009c8</color>
+ <color name="i_am_color_9c9">#000009c9</color>
+ <color name="i_am_color_9ca">#000009ca</color>
+ <color name="i_am_color_9cb">#000009cb</color>
+ <color name="i_am_color_9cc">#000009cc</color>
+ <color name="i_am_color_9cd">#000009cd</color>
+ <color name="i_am_color_9ce">#000009ce</color>
+ <color name="i_am_color_9cf">#000009cf</color>
+ <color name="i_am_color_9d0">#000009d0</color>
+ <color name="i_am_color_9d1">#000009d1</color>
+ <color name="i_am_color_9d2">#000009d2</color>
+ <color name="i_am_color_9d3">#000009d3</color>
+ <color name="i_am_color_9d4">#000009d4</color>
+ <color name="i_am_color_9d5">#000009d5</color>
+ <color name="i_am_color_9d6">#000009d6</color>
+ <color name="i_am_color_9d7">#000009d7</color>
+ <color name="i_am_color_9d8">#000009d8</color>
+ <color name="i_am_color_9d9">#000009d9</color>
+ <color name="i_am_color_9da">#000009da</color>
+ <color name="i_am_color_9db">#000009db</color>
+ <color name="i_am_color_9dc">#000009dc</color>
+ <color name="i_am_color_9dd">#000009dd</color>
+ <color name="i_am_color_9de">#000009de</color>
+ <color name="i_am_color_9df">#000009df</color>
+ <color name="i_am_color_9e0">#000009e0</color>
+ <color name="i_am_color_9e1">#000009e1</color>
+ <color name="i_am_color_9e2">#000009e2</color>
+ <color name="i_am_color_9e3">#000009e3</color>
+ <color name="i_am_color_9e4">#000009e4</color>
+ <color name="i_am_color_9e5">#000009e5</color>
+ <color name="i_am_color_9e6">#000009e6</color>
+ <color name="i_am_color_9e7">#000009e7</color>
+ <color name="i_am_color_9e8">#000009e8</color>
+ <color name="i_am_color_9e9">#000009e9</color>
+ <color name="i_am_color_9ea">#000009ea</color>
+ <color name="i_am_color_9eb">#000009eb</color>
+ <color name="i_am_color_9ec">#000009ec</color>
+ <color name="i_am_color_9ed">#000009ed</color>
+ <color name="i_am_color_9ee">#000009ee</color>
+ <color name="i_am_color_9ef">#000009ef</color>
+ <color name="i_am_color_9f0">#000009f0</color>
+ <color name="i_am_color_9f1">#000009f1</color>
+ <color name="i_am_color_9f2">#000009f2</color>
+ <color name="i_am_color_9f3">#000009f3</color>
+ <color name="i_am_color_9f4">#000009f4</color>
+ <color name="i_am_color_9f5">#000009f5</color>
+ <color name="i_am_color_9f6">#000009f6</color>
+ <color name="i_am_color_9f7">#000009f7</color>
+ <color name="i_am_color_9f8">#000009f8</color>
+ <color name="i_am_color_9f9">#000009f9</color>
+ <color name="i_am_color_9fa">#000009fa</color>
+ <color name="i_am_color_9fb">#000009fb</color>
+ <color name="i_am_color_9fc">#000009fc</color>
+ <color name="i_am_color_9fd">#000009fd</color>
+ <color name="i_am_color_9fe">#000009fe</color>
+ <color name="i_am_color_9ff">#000009ff</color>
+ <color name="i_am_color_a00">#00000a00</color>
+ <color name="i_am_color_a01">#00000a01</color>
+ <color name="i_am_color_a02">#00000a02</color>
+ <color name="i_am_color_a03">#00000a03</color>
+ <color name="i_am_color_a04">#00000a04</color>
+ <color name="i_am_color_a05">#00000a05</color>
+ <color name="i_am_color_a06">#00000a06</color>
+ <color name="i_am_color_a07">#00000a07</color>
+ <color name="i_am_color_a08">#00000a08</color>
+ <color name="i_am_color_a09">#00000a09</color>
+ <color name="i_am_color_a0a">#00000a0a</color>
+ <color name="i_am_color_a0b">#00000a0b</color>
+ <color name="i_am_color_a0c">#00000a0c</color>
+ <color name="i_am_color_a0d">#00000a0d</color>
+ <color name="i_am_color_a0e">#00000a0e</color>
+ <color name="i_am_color_a0f">#00000a0f</color>
+ <color name="i_am_color_a10">#00000a10</color>
+ <color name="i_am_color_a11">#00000a11</color>
+ <color name="i_am_color_a12">#00000a12</color>
+ <color name="i_am_color_a13">#00000a13</color>
+ <color name="i_am_color_a14">#00000a14</color>
+ <color name="i_am_color_a15">#00000a15</color>
+ <color name="i_am_color_a16">#00000a16</color>
+ <color name="i_am_color_a17">#00000a17</color>
+ <color name="i_am_color_a18">#00000a18</color>
+ <color name="i_am_color_a19">#00000a19</color>
+ <color name="i_am_color_a1a">#00000a1a</color>
+ <color name="i_am_color_a1b">#00000a1b</color>
+ <color name="i_am_color_a1c">#00000a1c</color>
+ <color name="i_am_color_a1d">#00000a1d</color>
+ <color name="i_am_color_a1e">#00000a1e</color>
+ <color name="i_am_color_a1f">#00000a1f</color>
+ <color name="i_am_color_a20">#00000a20</color>
+ <color name="i_am_color_a21">#00000a21</color>
+ <color name="i_am_color_a22">#00000a22</color>
+ <color name="i_am_color_a23">#00000a23</color>
+ <color name="i_am_color_a24">#00000a24</color>
+ <color name="i_am_color_a25">#00000a25</color>
+ <color name="i_am_color_a26">#00000a26</color>
+ <color name="i_am_color_a27">#00000a27</color>
+ <color name="i_am_color_a28">#00000a28</color>
+ <color name="i_am_color_a29">#00000a29</color>
+ <color name="i_am_color_a2a">#00000a2a</color>
+ <color name="i_am_color_a2b">#00000a2b</color>
+ <color name="i_am_color_a2c">#00000a2c</color>
+ <color name="i_am_color_a2d">#00000a2d</color>
+ <color name="i_am_color_a2e">#00000a2e</color>
+ <color name="i_am_color_a2f">#00000a2f</color>
+ <color name="i_am_color_a30">#00000a30</color>
+ <color name="i_am_color_a31">#00000a31</color>
+ <color name="i_am_color_a32">#00000a32</color>
+ <color name="i_am_color_a33">#00000a33</color>
+ <color name="i_am_color_a34">#00000a34</color>
+ <color name="i_am_color_a35">#00000a35</color>
+ <color name="i_am_color_a36">#00000a36</color>
+ <color name="i_am_color_a37">#00000a37</color>
+ <color name="i_am_color_a38">#00000a38</color>
+ <color name="i_am_color_a39">#00000a39</color>
+ <color name="i_am_color_a3a">#00000a3a</color>
+ <color name="i_am_color_a3b">#00000a3b</color>
+ <color name="i_am_color_a3c">#00000a3c</color>
+ <color name="i_am_color_a3d">#00000a3d</color>
+ <color name="i_am_color_a3e">#00000a3e</color>
+ <color name="i_am_color_a3f">#00000a3f</color>
+ <color name="i_am_color_a40">#00000a40</color>
+ <color name="i_am_color_a41">#00000a41</color>
+ <color name="i_am_color_a42">#00000a42</color>
+ <color name="i_am_color_a43">#00000a43</color>
+ <color name="i_am_color_a44">#00000a44</color>
+ <color name="i_am_color_a45">#00000a45</color>
+ <color name="i_am_color_a46">#00000a46</color>
+ <color name="i_am_color_a47">#00000a47</color>
+ <color name="i_am_color_a48">#00000a48</color>
+ <color name="i_am_color_a49">#00000a49</color>
+ <color name="i_am_color_a4a">#00000a4a</color>
+ <color name="i_am_color_a4b">#00000a4b</color>
+ <color name="i_am_color_a4c">#00000a4c</color>
+ <color name="i_am_color_a4d">#00000a4d</color>
+ <color name="i_am_color_a4e">#00000a4e</color>
+ <color name="i_am_color_a4f">#00000a4f</color>
+ <color name="i_am_color_a50">#00000a50</color>
+ <color name="i_am_color_a51">#00000a51</color>
+ <color name="i_am_color_a52">#00000a52</color>
+ <color name="i_am_color_a53">#00000a53</color>
+ <color name="i_am_color_a54">#00000a54</color>
+ <color name="i_am_color_a55">#00000a55</color>
+ <color name="i_am_color_a56">#00000a56</color>
+ <color name="i_am_color_a57">#00000a57</color>
+ <color name="i_am_color_a58">#00000a58</color>
+ <color name="i_am_color_a59">#00000a59</color>
+ <color name="i_am_color_a5a">#00000a5a</color>
+ <color name="i_am_color_a5b">#00000a5b</color>
+ <color name="i_am_color_a5c">#00000a5c</color>
+ <color name="i_am_color_a5d">#00000a5d</color>
+ <color name="i_am_color_a5e">#00000a5e</color>
+ <color name="i_am_color_a5f">#00000a5f</color>
+ <color name="i_am_color_a60">#00000a60</color>
+ <color name="i_am_color_a61">#00000a61</color>
+ <color name="i_am_color_a62">#00000a62</color>
+ <color name="i_am_color_a63">#00000a63</color>
+ <color name="i_am_color_a64">#00000a64</color>
+ <color name="i_am_color_a65">#00000a65</color>
+ <color name="i_am_color_a66">#00000a66</color>
+ <color name="i_am_color_a67">#00000a67</color>
+ <color name="i_am_color_a68">#00000a68</color>
+ <color name="i_am_color_a69">#00000a69</color>
+ <color name="i_am_color_a6a">#00000a6a</color>
+ <color name="i_am_color_a6b">#00000a6b</color>
+ <color name="i_am_color_a6c">#00000a6c</color>
+ <color name="i_am_color_a6d">#00000a6d</color>
+ <color name="i_am_color_a6e">#00000a6e</color>
+ <color name="i_am_color_a6f">#00000a6f</color>
+ <color name="i_am_color_a70">#00000a70</color>
+ <color name="i_am_color_a71">#00000a71</color>
+ <color name="i_am_color_a72">#00000a72</color>
+ <color name="i_am_color_a73">#00000a73</color>
+ <color name="i_am_color_a74">#00000a74</color>
+ <color name="i_am_color_a75">#00000a75</color>
+ <color name="i_am_color_a76">#00000a76</color>
+ <color name="i_am_color_a77">#00000a77</color>
+ <color name="i_am_color_a78">#00000a78</color>
+ <color name="i_am_color_a79">#00000a79</color>
+ <color name="i_am_color_a7a">#00000a7a</color>
+ <color name="i_am_color_a7b">#00000a7b</color>
+ <color name="i_am_color_a7c">#00000a7c</color>
+ <color name="i_am_color_a7d">#00000a7d</color>
+ <color name="i_am_color_a7e">#00000a7e</color>
+ <color name="i_am_color_a7f">#00000a7f</color>
+ <color name="i_am_color_a80">#00000a80</color>
+ <color name="i_am_color_a81">#00000a81</color>
+ <color name="i_am_color_a82">#00000a82</color>
+ <color name="i_am_color_a83">#00000a83</color>
+ <color name="i_am_color_a84">#00000a84</color>
+ <color name="i_am_color_a85">#00000a85</color>
+ <color name="i_am_color_a86">#00000a86</color>
+ <color name="i_am_color_a87">#00000a87</color>
+ <color name="i_am_color_a88">#00000a88</color>
+ <color name="i_am_color_a89">#00000a89</color>
+ <color name="i_am_color_a8a">#00000a8a</color>
+ <color name="i_am_color_a8b">#00000a8b</color>
+ <color name="i_am_color_a8c">#00000a8c</color>
+ <color name="i_am_color_a8d">#00000a8d</color>
+ <color name="i_am_color_a8e">#00000a8e</color>
+ <color name="i_am_color_a8f">#00000a8f</color>
+ <color name="i_am_color_a90">#00000a90</color>
+ <color name="i_am_color_a91">#00000a91</color>
+ <color name="i_am_color_a92">#00000a92</color>
+ <color name="i_am_color_a93">#00000a93</color>
+ <color name="i_am_color_a94">#00000a94</color>
+ <color name="i_am_color_a95">#00000a95</color>
+ <color name="i_am_color_a96">#00000a96</color>
+ <color name="i_am_color_a97">#00000a97</color>
+ <color name="i_am_color_a98">#00000a98</color>
+ <color name="i_am_color_a99">#00000a99</color>
+ <color name="i_am_color_a9a">#00000a9a</color>
+ <color name="i_am_color_a9b">#00000a9b</color>
+ <color name="i_am_color_a9c">#00000a9c</color>
+ <color name="i_am_color_a9d">#00000a9d</color>
+ <color name="i_am_color_a9e">#00000a9e</color>
+ <color name="i_am_color_a9f">#00000a9f</color>
+ <color name="i_am_color_aa0">#00000aa0</color>
+ <color name="i_am_color_aa1">#00000aa1</color>
+ <color name="i_am_color_aa2">#00000aa2</color>
+ <color name="i_am_color_aa3">#00000aa3</color>
+ <color name="i_am_color_aa4">#00000aa4</color>
+ <color name="i_am_color_aa5">#00000aa5</color>
+ <color name="i_am_color_aa6">#00000aa6</color>
+ <color name="i_am_color_aa7">#00000aa7</color>
+ <color name="i_am_color_aa8">#00000aa8</color>
+ <color name="i_am_color_aa9">#00000aa9</color>
+ <color name="i_am_color_aaa">#00000aaa</color>
+ <color name="i_am_color_aab">#00000aab</color>
+ <color name="i_am_color_aac">#00000aac</color>
+ <color name="i_am_color_aad">#00000aad</color>
+ <color name="i_am_color_aae">#00000aae</color>
+ <color name="i_am_color_aaf">#00000aaf</color>
+ <color name="i_am_color_ab0">#00000ab0</color>
+ <color name="i_am_color_ab1">#00000ab1</color>
+ <color name="i_am_color_ab2">#00000ab2</color>
+ <color name="i_am_color_ab3">#00000ab3</color>
+ <color name="i_am_color_ab4">#00000ab4</color>
+ <color name="i_am_color_ab5">#00000ab5</color>
+ <color name="i_am_color_ab6">#00000ab6</color>
+ <color name="i_am_color_ab7">#00000ab7</color>
+ <color name="i_am_color_ab8">#00000ab8</color>
+ <color name="i_am_color_ab9">#00000ab9</color>
+ <color name="i_am_color_aba">#00000aba</color>
+ <color name="i_am_color_abb">#00000abb</color>
+ <color name="i_am_color_abc">#00000abc</color>
+ <color name="i_am_color_abd">#00000abd</color>
+ <color name="i_am_color_abe">#00000abe</color>
+ <color name="i_am_color_abf">#00000abf</color>
+ <color name="i_am_color_ac0">#00000ac0</color>
+ <color name="i_am_color_ac1">#00000ac1</color>
+ <color name="i_am_color_ac2">#00000ac2</color>
+ <color name="i_am_color_ac3">#00000ac3</color>
+ <color name="i_am_color_ac4">#00000ac4</color>
+ <color name="i_am_color_ac5">#00000ac5</color>
+ <color name="i_am_color_ac6">#00000ac6</color>
+ <color name="i_am_color_ac7">#00000ac7</color>
+ <color name="i_am_color_ac8">#00000ac8</color>
+ <color name="i_am_color_ac9">#00000ac9</color>
+ <color name="i_am_color_aca">#00000aca</color>
+ <color name="i_am_color_acb">#00000acb</color>
+ <color name="i_am_color_acc">#00000acc</color>
+ <color name="i_am_color_acd">#00000acd</color>
+ <color name="i_am_color_ace">#00000ace</color>
+ <color name="i_am_color_acf">#00000acf</color>
+ <color name="i_am_color_ad0">#00000ad0</color>
+ <color name="i_am_color_ad1">#00000ad1</color>
+ <color name="i_am_color_ad2">#00000ad2</color>
+ <color name="i_am_color_ad3">#00000ad3</color>
+ <color name="i_am_color_ad4">#00000ad4</color>
+ <color name="i_am_color_ad5">#00000ad5</color>
+ <color name="i_am_color_ad6">#00000ad6</color>
+ <color name="i_am_color_ad7">#00000ad7</color>
+ <color name="i_am_color_ad8">#00000ad8</color>
+ <color name="i_am_color_ad9">#00000ad9</color>
+ <color name="i_am_color_ada">#00000ada</color>
+ <color name="i_am_color_adb">#00000adb</color>
+ <color name="i_am_color_adc">#00000adc</color>
+ <color name="i_am_color_add">#00000add</color>
+ <color name="i_am_color_ade">#00000ade</color>
+ <color name="i_am_color_adf">#00000adf</color>
+ <color name="i_am_color_ae0">#00000ae0</color>
+ <color name="i_am_color_ae1">#00000ae1</color>
+ <color name="i_am_color_ae2">#00000ae2</color>
+ <color name="i_am_color_ae3">#00000ae3</color>
+ <color name="i_am_color_ae4">#00000ae4</color>
+ <color name="i_am_color_ae5">#00000ae5</color>
+ <color name="i_am_color_ae6">#00000ae6</color>
+ <color name="i_am_color_ae7">#00000ae7</color>
+ <color name="i_am_color_ae8">#00000ae8</color>
+ <color name="i_am_color_ae9">#00000ae9</color>
+ <color name="i_am_color_aea">#00000aea</color>
+ <color name="i_am_color_aeb">#00000aeb</color>
+ <color name="i_am_color_aec">#00000aec</color>
+ <color name="i_am_color_aed">#00000aed</color>
+ <color name="i_am_color_aee">#00000aee</color>
+ <color name="i_am_color_aef">#00000aef</color>
+ <color name="i_am_color_af0">#00000af0</color>
+ <color name="i_am_color_af1">#00000af1</color>
+ <color name="i_am_color_af2">#00000af2</color>
+ <color name="i_am_color_af3">#00000af3</color>
+ <color name="i_am_color_af4">#00000af4</color>
+ <color name="i_am_color_af5">#00000af5</color>
+ <color name="i_am_color_af6">#00000af6</color>
+ <color name="i_am_color_af7">#00000af7</color>
+ <color name="i_am_color_af8">#00000af8</color>
+ <color name="i_am_color_af9">#00000af9</color>
+ <color name="i_am_color_afa">#00000afa</color>
+ <color name="i_am_color_afb">#00000afb</color>
+ <color name="i_am_color_afc">#00000afc</color>
+ <color name="i_am_color_afd">#00000afd</color>
+ <color name="i_am_color_afe">#00000afe</color>
+ <color name="i_am_color_aff">#00000aff</color>
+ <color name="i_am_color_b00">#00000b00</color>
+ <color name="i_am_color_b01">#00000b01</color>
+ <color name="i_am_color_b02">#00000b02</color>
+ <color name="i_am_color_b03">#00000b03</color>
+ <color name="i_am_color_b04">#00000b04</color>
+ <color name="i_am_color_b05">#00000b05</color>
+ <color name="i_am_color_b06">#00000b06</color>
+ <color name="i_am_color_b07">#00000b07</color>
+ <color name="i_am_color_b08">#00000b08</color>
+ <color name="i_am_color_b09">#00000b09</color>
+ <color name="i_am_color_b0a">#00000b0a</color>
+ <color name="i_am_color_b0b">#00000b0b</color>
+ <color name="i_am_color_b0c">#00000b0c</color>
+ <color name="i_am_color_b0d">#00000b0d</color>
+ <color name="i_am_color_b0e">#00000b0e</color>
+ <color name="i_am_color_b0f">#00000b0f</color>
+ <color name="i_am_color_b10">#00000b10</color>
+ <color name="i_am_color_b11">#00000b11</color>
+ <color name="i_am_color_b12">#00000b12</color>
+ <color name="i_am_color_b13">#00000b13</color>
+ <color name="i_am_color_b14">#00000b14</color>
+ <color name="i_am_color_b15">#00000b15</color>
+ <color name="i_am_color_b16">#00000b16</color>
+ <color name="i_am_color_b17">#00000b17</color>
+ <color name="i_am_color_b18">#00000b18</color>
+ <color name="i_am_color_b19">#00000b19</color>
+ <color name="i_am_color_b1a">#00000b1a</color>
+ <color name="i_am_color_b1b">#00000b1b</color>
+ <color name="i_am_color_b1c">#00000b1c</color>
+ <color name="i_am_color_b1d">#00000b1d</color>
+ <color name="i_am_color_b1e">#00000b1e</color>
+ <color name="i_am_color_b1f">#00000b1f</color>
+ <color name="i_am_color_b20">#00000b20</color>
+ <color name="i_am_color_b21">#00000b21</color>
+ <color name="i_am_color_b22">#00000b22</color>
+ <color name="i_am_color_b23">#00000b23</color>
+ <color name="i_am_color_b24">#00000b24</color>
+ <color name="i_am_color_b25">#00000b25</color>
+ <color name="i_am_color_b26">#00000b26</color>
+ <color name="i_am_color_b27">#00000b27</color>
+ <color name="i_am_color_b28">#00000b28</color>
+ <color name="i_am_color_b29">#00000b29</color>
+ <color name="i_am_color_b2a">#00000b2a</color>
+ <color name="i_am_color_b2b">#00000b2b</color>
+ <color name="i_am_color_b2c">#00000b2c</color>
+ <color name="i_am_color_b2d">#00000b2d</color>
+ <color name="i_am_color_b2e">#00000b2e</color>
+ <color name="i_am_color_b2f">#00000b2f</color>
+ <color name="i_am_color_b30">#00000b30</color>
+ <color name="i_am_color_b31">#00000b31</color>
+ <color name="i_am_color_b32">#00000b32</color>
+ <color name="i_am_color_b33">#00000b33</color>
+ <color name="i_am_color_b34">#00000b34</color>
+ <color name="i_am_color_b35">#00000b35</color>
+ <color name="i_am_color_b36">#00000b36</color>
+ <color name="i_am_color_b37">#00000b37</color>
+ <color name="i_am_color_b38">#00000b38</color>
+ <color name="i_am_color_b39">#00000b39</color>
+ <color name="i_am_color_b3a">#00000b3a</color>
+ <color name="i_am_color_b3b">#00000b3b</color>
+ <color name="i_am_color_b3c">#00000b3c</color>
+ <color name="i_am_color_b3d">#00000b3d</color>
+ <color name="i_am_color_b3e">#00000b3e</color>
+ <color name="i_am_color_b3f">#00000b3f</color>
+ <color name="i_am_color_b40">#00000b40</color>
+ <color name="i_am_color_b41">#00000b41</color>
+ <color name="i_am_color_b42">#00000b42</color>
+ <color name="i_am_color_b43">#00000b43</color>
+ <color name="i_am_color_b44">#00000b44</color>
+ <color name="i_am_color_b45">#00000b45</color>
+ <color name="i_am_color_b46">#00000b46</color>
+ <color name="i_am_color_b47">#00000b47</color>
+ <color name="i_am_color_b48">#00000b48</color>
+ <color name="i_am_color_b49">#00000b49</color>
+ <color name="i_am_color_b4a">#00000b4a</color>
+ <color name="i_am_color_b4b">#00000b4b</color>
+ <color name="i_am_color_b4c">#00000b4c</color>
+ <color name="i_am_color_b4d">#00000b4d</color>
+ <color name="i_am_color_b4e">#00000b4e</color>
+ <color name="i_am_color_b4f">#00000b4f</color>
+ <color name="i_am_color_b50">#00000b50</color>
+ <color name="i_am_color_b51">#00000b51</color>
+ <color name="i_am_color_b52">#00000b52</color>
+ <color name="i_am_color_b53">#00000b53</color>
+ <color name="i_am_color_b54">#00000b54</color>
+ <color name="i_am_color_b55">#00000b55</color>
+ <color name="i_am_color_b56">#00000b56</color>
+ <color name="i_am_color_b57">#00000b57</color>
+ <color name="i_am_color_b58">#00000b58</color>
+ <color name="i_am_color_b59">#00000b59</color>
+ <color name="i_am_color_b5a">#00000b5a</color>
+ <color name="i_am_color_b5b">#00000b5b</color>
+ <color name="i_am_color_b5c">#00000b5c</color>
+ <color name="i_am_color_b5d">#00000b5d</color>
+ <color name="i_am_color_b5e">#00000b5e</color>
+ <color name="i_am_color_b5f">#00000b5f</color>
+ <color name="i_am_color_b60">#00000b60</color>
+ <color name="i_am_color_b61">#00000b61</color>
+ <color name="i_am_color_b62">#00000b62</color>
+ <color name="i_am_color_b63">#00000b63</color>
+ <color name="i_am_color_b64">#00000b64</color>
+ <color name="i_am_color_b65">#00000b65</color>
+ <color name="i_am_color_b66">#00000b66</color>
+ <color name="i_am_color_b67">#00000b67</color>
+ <color name="i_am_color_b68">#00000b68</color>
+ <color name="i_am_color_b69">#00000b69</color>
+ <color name="i_am_color_b6a">#00000b6a</color>
+ <color name="i_am_color_b6b">#00000b6b</color>
+ <color name="i_am_color_b6c">#00000b6c</color>
+ <color name="i_am_color_b6d">#00000b6d</color>
+ <color name="i_am_color_b6e">#00000b6e</color>
+ <color name="i_am_color_b6f">#00000b6f</color>
+ <color name="i_am_color_b70">#00000b70</color>
+ <color name="i_am_color_b71">#00000b71</color>
+ <color name="i_am_color_b72">#00000b72</color>
+ <color name="i_am_color_b73">#00000b73</color>
+ <color name="i_am_color_b74">#00000b74</color>
+ <color name="i_am_color_b75">#00000b75</color>
+ <color name="i_am_color_b76">#00000b76</color>
+ <color name="i_am_color_b77">#00000b77</color>
+ <color name="i_am_color_b78">#00000b78</color>
+ <color name="i_am_color_b79">#00000b79</color>
+ <color name="i_am_color_b7a">#00000b7a</color>
+ <color name="i_am_color_b7b">#00000b7b</color>
+ <color name="i_am_color_b7c">#00000b7c</color>
+ <color name="i_am_color_b7d">#00000b7d</color>
+ <color name="i_am_color_b7e">#00000b7e</color>
+ <color name="i_am_color_b7f">#00000b7f</color>
+ <color name="i_am_color_b80">#00000b80</color>
+ <color name="i_am_color_b81">#00000b81</color>
+ <color name="i_am_color_b82">#00000b82</color>
+ <color name="i_am_color_b83">#00000b83</color>
+ <color name="i_am_color_b84">#00000b84</color>
+ <color name="i_am_color_b85">#00000b85</color>
+ <color name="i_am_color_b86">#00000b86</color>
+ <color name="i_am_color_b87">#00000b87</color>
+ <color name="i_am_color_b88">#00000b88</color>
+ <color name="i_am_color_b89">#00000b89</color>
+ <color name="i_am_color_b8a">#00000b8a</color>
+ <color name="i_am_color_b8b">#00000b8b</color>
+ <color name="i_am_color_b8c">#00000b8c</color>
+ <color name="i_am_color_b8d">#00000b8d</color>
+ <color name="i_am_color_b8e">#00000b8e</color>
+ <color name="i_am_color_b8f">#00000b8f</color>
+ <color name="i_am_color_b90">#00000b90</color>
+ <color name="i_am_color_b91">#00000b91</color>
+ <color name="i_am_color_b92">#00000b92</color>
+ <color name="i_am_color_b93">#00000b93</color>
+ <color name="i_am_color_b94">#00000b94</color>
+ <color name="i_am_color_b95">#00000b95</color>
+ <color name="i_am_color_b96">#00000b96</color>
+ <color name="i_am_color_b97">#00000b97</color>
+ <color name="i_am_color_b98">#00000b98</color>
+ <color name="i_am_color_b99">#00000b99</color>
+ <color name="i_am_color_b9a">#00000b9a</color>
+ <color name="i_am_color_b9b">#00000b9b</color>
+ <color name="i_am_color_b9c">#00000b9c</color>
+ <color name="i_am_color_b9d">#00000b9d</color>
+ <color name="i_am_color_b9e">#00000b9e</color>
+ <color name="i_am_color_b9f">#00000b9f</color>
+ <color name="i_am_color_ba0">#00000ba0</color>
+ <color name="i_am_color_ba1">#00000ba1</color>
+ <color name="i_am_color_ba2">#00000ba2</color>
+ <color name="i_am_color_ba3">#00000ba3</color>
+ <color name="i_am_color_ba4">#00000ba4</color>
+ <color name="i_am_color_ba5">#00000ba5</color>
+ <color name="i_am_color_ba6">#00000ba6</color>
+ <color name="i_am_color_ba7">#00000ba7</color>
+ <color name="i_am_color_ba8">#00000ba8</color>
+ <color name="i_am_color_ba9">#00000ba9</color>
+ <color name="i_am_color_baa">#00000baa</color>
+ <color name="i_am_color_bab">#00000bab</color>
+ <color name="i_am_color_bac">#00000bac</color>
+ <color name="i_am_color_bad">#00000bad</color>
+ <color name="i_am_color_bae">#00000bae</color>
+ <color name="i_am_color_baf">#00000baf</color>
+ <color name="i_am_color_bb0">#00000bb0</color>
+ <color name="i_am_color_bb1">#00000bb1</color>
+ <color name="i_am_color_bb2">#00000bb2</color>
+ <color name="i_am_color_bb3">#00000bb3</color>
+ <color name="i_am_color_bb4">#00000bb4</color>
+ <color name="i_am_color_bb5">#00000bb5</color>
+ <color name="i_am_color_bb6">#00000bb6</color>
+ <color name="i_am_color_bb7">#00000bb7</color>
+ <color name="i_am_color_bb8">#00000bb8</color>
+ <color name="i_am_color_bb9">#00000bb9</color>
+ <color name="i_am_color_bba">#00000bba</color>
+ <color name="i_am_color_bbb">#00000bbb</color>
+ <color name="i_am_color_bbc">#00000bbc</color>
+ <color name="i_am_color_bbd">#00000bbd</color>
+ <color name="i_am_color_bbe">#00000bbe</color>
+ <color name="i_am_color_bbf">#00000bbf</color>
+ <color name="i_am_color_bc0">#00000bc0</color>
+ <color name="i_am_color_bc1">#00000bc1</color>
+ <color name="i_am_color_bc2">#00000bc2</color>
+ <color name="i_am_color_bc3">#00000bc3</color>
+ <color name="i_am_color_bc4">#00000bc4</color>
+ <color name="i_am_color_bc5">#00000bc5</color>
+ <color name="i_am_color_bc6">#00000bc6</color>
+ <color name="i_am_color_bc7">#00000bc7</color>
+ <color name="i_am_color_bc8">#00000bc8</color>
+ <color name="i_am_color_bc9">#00000bc9</color>
+ <color name="i_am_color_bca">#00000bca</color>
+ <color name="i_am_color_bcb">#00000bcb</color>
+ <color name="i_am_color_bcc">#00000bcc</color>
+ <color name="i_am_color_bcd">#00000bcd</color>
+ <color name="i_am_color_bce">#00000bce</color>
+ <color name="i_am_color_bcf">#00000bcf</color>
+ <color name="i_am_color_bd0">#00000bd0</color>
+ <color name="i_am_color_bd1">#00000bd1</color>
+ <color name="i_am_color_bd2">#00000bd2</color>
+ <color name="i_am_color_bd3">#00000bd3</color>
+ <color name="i_am_color_bd4">#00000bd4</color>
+ <color name="i_am_color_bd5">#00000bd5</color>
+ <color name="i_am_color_bd6">#00000bd6</color>
+ <color name="i_am_color_bd7">#00000bd7</color>
+ <color name="i_am_color_bd8">#00000bd8</color>
+ <color name="i_am_color_bd9">#00000bd9</color>
+ <color name="i_am_color_bda">#00000bda</color>
+ <color name="i_am_color_bdb">#00000bdb</color>
+ <color name="i_am_color_bdc">#00000bdc</color>
+ <color name="i_am_color_bdd">#00000bdd</color>
+ <color name="i_am_color_bde">#00000bde</color>
+ <color name="i_am_color_bdf">#00000bdf</color>
+ <color name="i_am_color_be0">#00000be0</color>
+ <color name="i_am_color_be1">#00000be1</color>
+ <color name="i_am_color_be2">#00000be2</color>
+ <color name="i_am_color_be3">#00000be3</color>
+ <color name="i_am_color_be4">#00000be4</color>
+ <color name="i_am_color_be5">#00000be5</color>
+ <color name="i_am_color_be6">#00000be6</color>
+ <color name="i_am_color_be7">#00000be7</color>
+ <color name="i_am_color_be8">#00000be8</color>
+ <color name="i_am_color_be9">#00000be9</color>
+ <color name="i_am_color_bea">#00000bea</color>
+ <color name="i_am_color_beb">#00000beb</color>
+ <color name="i_am_color_bec">#00000bec</color>
+ <color name="i_am_color_bed">#00000bed</color>
+ <color name="i_am_color_bee">#00000bee</color>
+ <color name="i_am_color_bef">#00000bef</color>
+ <color name="i_am_color_bf0">#00000bf0</color>
+ <color name="i_am_color_bf1">#00000bf1</color>
+ <color name="i_am_color_bf2">#00000bf2</color>
+ <color name="i_am_color_bf3">#00000bf3</color>
+ <color name="i_am_color_bf4">#00000bf4</color>
+ <color name="i_am_color_bf5">#00000bf5</color>
+ <color name="i_am_color_bf6">#00000bf6</color>
+ <color name="i_am_color_bf7">#00000bf7</color>
+ <color name="i_am_color_bf8">#00000bf8</color>
+ <color name="i_am_color_bf9">#00000bf9</color>
+ <color name="i_am_color_bfa">#00000bfa</color>
+ <color name="i_am_color_bfb">#00000bfb</color>
+ <color name="i_am_color_bfc">#00000bfc</color>
+ <color name="i_am_color_bfd">#00000bfd</color>
+ <color name="i_am_color_bfe">#00000bfe</color>
+ <color name="i_am_color_bff">#00000bff</color>
+ <color name="i_am_color_c00">#00000c00</color>
+ <color name="i_am_color_c01">#00000c01</color>
+ <color name="i_am_color_c02">#00000c02</color>
+ <color name="i_am_color_c03">#00000c03</color>
+ <color name="i_am_color_c04">#00000c04</color>
+ <color name="i_am_color_c05">#00000c05</color>
+ <color name="i_am_color_c06">#00000c06</color>
+ <color name="i_am_color_c07">#00000c07</color>
+ <color name="i_am_color_c08">#00000c08</color>
+ <color name="i_am_color_c09">#00000c09</color>
+ <color name="i_am_color_c0a">#00000c0a</color>
+ <color name="i_am_color_c0b">#00000c0b</color>
+ <color name="i_am_color_c0c">#00000c0c</color>
+ <color name="i_am_color_c0d">#00000c0d</color>
+ <color name="i_am_color_c0e">#00000c0e</color>
+ <color name="i_am_color_c0f">#00000c0f</color>
+ <color name="i_am_color_c10">#00000c10</color>
+ <color name="i_am_color_c11">#00000c11</color>
+ <color name="i_am_color_c12">#00000c12</color>
+ <color name="i_am_color_c13">#00000c13</color>
+ <color name="i_am_color_c14">#00000c14</color>
+ <color name="i_am_color_c15">#00000c15</color>
+ <color name="i_am_color_c16">#00000c16</color>
+ <color name="i_am_color_c17">#00000c17</color>
+ <color name="i_am_color_c18">#00000c18</color>
+ <color name="i_am_color_c19">#00000c19</color>
+ <color name="i_am_color_c1a">#00000c1a</color>
+ <color name="i_am_color_c1b">#00000c1b</color>
+ <color name="i_am_color_c1c">#00000c1c</color>
+ <color name="i_am_color_c1d">#00000c1d</color>
+ <color name="i_am_color_c1e">#00000c1e</color>
+ <color name="i_am_color_c1f">#00000c1f</color>
+ <color name="i_am_color_c20">#00000c20</color>
+ <color name="i_am_color_c21">#00000c21</color>
+ <color name="i_am_color_c22">#00000c22</color>
+ <color name="i_am_color_c23">#00000c23</color>
+ <color name="i_am_color_c24">#00000c24</color>
+ <color name="i_am_color_c25">#00000c25</color>
+ <color name="i_am_color_c26">#00000c26</color>
+ <color name="i_am_color_c27">#00000c27</color>
+ <color name="i_am_color_c28">#00000c28</color>
+ <color name="i_am_color_c29">#00000c29</color>
+ <color name="i_am_color_c2a">#00000c2a</color>
+ <color name="i_am_color_c2b">#00000c2b</color>
+ <color name="i_am_color_c2c">#00000c2c</color>
+ <color name="i_am_color_c2d">#00000c2d</color>
+ <color name="i_am_color_c2e">#00000c2e</color>
+ <color name="i_am_color_c2f">#00000c2f</color>
+ <color name="i_am_color_c30">#00000c30</color>
+ <color name="i_am_color_c31">#00000c31</color>
+ <color name="i_am_color_c32">#00000c32</color>
+ <color name="i_am_color_c33">#00000c33</color>
+ <color name="i_am_color_c34">#00000c34</color>
+ <color name="i_am_color_c35">#00000c35</color>
+ <color name="i_am_color_c36">#00000c36</color>
+ <color name="i_am_color_c37">#00000c37</color>
+ <color name="i_am_color_c38">#00000c38</color>
+ <color name="i_am_color_c39">#00000c39</color>
+ <color name="i_am_color_c3a">#00000c3a</color>
+ <color name="i_am_color_c3b">#00000c3b</color>
+ <color name="i_am_color_c3c">#00000c3c</color>
+ <color name="i_am_color_c3d">#00000c3d</color>
+ <color name="i_am_color_c3e">#00000c3e</color>
+ <color name="i_am_color_c3f">#00000c3f</color>
+ <color name="i_am_color_c40">#00000c40</color>
+ <color name="i_am_color_c41">#00000c41</color>
+ <color name="i_am_color_c42">#00000c42</color>
+ <color name="i_am_color_c43">#00000c43</color>
+ <color name="i_am_color_c44">#00000c44</color>
+ <color name="i_am_color_c45">#00000c45</color>
+ <color name="i_am_color_c46">#00000c46</color>
+ <color name="i_am_color_c47">#00000c47</color>
+ <color name="i_am_color_c48">#00000c48</color>
+ <color name="i_am_color_c49">#00000c49</color>
+ <color name="i_am_color_c4a">#00000c4a</color>
+ <color name="i_am_color_c4b">#00000c4b</color>
+ <color name="i_am_color_c4c">#00000c4c</color>
+ <color name="i_am_color_c4d">#00000c4d</color>
+ <color name="i_am_color_c4e">#00000c4e</color>
+ <color name="i_am_color_c4f">#00000c4f</color>
+ <color name="i_am_color_c50">#00000c50</color>
+ <color name="i_am_color_c51">#00000c51</color>
+ <color name="i_am_color_c52">#00000c52</color>
+ <color name="i_am_color_c53">#00000c53</color>
+ <color name="i_am_color_c54">#00000c54</color>
+ <color name="i_am_color_c55">#00000c55</color>
+ <color name="i_am_color_c56">#00000c56</color>
+ <color name="i_am_color_c57">#00000c57</color>
+ <color name="i_am_color_c58">#00000c58</color>
+ <color name="i_am_color_c59">#00000c59</color>
+ <color name="i_am_color_c5a">#00000c5a</color>
+ <color name="i_am_color_c5b">#00000c5b</color>
+ <color name="i_am_color_c5c">#00000c5c</color>
+ <color name="i_am_color_c5d">#00000c5d</color>
+ <color name="i_am_color_c5e">#00000c5e</color>
+ <color name="i_am_color_c5f">#00000c5f</color>
+ <color name="i_am_color_c60">#00000c60</color>
+ <color name="i_am_color_c61">#00000c61</color>
+ <color name="i_am_color_c62">#00000c62</color>
+ <color name="i_am_color_c63">#00000c63</color>
+ <color name="i_am_color_c64">#00000c64</color>
+ <color name="i_am_color_c65">#00000c65</color>
+ <color name="i_am_color_c66">#00000c66</color>
+ <color name="i_am_color_c67">#00000c67</color>
+ <color name="i_am_color_c68">#00000c68</color>
+ <color name="i_am_color_c69">#00000c69</color>
+ <color name="i_am_color_c6a">#00000c6a</color>
+ <color name="i_am_color_c6b">#00000c6b</color>
+ <color name="i_am_color_c6c">#00000c6c</color>
+ <color name="i_am_color_c6d">#00000c6d</color>
+ <color name="i_am_color_c6e">#00000c6e</color>
+ <color name="i_am_color_c6f">#00000c6f</color>
+ <color name="i_am_color_c70">#00000c70</color>
+ <color name="i_am_color_c71">#00000c71</color>
+ <color name="i_am_color_c72">#00000c72</color>
+ <color name="i_am_color_c73">#00000c73</color>
+ <color name="i_am_color_c74">#00000c74</color>
+ <color name="i_am_color_c75">#00000c75</color>
+ <color name="i_am_color_c76">#00000c76</color>
+ <color name="i_am_color_c77">#00000c77</color>
+ <color name="i_am_color_c78">#00000c78</color>
+ <color name="i_am_color_c79">#00000c79</color>
+ <color name="i_am_color_c7a">#00000c7a</color>
+ <color name="i_am_color_c7b">#00000c7b</color>
+ <color name="i_am_color_c7c">#00000c7c</color>
+ <color name="i_am_color_c7d">#00000c7d</color>
+ <color name="i_am_color_c7e">#00000c7e</color>
+ <color name="i_am_color_c7f">#00000c7f</color>
+ <color name="i_am_color_c80">#00000c80</color>
+ <color name="i_am_color_c81">#00000c81</color>
+ <color name="i_am_color_c82">#00000c82</color>
+ <color name="i_am_color_c83">#00000c83</color>
+ <color name="i_am_color_c84">#00000c84</color>
+ <color name="i_am_color_c85">#00000c85</color>
+ <color name="i_am_color_c86">#00000c86</color>
+ <color name="i_am_color_c87">#00000c87</color>
+ <color name="i_am_color_c88">#00000c88</color>
+ <color name="i_am_color_c89">#00000c89</color>
+ <color name="i_am_color_c8a">#00000c8a</color>
+ <color name="i_am_color_c8b">#00000c8b</color>
+ <color name="i_am_color_c8c">#00000c8c</color>
+ <color name="i_am_color_c8d">#00000c8d</color>
+ <color name="i_am_color_c8e">#00000c8e</color>
+ <color name="i_am_color_c8f">#00000c8f</color>
+ <color name="i_am_color_c90">#00000c90</color>
+ <color name="i_am_color_c91">#00000c91</color>
+ <color name="i_am_color_c92">#00000c92</color>
+ <color name="i_am_color_c93">#00000c93</color>
+ <color name="i_am_color_c94">#00000c94</color>
+ <color name="i_am_color_c95">#00000c95</color>
+ <color name="i_am_color_c96">#00000c96</color>
+ <color name="i_am_color_c97">#00000c97</color>
+ <color name="i_am_color_c98">#00000c98</color>
+ <color name="i_am_color_c99">#00000c99</color>
+ <color name="i_am_color_c9a">#00000c9a</color>
+ <color name="i_am_color_c9b">#00000c9b</color>
+ <color name="i_am_color_c9c">#00000c9c</color>
+ <color name="i_am_color_c9d">#00000c9d</color>
+ <color name="i_am_color_c9e">#00000c9e</color>
+ <color name="i_am_color_c9f">#00000c9f</color>
+ <color name="i_am_color_ca0">#00000ca0</color>
+ <color name="i_am_color_ca1">#00000ca1</color>
+ <color name="i_am_color_ca2">#00000ca2</color>
+ <color name="i_am_color_ca3">#00000ca3</color>
+ <color name="i_am_color_ca4">#00000ca4</color>
+ <color name="i_am_color_ca5">#00000ca5</color>
+ <color name="i_am_color_ca6">#00000ca6</color>
+ <color name="i_am_color_ca7">#00000ca7</color>
+ <color name="i_am_color_ca8">#00000ca8</color>
+ <color name="i_am_color_ca9">#00000ca9</color>
+ <color name="i_am_color_caa">#00000caa</color>
+ <color name="i_am_color_cab">#00000cab</color>
+ <color name="i_am_color_cac">#00000cac</color>
+ <color name="i_am_color_cad">#00000cad</color>
+ <color name="i_am_color_cae">#00000cae</color>
+ <color name="i_am_color_caf">#00000caf</color>
+ <color name="i_am_color_cb0">#00000cb0</color>
+ <color name="i_am_color_cb1">#00000cb1</color>
+ <color name="i_am_color_cb2">#00000cb2</color>
+ <color name="i_am_color_cb3">#00000cb3</color>
+ <color name="i_am_color_cb4">#00000cb4</color>
+ <color name="i_am_color_cb5">#00000cb5</color>
+ <color name="i_am_color_cb6">#00000cb6</color>
+ <color name="i_am_color_cb7">#00000cb7</color>
+ <color name="i_am_color_cb8">#00000cb8</color>
+ <color name="i_am_color_cb9">#00000cb9</color>
+ <color name="i_am_color_cba">#00000cba</color>
+ <color name="i_am_color_cbb">#00000cbb</color>
+ <color name="i_am_color_cbc">#00000cbc</color>
+ <color name="i_am_color_cbd">#00000cbd</color>
+ <color name="i_am_color_cbe">#00000cbe</color>
+ <color name="i_am_color_cbf">#00000cbf</color>
+ <color name="i_am_color_cc0">#00000cc0</color>
+ <color name="i_am_color_cc1">#00000cc1</color>
+ <color name="i_am_color_cc2">#00000cc2</color>
+ <color name="i_am_color_cc3">#00000cc3</color>
+ <color name="i_am_color_cc4">#00000cc4</color>
+ <color name="i_am_color_cc5">#00000cc5</color>
+ <color name="i_am_color_cc6">#00000cc6</color>
+ <color name="i_am_color_cc7">#00000cc7</color>
+ <color name="i_am_color_cc8">#00000cc8</color>
+ <color name="i_am_color_cc9">#00000cc9</color>
+ <color name="i_am_color_cca">#00000cca</color>
+ <color name="i_am_color_ccb">#00000ccb</color>
+ <color name="i_am_color_ccc">#00000ccc</color>
+ <color name="i_am_color_ccd">#00000ccd</color>
+ <color name="i_am_color_cce">#00000cce</color>
+ <color name="i_am_color_ccf">#00000ccf</color>
+ <color name="i_am_color_cd0">#00000cd0</color>
+ <color name="i_am_color_cd1">#00000cd1</color>
+ <color name="i_am_color_cd2">#00000cd2</color>
+ <color name="i_am_color_cd3">#00000cd3</color>
+ <color name="i_am_color_cd4">#00000cd4</color>
+ <color name="i_am_color_cd5">#00000cd5</color>
+ <color name="i_am_color_cd6">#00000cd6</color>
+ <color name="i_am_color_cd7">#00000cd7</color>
+ <color name="i_am_color_cd8">#00000cd8</color>
+ <color name="i_am_color_cd9">#00000cd9</color>
+ <color name="i_am_color_cda">#00000cda</color>
+ <color name="i_am_color_cdb">#00000cdb</color>
+ <color name="i_am_color_cdc">#00000cdc</color>
+ <color name="i_am_color_cdd">#00000cdd</color>
+ <color name="i_am_color_cde">#00000cde</color>
+ <color name="i_am_color_cdf">#00000cdf</color>
+ <color name="i_am_color_ce0">#00000ce0</color>
+ <color name="i_am_color_ce1">#00000ce1</color>
+ <color name="i_am_color_ce2">#00000ce2</color>
+ <color name="i_am_color_ce3">#00000ce3</color>
+ <color name="i_am_color_ce4">#00000ce4</color>
+ <color name="i_am_color_ce5">#00000ce5</color>
+ <color name="i_am_color_ce6">#00000ce6</color>
+ <color name="i_am_color_ce7">#00000ce7</color>
+ <color name="i_am_color_ce8">#00000ce8</color>
+ <color name="i_am_color_ce9">#00000ce9</color>
+ <color name="i_am_color_cea">#00000cea</color>
+ <color name="i_am_color_ceb">#00000ceb</color>
+ <color name="i_am_color_cec">#00000cec</color>
+ <color name="i_am_color_ced">#00000ced</color>
+ <color name="i_am_color_cee">#00000cee</color>
+ <color name="i_am_color_cef">#00000cef</color>
+ <color name="i_am_color_cf0">#00000cf0</color>
+ <color name="i_am_color_cf1">#00000cf1</color>
+ <color name="i_am_color_cf2">#00000cf2</color>
+ <color name="i_am_color_cf3">#00000cf3</color>
+ <color name="i_am_color_cf4">#00000cf4</color>
+ <color name="i_am_color_cf5">#00000cf5</color>
+ <color name="i_am_color_cf6">#00000cf6</color>
+ <color name="i_am_color_cf7">#00000cf7</color>
+ <color name="i_am_color_cf8">#00000cf8</color>
+ <color name="i_am_color_cf9">#00000cf9</color>
+ <color name="i_am_color_cfa">#00000cfa</color>
+ <color name="i_am_color_cfb">#00000cfb</color>
+ <color name="i_am_color_cfc">#00000cfc</color>
+ <color name="i_am_color_cfd">#00000cfd</color>
+ <color name="i_am_color_cfe">#00000cfe</color>
+ <color name="i_am_color_cff">#00000cff</color>
+ <color name="i_am_color_d00">#00000d00</color>
+ <color name="i_am_color_d01">#00000d01</color>
+ <color name="i_am_color_d02">#00000d02</color>
+ <color name="i_am_color_d03">#00000d03</color>
+ <color name="i_am_color_d04">#00000d04</color>
+ <color name="i_am_color_d05">#00000d05</color>
+ <color name="i_am_color_d06">#00000d06</color>
+ <color name="i_am_color_d07">#00000d07</color>
+ <color name="i_am_color_d08">#00000d08</color>
+ <color name="i_am_color_d09">#00000d09</color>
+ <color name="i_am_color_d0a">#00000d0a</color>
+ <color name="i_am_color_d0b">#00000d0b</color>
+ <color name="i_am_color_d0c">#00000d0c</color>
+ <color name="i_am_color_d0d">#00000d0d</color>
+ <color name="i_am_color_d0e">#00000d0e</color>
+ <color name="i_am_color_d0f">#00000d0f</color>
+ <color name="i_am_color_d10">#00000d10</color>
+ <color name="i_am_color_d11">#00000d11</color>
+ <color name="i_am_color_d12">#00000d12</color>
+ <color name="i_am_color_d13">#00000d13</color>
+ <color name="i_am_color_d14">#00000d14</color>
+ <color name="i_am_color_d15">#00000d15</color>
+ <color name="i_am_color_d16">#00000d16</color>
+ <color name="i_am_color_d17">#00000d17</color>
+ <color name="i_am_color_d18">#00000d18</color>
+ <color name="i_am_color_d19">#00000d19</color>
+ <color name="i_am_color_d1a">#00000d1a</color>
+ <color name="i_am_color_d1b">#00000d1b</color>
+ <color name="i_am_color_d1c">#00000d1c</color>
+ <color name="i_am_color_d1d">#00000d1d</color>
+ <color name="i_am_color_d1e">#00000d1e</color>
+ <color name="i_am_color_d1f">#00000d1f</color>
+ <color name="i_am_color_d20">#00000d20</color>
+ <color name="i_am_color_d21">#00000d21</color>
+ <color name="i_am_color_d22">#00000d22</color>
+ <color name="i_am_color_d23">#00000d23</color>
+ <color name="i_am_color_d24">#00000d24</color>
+ <color name="i_am_color_d25">#00000d25</color>
+ <color name="i_am_color_d26">#00000d26</color>
+ <color name="i_am_color_d27">#00000d27</color>
+ <color name="i_am_color_d28">#00000d28</color>
+ <color name="i_am_color_d29">#00000d29</color>
+ <color name="i_am_color_d2a">#00000d2a</color>
+ <color name="i_am_color_d2b">#00000d2b</color>
+ <color name="i_am_color_d2c">#00000d2c</color>
+ <color name="i_am_color_d2d">#00000d2d</color>
+ <color name="i_am_color_d2e">#00000d2e</color>
+ <color name="i_am_color_d2f">#00000d2f</color>
+ <color name="i_am_color_d30">#00000d30</color>
+ <color name="i_am_color_d31">#00000d31</color>
+ <color name="i_am_color_d32">#00000d32</color>
+ <color name="i_am_color_d33">#00000d33</color>
+ <color name="i_am_color_d34">#00000d34</color>
+ <color name="i_am_color_d35">#00000d35</color>
+ <color name="i_am_color_d36">#00000d36</color>
+ <color name="i_am_color_d37">#00000d37</color>
+ <color name="i_am_color_d38">#00000d38</color>
+ <color name="i_am_color_d39">#00000d39</color>
+ <color name="i_am_color_d3a">#00000d3a</color>
+ <color name="i_am_color_d3b">#00000d3b</color>
+ <color name="i_am_color_d3c">#00000d3c</color>
+ <color name="i_am_color_d3d">#00000d3d</color>
+ <color name="i_am_color_d3e">#00000d3e</color>
+ <color name="i_am_color_d3f">#00000d3f</color>
+ <color name="i_am_color_d40">#00000d40</color>
+ <color name="i_am_color_d41">#00000d41</color>
+ <color name="i_am_color_d42">#00000d42</color>
+ <color name="i_am_color_d43">#00000d43</color>
+ <color name="i_am_color_d44">#00000d44</color>
+ <color name="i_am_color_d45">#00000d45</color>
+ <color name="i_am_color_d46">#00000d46</color>
+ <color name="i_am_color_d47">#00000d47</color>
+ <color name="i_am_color_d48">#00000d48</color>
+ <color name="i_am_color_d49">#00000d49</color>
+ <color name="i_am_color_d4a">#00000d4a</color>
+ <color name="i_am_color_d4b">#00000d4b</color>
+ <color name="i_am_color_d4c">#00000d4c</color>
+ <color name="i_am_color_d4d">#00000d4d</color>
+ <color name="i_am_color_d4e">#00000d4e</color>
+ <color name="i_am_color_d4f">#00000d4f</color>
+ <color name="i_am_color_d50">#00000d50</color>
+ <color name="i_am_color_d51">#00000d51</color>
+ <color name="i_am_color_d52">#00000d52</color>
+ <color name="i_am_color_d53">#00000d53</color>
+ <color name="i_am_color_d54">#00000d54</color>
+ <color name="i_am_color_d55">#00000d55</color>
+ <color name="i_am_color_d56">#00000d56</color>
+ <color name="i_am_color_d57">#00000d57</color>
+ <color name="i_am_color_d58">#00000d58</color>
+ <color name="i_am_color_d59">#00000d59</color>
+ <color name="i_am_color_d5a">#00000d5a</color>
+ <color name="i_am_color_d5b">#00000d5b</color>
+ <color name="i_am_color_d5c">#00000d5c</color>
+ <color name="i_am_color_d5d">#00000d5d</color>
+ <color name="i_am_color_d5e">#00000d5e</color>
+ <color name="i_am_color_d5f">#00000d5f</color>
+ <color name="i_am_color_d60">#00000d60</color>
+ <color name="i_am_color_d61">#00000d61</color>
+ <color name="i_am_color_d62">#00000d62</color>
+ <color name="i_am_color_d63">#00000d63</color>
+ <color name="i_am_color_d64">#00000d64</color>
+ <color name="i_am_color_d65">#00000d65</color>
+ <color name="i_am_color_d66">#00000d66</color>
+ <color name="i_am_color_d67">#00000d67</color>
+ <color name="i_am_color_d68">#00000d68</color>
+ <color name="i_am_color_d69">#00000d69</color>
+ <color name="i_am_color_d6a">#00000d6a</color>
+ <color name="i_am_color_d6b">#00000d6b</color>
+ <color name="i_am_color_d6c">#00000d6c</color>
+ <color name="i_am_color_d6d">#00000d6d</color>
+ <color name="i_am_color_d6e">#00000d6e</color>
+ <color name="i_am_color_d6f">#00000d6f</color>
+ <color name="i_am_color_d70">#00000d70</color>
+ <color name="i_am_color_d71">#00000d71</color>
+ <color name="i_am_color_d72">#00000d72</color>
+ <color name="i_am_color_d73">#00000d73</color>
+ <color name="i_am_color_d74">#00000d74</color>
+ <color name="i_am_color_d75">#00000d75</color>
+ <color name="i_am_color_d76">#00000d76</color>
+ <color name="i_am_color_d77">#00000d77</color>
+ <color name="i_am_color_d78">#00000d78</color>
+ <color name="i_am_color_d79">#00000d79</color>
+ <color name="i_am_color_d7a">#00000d7a</color>
+ <color name="i_am_color_d7b">#00000d7b</color>
+ <color name="i_am_color_d7c">#00000d7c</color>
+ <color name="i_am_color_d7d">#00000d7d</color>
+ <color name="i_am_color_d7e">#00000d7e</color>
+ <color name="i_am_color_d7f">#00000d7f</color>
+ <color name="i_am_color_d80">#00000d80</color>
+ <color name="i_am_color_d81">#00000d81</color>
+ <color name="i_am_color_d82">#00000d82</color>
+ <color name="i_am_color_d83">#00000d83</color>
+ <color name="i_am_color_d84">#00000d84</color>
+ <color name="i_am_color_d85">#00000d85</color>
+ <color name="i_am_color_d86">#00000d86</color>
+ <color name="i_am_color_d87">#00000d87</color>
+ <color name="i_am_color_d88">#00000d88</color>
+ <color name="i_am_color_d89">#00000d89</color>
+ <color name="i_am_color_d8a">#00000d8a</color>
+ <color name="i_am_color_d8b">#00000d8b</color>
+ <color name="i_am_color_d8c">#00000d8c</color>
+ <color name="i_am_color_d8d">#00000d8d</color>
+ <color name="i_am_color_d8e">#00000d8e</color>
+ <color name="i_am_color_d8f">#00000d8f</color>
+ <color name="i_am_color_d90">#00000d90</color>
+ <color name="i_am_color_d91">#00000d91</color>
+ <color name="i_am_color_d92">#00000d92</color>
+ <color name="i_am_color_d93">#00000d93</color>
+ <color name="i_am_color_d94">#00000d94</color>
+ <color name="i_am_color_d95">#00000d95</color>
+ <color name="i_am_color_d96">#00000d96</color>
+ <color name="i_am_color_d97">#00000d97</color>
+ <color name="i_am_color_d98">#00000d98</color>
+ <color name="i_am_color_d99">#00000d99</color>
+ <color name="i_am_color_d9a">#00000d9a</color>
+ <color name="i_am_color_d9b">#00000d9b</color>
+ <color name="i_am_color_d9c">#00000d9c</color>
+ <color name="i_am_color_d9d">#00000d9d</color>
+ <color name="i_am_color_d9e">#00000d9e</color>
+ <color name="i_am_color_d9f">#00000d9f</color>
+ <color name="i_am_color_da0">#00000da0</color>
+ <color name="i_am_color_da1">#00000da1</color>
+ <color name="i_am_color_da2">#00000da2</color>
+ <color name="i_am_color_da3">#00000da3</color>
+ <color name="i_am_color_da4">#00000da4</color>
+ <color name="i_am_color_da5">#00000da5</color>
+ <color name="i_am_color_da6">#00000da6</color>
+ <color name="i_am_color_da7">#00000da7</color>
+ <color name="i_am_color_da8">#00000da8</color>
+ <color name="i_am_color_da9">#00000da9</color>
+ <color name="i_am_color_daa">#00000daa</color>
+ <color name="i_am_color_dab">#00000dab</color>
+ <color name="i_am_color_dac">#00000dac</color>
+ <color name="i_am_color_dad">#00000dad</color>
+ <color name="i_am_color_dae">#00000dae</color>
+ <color name="i_am_color_daf">#00000daf</color>
+ <color name="i_am_color_db0">#00000db0</color>
+ <color name="i_am_color_db1">#00000db1</color>
+ <color name="i_am_color_db2">#00000db2</color>
+ <color name="i_am_color_db3">#00000db3</color>
+ <color name="i_am_color_db4">#00000db4</color>
+ <color name="i_am_color_db5">#00000db5</color>
+ <color name="i_am_color_db6">#00000db6</color>
+ <color name="i_am_color_db7">#00000db7</color>
+ <color name="i_am_color_db8">#00000db8</color>
+ <color name="i_am_color_db9">#00000db9</color>
+ <color name="i_am_color_dba">#00000dba</color>
+ <color name="i_am_color_dbb">#00000dbb</color>
+ <color name="i_am_color_dbc">#00000dbc</color>
+ <color name="i_am_color_dbd">#00000dbd</color>
+ <color name="i_am_color_dbe">#00000dbe</color>
+ <color name="i_am_color_dbf">#00000dbf</color>
+ <color name="i_am_color_dc0">#00000dc0</color>
+ <color name="i_am_color_dc1">#00000dc1</color>
+ <color name="i_am_color_dc2">#00000dc2</color>
+ <color name="i_am_color_dc3">#00000dc3</color>
+ <color name="i_am_color_dc4">#00000dc4</color>
+ <color name="i_am_color_dc5">#00000dc5</color>
+ <color name="i_am_color_dc6">#00000dc6</color>
+ <color name="i_am_color_dc7">#00000dc7</color>
+ <color name="i_am_color_dc8">#00000dc8</color>
+ <color name="i_am_color_dc9">#00000dc9</color>
+ <color name="i_am_color_dca">#00000dca</color>
+ <color name="i_am_color_dcb">#00000dcb</color>
+ <color name="i_am_color_dcc">#00000dcc</color>
+ <color name="i_am_color_dcd">#00000dcd</color>
+ <color name="i_am_color_dce">#00000dce</color>
+ <color name="i_am_color_dcf">#00000dcf</color>
+ <color name="i_am_color_dd0">#00000dd0</color>
+ <color name="i_am_color_dd1">#00000dd1</color>
+ <color name="i_am_color_dd2">#00000dd2</color>
+ <color name="i_am_color_dd3">#00000dd3</color>
+ <color name="i_am_color_dd4">#00000dd4</color>
+ <color name="i_am_color_dd5">#00000dd5</color>
+ <color name="i_am_color_dd6">#00000dd6</color>
+ <color name="i_am_color_dd7">#00000dd7</color>
+ <color name="i_am_color_dd8">#00000dd8</color>
+ <color name="i_am_color_dd9">#00000dd9</color>
+ <color name="i_am_color_dda">#00000dda</color>
+ <color name="i_am_color_ddb">#00000ddb</color>
+ <color name="i_am_color_ddc">#00000ddc</color>
+ <color name="i_am_color_ddd">#00000ddd</color>
+ <color name="i_am_color_dde">#00000dde</color>
+ <color name="i_am_color_ddf">#00000ddf</color>
+ <color name="i_am_color_de0">#00000de0</color>
+ <color name="i_am_color_de1">#00000de1</color>
+ <color name="i_am_color_de2">#00000de2</color>
+ <color name="i_am_color_de3">#00000de3</color>
+ <color name="i_am_color_de4">#00000de4</color>
+ <color name="i_am_color_de5">#00000de5</color>
+ <color name="i_am_color_de6">#00000de6</color>
+ <color name="i_am_color_de7">#00000de7</color>
+ <color name="i_am_color_de8">#00000de8</color>
+ <color name="i_am_color_de9">#00000de9</color>
+ <color name="i_am_color_dea">#00000dea</color>
+ <color name="i_am_color_deb">#00000deb</color>
+ <color name="i_am_color_dec">#00000dec</color>
+ <color name="i_am_color_ded">#00000ded</color>
+ <color name="i_am_color_dee">#00000dee</color>
+ <color name="i_am_color_def">#00000def</color>
+ <color name="i_am_color_df0">#00000df0</color>
+ <color name="i_am_color_df1">#00000df1</color>
+ <color name="i_am_color_df2">#00000df2</color>
+ <color name="i_am_color_df3">#00000df3</color>
+ <color name="i_am_color_df4">#00000df4</color>
+ <color name="i_am_color_df5">#00000df5</color>
+ <color name="i_am_color_df6">#00000df6</color>
+ <color name="i_am_color_df7">#00000df7</color>
+ <color name="i_am_color_df8">#00000df8</color>
+ <color name="i_am_color_df9">#00000df9</color>
+ <color name="i_am_color_dfa">#00000dfa</color>
+ <color name="i_am_color_dfb">#00000dfb</color>
+ <color name="i_am_color_dfc">#00000dfc</color>
+ <color name="i_am_color_dfd">#00000dfd</color>
+ <color name="i_am_color_dfe">#00000dfe</color>
+ <color name="i_am_color_dff">#00000dff</color>
+ <color name="i_am_color_e00">#00000e00</color>
+ <color name="i_am_color_e01">#00000e01</color>
+ <color name="i_am_color_e02">#00000e02</color>
+ <color name="i_am_color_e03">#00000e03</color>
+ <color name="i_am_color_e04">#00000e04</color>
+ <color name="i_am_color_e05">#00000e05</color>
+ <color name="i_am_color_e06">#00000e06</color>
+ <color name="i_am_color_e07">#00000e07</color>
+ <color name="i_am_color_e08">#00000e08</color>
+ <color name="i_am_color_e09">#00000e09</color>
+ <color name="i_am_color_e0a">#00000e0a</color>
+ <color name="i_am_color_e0b">#00000e0b</color>
+ <color name="i_am_color_e0c">#00000e0c</color>
+ <color name="i_am_color_e0d">#00000e0d</color>
+ <color name="i_am_color_e0e">#00000e0e</color>
+ <color name="i_am_color_e0f">#00000e0f</color>
+ <color name="i_am_color_e10">#00000e10</color>
+ <color name="i_am_color_e11">#00000e11</color>
+ <color name="i_am_color_e12">#00000e12</color>
+ <color name="i_am_color_e13">#00000e13</color>
+ <color name="i_am_color_e14">#00000e14</color>
+ <color name="i_am_color_e15">#00000e15</color>
+ <color name="i_am_color_e16">#00000e16</color>
+ <color name="i_am_color_e17">#00000e17</color>
+ <color name="i_am_color_e18">#00000e18</color>
+ <color name="i_am_color_e19">#00000e19</color>
+ <color name="i_am_color_e1a">#00000e1a</color>
+ <color name="i_am_color_e1b">#00000e1b</color>
+ <color name="i_am_color_e1c">#00000e1c</color>
+ <color name="i_am_color_e1d">#00000e1d</color>
+ <color name="i_am_color_e1e">#00000e1e</color>
+ <color name="i_am_color_e1f">#00000e1f</color>
+ <color name="i_am_color_e20">#00000e20</color>
+ <color name="i_am_color_e21">#00000e21</color>
+ <color name="i_am_color_e22">#00000e22</color>
+ <color name="i_am_color_e23">#00000e23</color>
+ <color name="i_am_color_e24">#00000e24</color>
+ <color name="i_am_color_e25">#00000e25</color>
+ <color name="i_am_color_e26">#00000e26</color>
+ <color name="i_am_color_e27">#00000e27</color>
+ <color name="i_am_color_e28">#00000e28</color>
+ <color name="i_am_color_e29">#00000e29</color>
+ <color name="i_am_color_e2a">#00000e2a</color>
+ <color name="i_am_color_e2b">#00000e2b</color>
+ <color name="i_am_color_e2c">#00000e2c</color>
+ <color name="i_am_color_e2d">#00000e2d</color>
+ <color name="i_am_color_e2e">#00000e2e</color>
+ <color name="i_am_color_e2f">#00000e2f</color>
+ <color name="i_am_color_e30">#00000e30</color>
+ <color name="i_am_color_e31">#00000e31</color>
+ <color name="i_am_color_e32">#00000e32</color>
+ <color name="i_am_color_e33">#00000e33</color>
+ <color name="i_am_color_e34">#00000e34</color>
+ <color name="i_am_color_e35">#00000e35</color>
+ <color name="i_am_color_e36">#00000e36</color>
+ <color name="i_am_color_e37">#00000e37</color>
+ <color name="i_am_color_e38">#00000e38</color>
+ <color name="i_am_color_e39">#00000e39</color>
+ <color name="i_am_color_e3a">#00000e3a</color>
+ <color name="i_am_color_e3b">#00000e3b</color>
+ <color name="i_am_color_e3c">#00000e3c</color>
+ <color name="i_am_color_e3d">#00000e3d</color>
+ <color name="i_am_color_e3e">#00000e3e</color>
+ <color name="i_am_color_e3f">#00000e3f</color>
+ <color name="i_am_color_e40">#00000e40</color>
+ <color name="i_am_color_e41">#00000e41</color>
+ <color name="i_am_color_e42">#00000e42</color>
+ <color name="i_am_color_e43">#00000e43</color>
+ <color name="i_am_color_e44">#00000e44</color>
+ <color name="i_am_color_e45">#00000e45</color>
+ <color name="i_am_color_e46">#00000e46</color>
+ <color name="i_am_color_e47">#00000e47</color>
+ <color name="i_am_color_e48">#00000e48</color>
+ <color name="i_am_color_e49">#00000e49</color>
+ <color name="i_am_color_e4a">#00000e4a</color>
+ <color name="i_am_color_e4b">#00000e4b</color>
+ <color name="i_am_color_e4c">#00000e4c</color>
+ <color name="i_am_color_e4d">#00000e4d</color>
+ <color name="i_am_color_e4e">#00000e4e</color>
+ <color name="i_am_color_e4f">#00000e4f</color>
+ <color name="i_am_color_e50">#00000e50</color>
+ <color name="i_am_color_e51">#00000e51</color>
+ <color name="i_am_color_e52">#00000e52</color>
+ <color name="i_am_color_e53">#00000e53</color>
+ <color name="i_am_color_e54">#00000e54</color>
+ <color name="i_am_color_e55">#00000e55</color>
+ <color name="i_am_color_e56">#00000e56</color>
+ <color name="i_am_color_e57">#00000e57</color>
+ <color name="i_am_color_e58">#00000e58</color>
+ <color name="i_am_color_e59">#00000e59</color>
+ <color name="i_am_color_e5a">#00000e5a</color>
+ <color name="i_am_color_e5b">#00000e5b</color>
+ <color name="i_am_color_e5c">#00000e5c</color>
+ <color name="i_am_color_e5d">#00000e5d</color>
+ <color name="i_am_color_e5e">#00000e5e</color>
+ <color name="i_am_color_e5f">#00000e5f</color>
+ <color name="i_am_color_e60">#00000e60</color>
+ <color name="i_am_color_e61">#00000e61</color>
+ <color name="i_am_color_e62">#00000e62</color>
+ <color name="i_am_color_e63">#00000e63</color>
+ <color name="i_am_color_e64">#00000e64</color>
+ <color name="i_am_color_e65">#00000e65</color>
+ <color name="i_am_color_e66">#00000e66</color>
+ <color name="i_am_color_e67">#00000e67</color>
+ <color name="i_am_color_e68">#00000e68</color>
+ <color name="i_am_color_e69">#00000e69</color>
+ <color name="i_am_color_e6a">#00000e6a</color>
+ <color name="i_am_color_e6b">#00000e6b</color>
+ <color name="i_am_color_e6c">#00000e6c</color>
+ <color name="i_am_color_e6d">#00000e6d</color>
+ <color name="i_am_color_e6e">#00000e6e</color>
+ <color name="i_am_color_e6f">#00000e6f</color>
+ <color name="i_am_color_e70">#00000e70</color>
+ <color name="i_am_color_e71">#00000e71</color>
+ <color name="i_am_color_e72">#00000e72</color>
+ <color name="i_am_color_e73">#00000e73</color>
+ <color name="i_am_color_e74">#00000e74</color>
+ <color name="i_am_color_e75">#00000e75</color>
+ <color name="i_am_color_e76">#00000e76</color>
+ <color name="i_am_color_e77">#00000e77</color>
+ <color name="i_am_color_e78">#00000e78</color>
+ <color name="i_am_color_e79">#00000e79</color>
+ <color name="i_am_color_e7a">#00000e7a</color>
+ <color name="i_am_color_e7b">#00000e7b</color>
+ <color name="i_am_color_e7c">#00000e7c</color>
+ <color name="i_am_color_e7d">#00000e7d</color>
+ <color name="i_am_color_e7e">#00000e7e</color>
+ <color name="i_am_color_e7f">#00000e7f</color>
+ <color name="i_am_color_e80">#00000e80</color>
+ <color name="i_am_color_e81">#00000e81</color>
+ <color name="i_am_color_e82">#00000e82</color>
+ <color name="i_am_color_e83">#00000e83</color>
+ <color name="i_am_color_e84">#00000e84</color>
+ <color name="i_am_color_e85">#00000e85</color>
+ <color name="i_am_color_e86">#00000e86</color>
+ <color name="i_am_color_e87">#00000e87</color>
+ <color name="i_am_color_e88">#00000e88</color>
+ <color name="i_am_color_e89">#00000e89</color>
+ <color name="i_am_color_e8a">#00000e8a</color>
+ <color name="i_am_color_e8b">#00000e8b</color>
+ <color name="i_am_color_e8c">#00000e8c</color>
+ <color name="i_am_color_e8d">#00000e8d</color>
+ <color name="i_am_color_e8e">#00000e8e</color>
+ <color name="i_am_color_e8f">#00000e8f</color>
+ <color name="i_am_color_e90">#00000e90</color>
+ <color name="i_am_color_e91">#00000e91</color>
+ <color name="i_am_color_e92">#00000e92</color>
+ <color name="i_am_color_e93">#00000e93</color>
+ <color name="i_am_color_e94">#00000e94</color>
+ <color name="i_am_color_e95">#00000e95</color>
+ <color name="i_am_color_e96">#00000e96</color>
+ <color name="i_am_color_e97">#00000e97</color>
+ <color name="i_am_color_e98">#00000e98</color>
+ <color name="i_am_color_e99">#00000e99</color>
+ <color name="i_am_color_e9a">#00000e9a</color>
+ <color name="i_am_color_e9b">#00000e9b</color>
+ <color name="i_am_color_e9c">#00000e9c</color>
+ <color name="i_am_color_e9d">#00000e9d</color>
+ <color name="i_am_color_e9e">#00000e9e</color>
+ <color name="i_am_color_e9f">#00000e9f</color>
+ <color name="i_am_color_ea0">#00000ea0</color>
+ <color name="i_am_color_ea1">#00000ea1</color>
+ <color name="i_am_color_ea2">#00000ea2</color>
+ <color name="i_am_color_ea3">#00000ea3</color>
+ <color name="i_am_color_ea4">#00000ea4</color>
+ <color name="i_am_color_ea5">#00000ea5</color>
+ <color name="i_am_color_ea6">#00000ea6</color>
+ <color name="i_am_color_ea7">#00000ea7</color>
+ <color name="i_am_color_ea8">#00000ea8</color>
+ <color name="i_am_color_ea9">#00000ea9</color>
+ <color name="i_am_color_eaa">#00000eaa</color>
+ <color name="i_am_color_eab">#00000eab</color>
+ <color name="i_am_color_eac">#00000eac</color>
+ <color name="i_am_color_ead">#00000ead</color>
+ <color name="i_am_color_eae">#00000eae</color>
+ <color name="i_am_color_eaf">#00000eaf</color>
+ <color name="i_am_color_eb0">#00000eb0</color>
+ <color name="i_am_color_eb1">#00000eb1</color>
+ <color name="i_am_color_eb2">#00000eb2</color>
+ <color name="i_am_color_eb3">#00000eb3</color>
+ <color name="i_am_color_eb4">#00000eb4</color>
+ <color name="i_am_color_eb5">#00000eb5</color>
+ <color name="i_am_color_eb6">#00000eb6</color>
+ <color name="i_am_color_eb7">#00000eb7</color>
+ <color name="i_am_color_eb8">#00000eb8</color>
+ <color name="i_am_color_eb9">#00000eb9</color>
+ <color name="i_am_color_eba">#00000eba</color>
+ <color name="i_am_color_ebb">#00000ebb</color>
+ <color name="i_am_color_ebc">#00000ebc</color>
+ <color name="i_am_color_ebd">#00000ebd</color>
+ <color name="i_am_color_ebe">#00000ebe</color>
+ <color name="i_am_color_ebf">#00000ebf</color>
+ <color name="i_am_color_ec0">#00000ec0</color>
+ <color name="i_am_color_ec1">#00000ec1</color>
+ <color name="i_am_color_ec2">#00000ec2</color>
+ <color name="i_am_color_ec3">#00000ec3</color>
+ <color name="i_am_color_ec4">#00000ec4</color>
+ <color name="i_am_color_ec5">#00000ec5</color>
+ <color name="i_am_color_ec6">#00000ec6</color>
+ <color name="i_am_color_ec7">#00000ec7</color>
+ <color name="i_am_color_ec8">#00000ec8</color>
+ <color name="i_am_color_ec9">#00000ec9</color>
+ <color name="i_am_color_eca">#00000eca</color>
+ <color name="i_am_color_ecb">#00000ecb</color>
+ <color name="i_am_color_ecc">#00000ecc</color>
+ <color name="i_am_color_ecd">#00000ecd</color>
+ <color name="i_am_color_ece">#00000ece</color>
+ <color name="i_am_color_ecf">#00000ecf</color>
+ <color name="i_am_color_ed0">#00000ed0</color>
+ <color name="i_am_color_ed1">#00000ed1</color>
+ <color name="i_am_color_ed2">#00000ed2</color>
+ <color name="i_am_color_ed3">#00000ed3</color>
+ <color name="i_am_color_ed4">#00000ed4</color>
+ <color name="i_am_color_ed5">#00000ed5</color>
+ <color name="i_am_color_ed6">#00000ed6</color>
+ <color name="i_am_color_ed7">#00000ed7</color>
+ <color name="i_am_color_ed8">#00000ed8</color>
+ <color name="i_am_color_ed9">#00000ed9</color>
+ <color name="i_am_color_eda">#00000eda</color>
+ <color name="i_am_color_edb">#00000edb</color>
+ <color name="i_am_color_edc">#00000edc</color>
+ <color name="i_am_color_edd">#00000edd</color>
+ <color name="i_am_color_ede">#00000ede</color>
+ <color name="i_am_color_edf">#00000edf</color>
+ <color name="i_am_color_ee0">#00000ee0</color>
+ <color name="i_am_color_ee1">#00000ee1</color>
+ <color name="i_am_color_ee2">#00000ee2</color>
+ <color name="i_am_color_ee3">#00000ee3</color>
+ <color name="i_am_color_ee4">#00000ee4</color>
+ <color name="i_am_color_ee5">#00000ee5</color>
+ <color name="i_am_color_ee6">#00000ee6</color>
+ <color name="i_am_color_ee7">#00000ee7</color>
+ <color name="i_am_color_ee8">#00000ee8</color>
+ <color name="i_am_color_ee9">#00000ee9</color>
+ <color name="i_am_color_eea">#00000eea</color>
+ <color name="i_am_color_eeb">#00000eeb</color>
+ <color name="i_am_color_eec">#00000eec</color>
+ <color name="i_am_color_eed">#00000eed</color>
+ <color name="i_am_color_eee">#00000eee</color>
+ <color name="i_am_color_eef">#00000eef</color>
+ <color name="i_am_color_ef0">#00000ef0</color>
+ <color name="i_am_color_ef1">#00000ef1</color>
+ <color name="i_am_color_ef2">#00000ef2</color>
+ <color name="i_am_color_ef3">#00000ef3</color>
+ <color name="i_am_color_ef4">#00000ef4</color>
+ <color name="i_am_color_ef5">#00000ef5</color>
+ <color name="i_am_color_ef6">#00000ef6</color>
+ <color name="i_am_color_ef7">#00000ef7</color>
+ <color name="i_am_color_ef8">#00000ef8</color>
+ <color name="i_am_color_ef9">#00000ef9</color>
+ <color name="i_am_color_efa">#00000efa</color>
+ <color name="i_am_color_efb">#00000efb</color>
+ <color name="i_am_color_efc">#00000efc</color>
+ <color name="i_am_color_efd">#00000efd</color>
+ <color name="i_am_color_efe">#00000efe</color>
+ <color name="i_am_color_eff">#00000eff</color>
+ <color name="i_am_color_f00">#00000f00</color>
+ <color name="i_am_color_f01">#00000f01</color>
+ <color name="i_am_color_f02">#00000f02</color>
+ <color name="i_am_color_f03">#00000f03</color>
+ <color name="i_am_color_f04">#00000f04</color>
+ <color name="i_am_color_f05">#00000f05</color>
+ <color name="i_am_color_f06">#00000f06</color>
+ <color name="i_am_color_f07">#00000f07</color>
+ <color name="i_am_color_f08">#00000f08</color>
+ <color name="i_am_color_f09">#00000f09</color>
+ <color name="i_am_color_f0a">#00000f0a</color>
+ <color name="i_am_color_f0b">#00000f0b</color>
+ <color name="i_am_color_f0c">#00000f0c</color>
+ <color name="i_am_color_f0d">#00000f0d</color>
+ <color name="i_am_color_f0e">#00000f0e</color>
+ <color name="i_am_color_f0f">#00000f0f</color>
+ <color name="i_am_color_f10">#00000f10</color>
+ <color name="i_am_color_f11">#00000f11</color>
+ <color name="i_am_color_f12">#00000f12</color>
+ <color name="i_am_color_f13">#00000f13</color>
+ <color name="i_am_color_f14">#00000f14</color>
+ <color name="i_am_color_f15">#00000f15</color>
+ <color name="i_am_color_f16">#00000f16</color>
+ <color name="i_am_color_f17">#00000f17</color>
+ <color name="i_am_color_f18">#00000f18</color>
+ <color name="i_am_color_f19">#00000f19</color>
+ <color name="i_am_color_f1a">#00000f1a</color>
+ <color name="i_am_color_f1b">#00000f1b</color>
+ <color name="i_am_color_f1c">#00000f1c</color>
+ <color name="i_am_color_f1d">#00000f1d</color>
+ <color name="i_am_color_f1e">#00000f1e</color>
+ <color name="i_am_color_f1f">#00000f1f</color>
+ <color name="i_am_color_f20">#00000f20</color>
+ <color name="i_am_color_f21">#00000f21</color>
+ <color name="i_am_color_f22">#00000f22</color>
+ <color name="i_am_color_f23">#00000f23</color>
+ <color name="i_am_color_f24">#00000f24</color>
+ <color name="i_am_color_f25">#00000f25</color>
+ <color name="i_am_color_f26">#00000f26</color>
+ <color name="i_am_color_f27">#00000f27</color>
+ <color name="i_am_color_f28">#00000f28</color>
+ <color name="i_am_color_f29">#00000f29</color>
+ <color name="i_am_color_f2a">#00000f2a</color>
+ <color name="i_am_color_f2b">#00000f2b</color>
+ <color name="i_am_color_f2c">#00000f2c</color>
+ <color name="i_am_color_f2d">#00000f2d</color>
+ <color name="i_am_color_f2e">#00000f2e</color>
+ <color name="i_am_color_f2f">#00000f2f</color>
+ <color name="i_am_color_f30">#00000f30</color>
+ <color name="i_am_color_f31">#00000f31</color>
+ <color name="i_am_color_f32">#00000f32</color>
+ <color name="i_am_color_f33">#00000f33</color>
+ <color name="i_am_color_f34">#00000f34</color>
+ <color name="i_am_color_f35">#00000f35</color>
+ <color name="i_am_color_f36">#00000f36</color>
+ <color name="i_am_color_f37">#00000f37</color>
+ <color name="i_am_color_f38">#00000f38</color>
+ <color name="i_am_color_f39">#00000f39</color>
+ <color name="i_am_color_f3a">#00000f3a</color>
+ <color name="i_am_color_f3b">#00000f3b</color>
+ <color name="i_am_color_f3c">#00000f3c</color>
+ <color name="i_am_color_f3d">#00000f3d</color>
+ <color name="i_am_color_f3e">#00000f3e</color>
+ <color name="i_am_color_f3f">#00000f3f</color>
+ <color name="i_am_color_f40">#00000f40</color>
+ <color name="i_am_color_f41">#00000f41</color>
+ <color name="i_am_color_f42">#00000f42</color>
+ <color name="i_am_color_f43">#00000f43</color>
+ <color name="i_am_color_f44">#00000f44</color>
+ <color name="i_am_color_f45">#00000f45</color>
+ <color name="i_am_color_f46">#00000f46</color>
+ <color name="i_am_color_f47">#00000f47</color>
+ <color name="i_am_color_f48">#00000f48</color>
+ <color name="i_am_color_f49">#00000f49</color>
+ <color name="i_am_color_f4a">#00000f4a</color>
+ <color name="i_am_color_f4b">#00000f4b</color>
+ <color name="i_am_color_f4c">#00000f4c</color>
+ <color name="i_am_color_f4d">#00000f4d</color>
+ <color name="i_am_color_f4e">#00000f4e</color>
+ <color name="i_am_color_f4f">#00000f4f</color>
+ <color name="i_am_color_f50">#00000f50</color>
+ <color name="i_am_color_f51">#00000f51</color>
+ <color name="i_am_color_f52">#00000f52</color>
+ <color name="i_am_color_f53">#00000f53</color>
+ <color name="i_am_color_f54">#00000f54</color>
+ <color name="i_am_color_f55">#00000f55</color>
+ <color name="i_am_color_f56">#00000f56</color>
+ <color name="i_am_color_f57">#00000f57</color>
+ <color name="i_am_color_f58">#00000f58</color>
+ <color name="i_am_color_f59">#00000f59</color>
+ <color name="i_am_color_f5a">#00000f5a</color>
+ <color name="i_am_color_f5b">#00000f5b</color>
+ <color name="i_am_color_f5c">#00000f5c</color>
+ <color name="i_am_color_f5d">#00000f5d</color>
+ <color name="i_am_color_f5e">#00000f5e</color>
+ <color name="i_am_color_f5f">#00000f5f</color>
+ <color name="i_am_color_f60">#00000f60</color>
+ <color name="i_am_color_f61">#00000f61</color>
+ <color name="i_am_color_f62">#00000f62</color>
+ <color name="i_am_color_f63">#00000f63</color>
+ <color name="i_am_color_f64">#00000f64</color>
+ <color name="i_am_color_f65">#00000f65</color>
+ <color name="i_am_color_f66">#00000f66</color>
+ <color name="i_am_color_f67">#00000f67</color>
+ <color name="i_am_color_f68">#00000f68</color>
+ <color name="i_am_color_f69">#00000f69</color>
+ <color name="i_am_color_f6a">#00000f6a</color>
+ <color name="i_am_color_f6b">#00000f6b</color>
+ <color name="i_am_color_f6c">#00000f6c</color>
+ <color name="i_am_color_f6d">#00000f6d</color>
+ <color name="i_am_color_f6e">#00000f6e</color>
+ <color name="i_am_color_f6f">#00000f6f</color>
+ <color name="i_am_color_f70">#00000f70</color>
+ <color name="i_am_color_f71">#00000f71</color>
+ <color name="i_am_color_f72">#00000f72</color>
+ <color name="i_am_color_f73">#00000f73</color>
+ <color name="i_am_color_f74">#00000f74</color>
+ <color name="i_am_color_f75">#00000f75</color>
+ <color name="i_am_color_f76">#00000f76</color>
+ <color name="i_am_color_f77">#00000f77</color>
+ <color name="i_am_color_f78">#00000f78</color>
+ <color name="i_am_color_f79">#00000f79</color>
+ <color name="i_am_color_f7a">#00000f7a</color>
+ <color name="i_am_color_f7b">#00000f7b</color>
+ <color name="i_am_color_f7c">#00000f7c</color>
+ <color name="i_am_color_f7d">#00000f7d</color>
+ <color name="i_am_color_f7e">#00000f7e</color>
+ <color name="i_am_color_f7f">#00000f7f</color>
+ <color name="i_am_color_f80">#00000f80</color>
+ <color name="i_am_color_f81">#00000f81</color>
+ <color name="i_am_color_f82">#00000f82</color>
+ <color name="i_am_color_f83">#00000f83</color>
+ <color name="i_am_color_f84">#00000f84</color>
+ <color name="i_am_color_f85">#00000f85</color>
+ <color name="i_am_color_f86">#00000f86</color>
+ <color name="i_am_color_f87">#00000f87</color>
+ <color name="i_am_color_f88">#00000f88</color>
+ <color name="i_am_color_f89">#00000f89</color>
+ <color name="i_am_color_f8a">#00000f8a</color>
+ <color name="i_am_color_f8b">#00000f8b</color>
+ <color name="i_am_color_f8c">#00000f8c</color>
+ <color name="i_am_color_f8d">#00000f8d</color>
+ <color name="i_am_color_f8e">#00000f8e</color>
+ <color name="i_am_color_f8f">#00000f8f</color>
+ <color name="i_am_color_f90">#00000f90</color>
+ <color name="i_am_color_f91">#00000f91</color>
+ <color name="i_am_color_f92">#00000f92</color>
+ <color name="i_am_color_f93">#00000f93</color>
+ <color name="i_am_color_f94">#00000f94</color>
+ <color name="i_am_color_f95">#00000f95</color>
+ <color name="i_am_color_f96">#00000f96</color>
+ <color name="i_am_color_f97">#00000f97</color>
+ <color name="i_am_color_f98">#00000f98</color>
+ <color name="i_am_color_f99">#00000f99</color>
+ <color name="i_am_color_f9a">#00000f9a</color>
+ <color name="i_am_color_f9b">#00000f9b</color>
+ <color name="i_am_color_f9c">#00000f9c</color>
+ <color name="i_am_color_f9d">#00000f9d</color>
+ <color name="i_am_color_f9e">#00000f9e</color>
+ <color name="i_am_color_f9f">#00000f9f</color>
+ <color name="i_am_color_fa0">#00000fa0</color>
+ <color name="i_am_color_fa1">#00000fa1</color>
+ <color name="i_am_color_fa2">#00000fa2</color>
+ <color name="i_am_color_fa3">#00000fa3</color>
+ <color name="i_am_color_fa4">#00000fa4</color>
+ <color name="i_am_color_fa5">#00000fa5</color>
+ <color name="i_am_color_fa6">#00000fa6</color>
+ <color name="i_am_color_fa7">#00000fa7</color>
+ <color name="i_am_color_fa8">#00000fa8</color>
+ <color name="i_am_color_fa9">#00000fa9</color>
+ <color name="i_am_color_faa">#00000faa</color>
+ <color name="i_am_color_fab">#00000fab</color>
+ <color name="i_am_color_fac">#00000fac</color>
+ <color name="i_am_color_fad">#00000fad</color>
+ <color name="i_am_color_fae">#00000fae</color>
+ <color name="i_am_color_faf">#00000faf</color>
+ <color name="i_am_color_fb0">#00000fb0</color>
+ <color name="i_am_color_fb1">#00000fb1</color>
+ <color name="i_am_color_fb2">#00000fb2</color>
+ <color name="i_am_color_fb3">#00000fb3</color>
+ <color name="i_am_color_fb4">#00000fb4</color>
+ <color name="i_am_color_fb5">#00000fb5</color>
+ <color name="i_am_color_fb6">#00000fb6</color>
+ <color name="i_am_color_fb7">#00000fb7</color>
+ <color name="i_am_color_fb8">#00000fb8</color>
+ <color name="i_am_color_fb9">#00000fb9</color>
+ <color name="i_am_color_fba">#00000fba</color>
+ <color name="i_am_color_fbb">#00000fbb</color>
+ <color name="i_am_color_fbc">#00000fbc</color>
+ <color name="i_am_color_fbd">#00000fbd</color>
+ <color name="i_am_color_fbe">#00000fbe</color>
+ <color name="i_am_color_fbf">#00000fbf</color>
+ <color name="i_am_color_fc0">#00000fc0</color>
+ <color name="i_am_color_fc1">#00000fc1</color>
+ <color name="i_am_color_fc2">#00000fc2</color>
+ <color name="i_am_color_fc3">#00000fc3</color>
+ <color name="i_am_color_fc4">#00000fc4</color>
+ <color name="i_am_color_fc5">#00000fc5</color>
+ <color name="i_am_color_fc6">#00000fc6</color>
+ <color name="i_am_color_fc7">#00000fc7</color>
+ <color name="i_am_color_fc8">#00000fc8</color>
+ <color name="i_am_color_fc9">#00000fc9</color>
+ <color name="i_am_color_fca">#00000fca</color>
+ <color name="i_am_color_fcb">#00000fcb</color>
+ <color name="i_am_color_fcc">#00000fcc</color>
+ <color name="i_am_color_fcd">#00000fcd</color>
+ <color name="i_am_color_fce">#00000fce</color>
+ <color name="i_am_color_fcf">#00000fcf</color>
+ <color name="i_am_color_fd0">#00000fd0</color>
+ <color name="i_am_color_fd1">#00000fd1</color>
+ <color name="i_am_color_fd2">#00000fd2</color>
+ <color name="i_am_color_fd3">#00000fd3</color>
+ <color name="i_am_color_fd4">#00000fd4</color>
+ <color name="i_am_color_fd5">#00000fd5</color>
+ <color name="i_am_color_fd6">#00000fd6</color>
+ <color name="i_am_color_fd7">#00000fd7</color>
+ <color name="i_am_color_fd8">#00000fd8</color>
+ <color name="i_am_color_fd9">#00000fd9</color>
+ <color name="i_am_color_fda">#00000fda</color>
+ <color name="i_am_color_fdb">#00000fdb</color>
+ <color name="i_am_color_fdc">#00000fdc</color>
+ <color name="i_am_color_fdd">#00000fdd</color>
+ <color name="i_am_color_fde">#00000fde</color>
+ <color name="i_am_color_fdf">#00000fdf</color>
+ <color name="i_am_color_fe0">#00000fe0</color>
+ <color name="i_am_color_fe1">#00000fe1</color>
+ <color name="i_am_color_fe2">#00000fe2</color>
+ <color name="i_am_color_fe3">#00000fe3</color>
+ <color name="i_am_color_fe4">#00000fe4</color>
+ <color name="i_am_color_fe5">#00000fe5</color>
+ <color name="i_am_color_fe6">#00000fe6</color>
+ <color name="i_am_color_fe7">#00000fe7</color>
+ <color name="i_am_color_fe8">#00000fe8</color>
+ <color name="i_am_color_fe9">#00000fe9</color>
+ <color name="i_am_color_fea">#00000fea</color>
+ <color name="i_am_color_feb">#00000feb</color>
+ <color name="i_am_color_fec">#00000fec</color>
+ <color name="i_am_color_fed">#00000fed</color>
+ <color name="i_am_color_fee">#00000fee</color>
+ <color name="i_am_color_fef">#00000fef</color>
+ <color name="i_am_color_ff0">#00000ff0</color>
+ <color name="i_am_color_ff1">#00000ff1</color>
+ <color name="i_am_color_ff2">#00000ff2</color>
+ <color name="i_am_color_ff3">#00000ff3</color>
+ <color name="i_am_color_ff4">#00000ff4</color>
+ <color name="i_am_color_ff5">#00000ff5</color>
+ <color name="i_am_color_ff6">#00000ff6</color>
+ <color name="i_am_color_ff7">#00000ff7</color>
+ <color name="i_am_color_ff8">#00000ff8</color>
+ <color name="i_am_color_ff9">#00000ff9</color>
+ <color name="i_am_color_ffa">#00000ffa</color>
+ <color name="i_am_color_ffb">#00000ffb</color>
+ <color name="i_am_color_ffc">#00000ffc</color>
+ <color name="i_am_color_ffd">#00000ffd</color>
+ <color name="i_am_color_ffe">#00000ffe</color>
+ <color name="i_am_color_fff">#00000fff</color>
+ <color name="i_am_color_1000">#00001000</color>
+ <color name="i_am_color_1001">#00001001</color>
+ <color name="i_am_color_1002">#00001002</color>
+ <color name="i_am_color_1003">#00001003</color>
+ <color name="i_am_color_1004">#00001004</color>
+ <color name="i_am_color_1005">#00001005</color>
+ <color name="i_am_color_1006">#00001006</color>
+ <color name="i_am_color_1007">#00001007</color>
+ <color name="i_am_color_1008">#00001008</color>
+ <color name="i_am_color_1009">#00001009</color>
+ <color name="i_am_color_100a">#0000100a</color>
+ <color name="i_am_color_100b">#0000100b</color>
+ <color name="i_am_color_100c">#0000100c</color>
+ <color name="i_am_color_100d">#0000100d</color>
+ <color name="i_am_color_100e">#0000100e</color>
+ <color name="i_am_color_100f">#0000100f</color>
+ <color name="i_am_color_1010">#00001010</color>
+ <color name="i_am_color_1011">#00001011</color>
+ <color name="i_am_color_1012">#00001012</color>
+ <color name="i_am_color_1013">#00001013</color>
+ <color name="i_am_color_1014">#00001014</color>
+ <color name="i_am_color_1015">#00001015</color>
+ <color name="i_am_color_1016">#00001016</color>
+ <color name="i_am_color_1017">#00001017</color>
+ <color name="i_am_color_1018">#00001018</color>
+ <color name="i_am_color_1019">#00001019</color>
+ <color name="i_am_color_101a">#0000101a</color>
+ <color name="i_am_color_101b">#0000101b</color>
+ <color name="i_am_color_101c">#0000101c</color>
+ <color name="i_am_color_101d">#0000101d</color>
+ <color name="i_am_color_101e">#0000101e</color>
+ <color name="i_am_color_101f">#0000101f</color>
+ <color name="i_am_color_1020">#00001020</color>
+ <color name="i_am_color_1021">#00001021</color>
+ <color name="i_am_color_1022">#00001022</color>
+ <color name="i_am_color_1023">#00001023</color>
+ <color name="i_am_color_1024">#00001024</color>
+ <color name="i_am_color_1025">#00001025</color>
+ <color name="i_am_color_1026">#00001026</color>
+ <color name="i_am_color_1027">#00001027</color>
+ <color name="i_am_color_1028">#00001028</color>
+ <color name="i_am_color_1029">#00001029</color>
+ <color name="i_am_color_102a">#0000102a</color>
+ <color name="i_am_color_102b">#0000102b</color>
+ <color name="i_am_color_102c">#0000102c</color>
+ <color name="i_am_color_102d">#0000102d</color>
+ <color name="i_am_color_102e">#0000102e</color>
+ <color name="i_am_color_102f">#0000102f</color>
+ <color name="i_am_color_1030">#00001030</color>
+ <color name="i_am_color_1031">#00001031</color>
+ <color name="i_am_color_1032">#00001032</color>
+ <color name="i_am_color_1033">#00001033</color>
+ <color name="i_am_color_1034">#00001034</color>
+ <color name="i_am_color_1035">#00001035</color>
+ <color name="i_am_color_1036">#00001036</color>
+ <color name="i_am_color_1037">#00001037</color>
+ <color name="i_am_color_1038">#00001038</color>
+ <color name="i_am_color_1039">#00001039</color>
+ <color name="i_am_color_103a">#0000103a</color>
+ <color name="i_am_color_103b">#0000103b</color>
+ <color name="i_am_color_103c">#0000103c</color>
+ <color name="i_am_color_103d">#0000103d</color>
+ <color name="i_am_color_103e">#0000103e</color>
+ <color name="i_am_color_103f">#0000103f</color>
+ <color name="i_am_color_1040">#00001040</color>
+ <color name="i_am_color_1041">#00001041</color>
+ <color name="i_am_color_1042">#00001042</color>
+ <color name="i_am_color_1043">#00001043</color>
+ <color name="i_am_color_1044">#00001044</color>
+ <color name="i_am_color_1045">#00001045</color>
+ <color name="i_am_color_1046">#00001046</color>
+ <color name="i_am_color_1047">#00001047</color>
+ <color name="i_am_color_1048">#00001048</color>
+ <color name="i_am_color_1049">#00001049</color>
+ <color name="i_am_color_104a">#0000104a</color>
+ <color name="i_am_color_104b">#0000104b</color>
+ <color name="i_am_color_104c">#0000104c</color>
+ <color name="i_am_color_104d">#0000104d</color>
+ <color name="i_am_color_104e">#0000104e</color>
+ <color name="i_am_color_104f">#0000104f</color>
+ <color name="i_am_color_1050">#00001050</color>
+ <color name="i_am_color_1051">#00001051</color>
+ <color name="i_am_color_1052">#00001052</color>
+ <color name="i_am_color_1053">#00001053</color>
+ <color name="i_am_color_1054">#00001054</color>
+ <color name="i_am_color_1055">#00001055</color>
+ <color name="i_am_color_1056">#00001056</color>
+ <color name="i_am_color_1057">#00001057</color>
+ <color name="i_am_color_1058">#00001058</color>
+ <color name="i_am_color_1059">#00001059</color>
+ <color name="i_am_color_105a">#0000105a</color>
+ <color name="i_am_color_105b">#0000105b</color>
+ <color name="i_am_color_105c">#0000105c</color>
+ <color name="i_am_color_105d">#0000105d</color>
+ <color name="i_am_color_105e">#0000105e</color>
+ <color name="i_am_color_105f">#0000105f</color>
+ <color name="i_am_color_1060">#00001060</color>
+ <color name="i_am_color_1061">#00001061</color>
+ <color name="i_am_color_1062">#00001062</color>
+ <color name="i_am_color_1063">#00001063</color>
+ <color name="i_am_color_1064">#00001064</color>
+ <color name="i_am_color_1065">#00001065</color>
+ <color name="i_am_color_1066">#00001066</color>
+ <color name="i_am_color_1067">#00001067</color>
+ <color name="i_am_color_1068">#00001068</color>
+ <color name="i_am_color_1069">#00001069</color>
+ <color name="i_am_color_106a">#0000106a</color>
+ <color name="i_am_color_106b">#0000106b</color>
+ <color name="i_am_color_106c">#0000106c</color>
+ <color name="i_am_color_106d">#0000106d</color>
+ <color name="i_am_color_106e">#0000106e</color>
+ <color name="i_am_color_106f">#0000106f</color>
+ <color name="i_am_color_1070">#00001070</color>
+ <color name="i_am_color_1071">#00001071</color>
+ <color name="i_am_color_1072">#00001072</color>
+ <color name="i_am_color_1073">#00001073</color>
+ <color name="i_am_color_1074">#00001074</color>
+ <color name="i_am_color_1075">#00001075</color>
+ <color name="i_am_color_1076">#00001076</color>
+ <color name="i_am_color_1077">#00001077</color>
+ <color name="i_am_color_1078">#00001078</color>
+ <color name="i_am_color_1079">#00001079</color>
+ <color name="i_am_color_107a">#0000107a</color>
+ <color name="i_am_color_107b">#0000107b</color>
+ <color name="i_am_color_107c">#0000107c</color>
+ <color name="i_am_color_107d">#0000107d</color>
+ <color name="i_am_color_107e">#0000107e</color>
+ <color name="i_am_color_107f">#0000107f</color>
+ <color name="i_am_color_1080">#00001080</color>
+ <color name="i_am_color_1081">#00001081</color>
+ <color name="i_am_color_1082">#00001082</color>
+ <color name="i_am_color_1083">#00001083</color>
+ <color name="i_am_color_1084">#00001084</color>
+ <color name="i_am_color_1085">#00001085</color>
+ <color name="i_am_color_1086">#00001086</color>
+ <color name="i_am_color_1087">#00001087</color>
+ <color name="i_am_color_1088">#00001088</color>
+ <color name="i_am_color_1089">#00001089</color>
+ <color name="i_am_color_108a">#0000108a</color>
+ <color name="i_am_color_108b">#0000108b</color>
+ <color name="i_am_color_108c">#0000108c</color>
+ <color name="i_am_color_108d">#0000108d</color>
+ <color name="i_am_color_108e">#0000108e</color>
+ <color name="i_am_color_108f">#0000108f</color>
+ <color name="i_am_color_1090">#00001090</color>
+ <color name="i_am_color_1091">#00001091</color>
+ <color name="i_am_color_1092">#00001092</color>
+ <color name="i_am_color_1093">#00001093</color>
+ <color name="i_am_color_1094">#00001094</color>
+ <color name="i_am_color_1095">#00001095</color>
+ <color name="i_am_color_1096">#00001096</color>
+ <color name="i_am_color_1097">#00001097</color>
+ <color name="i_am_color_1098">#00001098</color>
+ <color name="i_am_color_1099">#00001099</color>
+ <color name="i_am_color_109a">#0000109a</color>
+ <color name="i_am_color_109b">#0000109b</color>
+ <color name="i_am_color_109c">#0000109c</color>
+ <color name="i_am_color_109d">#0000109d</color>
+ <color name="i_am_color_109e">#0000109e</color>
+ <color name="i_am_color_109f">#0000109f</color>
+ <color name="i_am_color_10a0">#000010a0</color>
+ <color name="i_am_color_10a1">#000010a1</color>
+ <color name="i_am_color_10a2">#000010a2</color>
+ <color name="i_am_color_10a3">#000010a3</color>
+ <color name="i_am_color_10a4">#000010a4</color>
+ <color name="i_am_color_10a5">#000010a5</color>
+ <color name="i_am_color_10a6">#000010a6</color>
+ <color name="i_am_color_10a7">#000010a7</color>
+ <color name="i_am_color_10a8">#000010a8</color>
+ <color name="i_am_color_10a9">#000010a9</color>
+ <color name="i_am_color_10aa">#000010aa</color>
+ <color name="i_am_color_10ab">#000010ab</color>
+ <color name="i_am_color_10ac">#000010ac</color>
+ <color name="i_am_color_10ad">#000010ad</color>
+ <color name="i_am_color_10ae">#000010ae</color>
+ <color name="i_am_color_10af">#000010af</color>
+ <color name="i_am_color_10b0">#000010b0</color>
+ <color name="i_am_color_10b1">#000010b1</color>
+ <color name="i_am_color_10b2">#000010b2</color>
+ <color name="i_am_color_10b3">#000010b3</color>
+ <color name="i_am_color_10b4">#000010b4</color>
+ <color name="i_am_color_10b5">#000010b5</color>
+ <color name="i_am_color_10b6">#000010b6</color>
+ <color name="i_am_color_10b7">#000010b7</color>
+ <color name="i_am_color_10b8">#000010b8</color>
+ <color name="i_am_color_10b9">#000010b9</color>
+ <color name="i_am_color_10ba">#000010ba</color>
+ <color name="i_am_color_10bb">#000010bb</color>
+ <color name="i_am_color_10bc">#000010bc</color>
+ <color name="i_am_color_10bd">#000010bd</color>
+ <color name="i_am_color_10be">#000010be</color>
+ <color name="i_am_color_10bf">#000010bf</color>
+ <color name="i_am_color_10c0">#000010c0</color>
+ <color name="i_am_color_10c1">#000010c1</color>
+ <color name="i_am_color_10c2">#000010c2</color>
+ <color name="i_am_color_10c3">#000010c3</color>
+ <color name="i_am_color_10c4">#000010c4</color>
+ <color name="i_am_color_10c5">#000010c5</color>
+ <color name="i_am_color_10c6">#000010c6</color>
+ <color name="i_am_color_10c7">#000010c7</color>
+ <color name="i_am_color_10c8">#000010c8</color>
+ <color name="i_am_color_10c9">#000010c9</color>
+ <color name="i_am_color_10ca">#000010ca</color>
+ <color name="i_am_color_10cb">#000010cb</color>
+ <color name="i_am_color_10cc">#000010cc</color>
+ <color name="i_am_color_10cd">#000010cd</color>
+ <color name="i_am_color_10ce">#000010ce</color>
+ <color name="i_am_color_10cf">#000010cf</color>
+ <color name="i_am_color_10d0">#000010d0</color>
+ <color name="i_am_color_10d1">#000010d1</color>
+ <color name="i_am_color_10d2">#000010d2</color>
+ <color name="i_am_color_10d3">#000010d3</color>
+ <color name="i_am_color_10d4">#000010d4</color>
+ <color name="i_am_color_10d5">#000010d5</color>
+ <color name="i_am_color_10d6">#000010d6</color>
+ <color name="i_am_color_10d7">#000010d7</color>
+ <color name="i_am_color_10d8">#000010d8</color>
+ <color name="i_am_color_10d9">#000010d9</color>
+ <color name="i_am_color_10da">#000010da</color>
+ <color name="i_am_color_10db">#000010db</color>
+ <color name="i_am_color_10dc">#000010dc</color>
+ <color name="i_am_color_10dd">#000010dd</color>
+ <color name="i_am_color_10de">#000010de</color>
+ <color name="i_am_color_10df">#000010df</color>
+ <color name="i_am_color_10e0">#000010e0</color>
+ <color name="i_am_color_10e1">#000010e1</color>
+ <color name="i_am_color_10e2">#000010e2</color>
+ <color name="i_am_color_10e3">#000010e3</color>
+ <color name="i_am_color_10e4">#000010e4</color>
+ <color name="i_am_color_10e5">#000010e5</color>
+ <color name="i_am_color_10e6">#000010e6</color>
+ <color name="i_am_color_10e7">#000010e7</color>
+ <color name="i_am_color_10e8">#000010e8</color>
+ <color name="i_am_color_10e9">#000010e9</color>
+ <color name="i_am_color_10ea">#000010ea</color>
+ <color name="i_am_color_10eb">#000010eb</color>
+ <color name="i_am_color_10ec">#000010ec</color>
+ <color name="i_am_color_10ed">#000010ed</color>
+ <color name="i_am_color_10ee">#000010ee</color>
+ <color name="i_am_color_10ef">#000010ef</color>
+ <color name="i_am_color_10f0">#000010f0</color>
+ <color name="i_am_color_10f1">#000010f1</color>
+ <color name="i_am_color_10f2">#000010f2</color>
+ <color name="i_am_color_10f3">#000010f3</color>
+ <color name="i_am_color_10f4">#000010f4</color>
+ <color name="i_am_color_10f5">#000010f5</color>
+ <color name="i_am_color_10f6">#000010f6</color>
+ <color name="i_am_color_10f7">#000010f7</color>
+ <color name="i_am_color_10f8">#000010f8</color>
+ <color name="i_am_color_10f9">#000010f9</color>
+ <color name="i_am_color_10fa">#000010fa</color>
+ <color name="i_am_color_10fb">#000010fb</color>
+ <color name="i_am_color_10fc">#000010fc</color>
+ <color name="i_am_color_10fd">#000010fd</color>
+ <color name="i_am_color_10fe">#000010fe</color>
+ <color name="i_am_color_10ff">#000010ff</color>
+ <color name="i_am_color_1100">#00001100</color>
+ <color name="i_am_color_1101">#00001101</color>
+ <color name="i_am_color_1102">#00001102</color>
+ <color name="i_am_color_1103">#00001103</color>
+ <color name="i_am_color_1104">#00001104</color>
+ <color name="i_am_color_1105">#00001105</color>
+ <color name="i_am_color_1106">#00001106</color>
+ <color name="i_am_color_1107">#00001107</color>
+ <color name="i_am_color_1108">#00001108</color>
+ <color name="i_am_color_1109">#00001109</color>
+ <color name="i_am_color_110a">#0000110a</color>
+ <color name="i_am_color_110b">#0000110b</color>
+ <color name="i_am_color_110c">#0000110c</color>
+ <color name="i_am_color_110d">#0000110d</color>
+ <color name="i_am_color_110e">#0000110e</color>
+ <color name="i_am_color_110f">#0000110f</color>
+ <color name="i_am_color_1110">#00001110</color>
+ <color name="i_am_color_1111">#00001111</color>
+ <color name="i_am_color_1112">#00001112</color>
+ <color name="i_am_color_1113">#00001113</color>
+ <color name="i_am_color_1114">#00001114</color>
+ <color name="i_am_color_1115">#00001115</color>
+ <color name="i_am_color_1116">#00001116</color>
+ <color name="i_am_color_1117">#00001117</color>
+ <color name="i_am_color_1118">#00001118</color>
+ <color name="i_am_color_1119">#00001119</color>
+ <color name="i_am_color_111a">#0000111a</color>
+ <color name="i_am_color_111b">#0000111b</color>
+ <color name="i_am_color_111c">#0000111c</color>
+ <color name="i_am_color_111d">#0000111d</color>
+ <color name="i_am_color_111e">#0000111e</color>
+ <color name="i_am_color_111f">#0000111f</color>
+ <color name="i_am_color_1120">#00001120</color>
+ <color name="i_am_color_1121">#00001121</color>
+ <color name="i_am_color_1122">#00001122</color>
+ <color name="i_am_color_1123">#00001123</color>
+ <color name="i_am_color_1124">#00001124</color>
+ <color name="i_am_color_1125">#00001125</color>
+ <color name="i_am_color_1126">#00001126</color>
+ <color name="i_am_color_1127">#00001127</color>
+ <color name="i_am_color_1128">#00001128</color>
+ <color name="i_am_color_1129">#00001129</color>
+ <color name="i_am_color_112a">#0000112a</color>
+ <color name="i_am_color_112b">#0000112b</color>
+ <color name="i_am_color_112c">#0000112c</color>
+ <color name="i_am_color_112d">#0000112d</color>
+ <color name="i_am_color_112e">#0000112e</color>
+ <color name="i_am_color_112f">#0000112f</color>
+ <color name="i_am_color_1130">#00001130</color>
+ <color name="i_am_color_1131">#00001131</color>
+ <color name="i_am_color_1132">#00001132</color>
+ <color name="i_am_color_1133">#00001133</color>
+ <color name="i_am_color_1134">#00001134</color>
+ <color name="i_am_color_1135">#00001135</color>
+ <color name="i_am_color_1136">#00001136</color>
+ <color name="i_am_color_1137">#00001137</color>
+ <color name="i_am_color_1138">#00001138</color>
+ <color name="i_am_color_1139">#00001139</color>
+ <color name="i_am_color_113a">#0000113a</color>
+ <color name="i_am_color_113b">#0000113b</color>
+ <color name="i_am_color_113c">#0000113c</color>
+ <color name="i_am_color_113d">#0000113d</color>
+ <color name="i_am_color_113e">#0000113e</color>
+ <color name="i_am_color_113f">#0000113f</color>
+ <color name="i_am_color_1140">#00001140</color>
+ <color name="i_am_color_1141">#00001141</color>
+ <color name="i_am_color_1142">#00001142</color>
+ <color name="i_am_color_1143">#00001143</color>
+ <color name="i_am_color_1144">#00001144</color>
+ <color name="i_am_color_1145">#00001145</color>
+ <color name="i_am_color_1146">#00001146</color>
+ <color name="i_am_color_1147">#00001147</color>
+ <color name="i_am_color_1148">#00001148</color>
+ <color name="i_am_color_1149">#00001149</color>
+ <color name="i_am_color_114a">#0000114a</color>
+ <color name="i_am_color_114b">#0000114b</color>
+ <color name="i_am_color_114c">#0000114c</color>
+ <color name="i_am_color_114d">#0000114d</color>
+ <color name="i_am_color_114e">#0000114e</color>
+ <color name="i_am_color_114f">#0000114f</color>
+ <color name="i_am_color_1150">#00001150</color>
+ <color name="i_am_color_1151">#00001151</color>
+ <color name="i_am_color_1152">#00001152</color>
+ <color name="i_am_color_1153">#00001153</color>
+ <color name="i_am_color_1154">#00001154</color>
+ <color name="i_am_color_1155">#00001155</color>
+ <color name="i_am_color_1156">#00001156</color>
+ <color name="i_am_color_1157">#00001157</color>
+ <color name="i_am_color_1158">#00001158</color>
+ <color name="i_am_color_1159">#00001159</color>
+ <color name="i_am_color_115a">#0000115a</color>
+ <color name="i_am_color_115b">#0000115b</color>
+ <color name="i_am_color_115c">#0000115c</color>
+ <color name="i_am_color_115d">#0000115d</color>
+ <color name="i_am_color_115e">#0000115e</color>
+ <color name="i_am_color_115f">#0000115f</color>
+ <color name="i_am_color_1160">#00001160</color>
+ <color name="i_am_color_1161">#00001161</color>
+ <color name="i_am_color_1162">#00001162</color>
+ <color name="i_am_color_1163">#00001163</color>
+ <color name="i_am_color_1164">#00001164</color>
+ <color name="i_am_color_1165">#00001165</color>
+ <color name="i_am_color_1166">#00001166</color>
+ <color name="i_am_color_1167">#00001167</color>
+ <color name="i_am_color_1168">#00001168</color>
+ <color name="i_am_color_1169">#00001169</color>
+ <color name="i_am_color_116a">#0000116a</color>
+ <color name="i_am_color_116b">#0000116b</color>
+ <color name="i_am_color_116c">#0000116c</color>
+ <color name="i_am_color_116d">#0000116d</color>
+ <color name="i_am_color_116e">#0000116e</color>
+ <color name="i_am_color_116f">#0000116f</color>
+ <color name="i_am_color_1170">#00001170</color>
+ <color name="i_am_color_1171">#00001171</color>
+ <color name="i_am_color_1172">#00001172</color>
+ <color name="i_am_color_1173">#00001173</color>
+ <color name="i_am_color_1174">#00001174</color>
+ <color name="i_am_color_1175">#00001175</color>
+ <color name="i_am_color_1176">#00001176</color>
+ <color name="i_am_color_1177">#00001177</color>
+ <color name="i_am_color_1178">#00001178</color>
+ <color name="i_am_color_1179">#00001179</color>
+ <color name="i_am_color_117a">#0000117a</color>
+ <color name="i_am_color_117b">#0000117b</color>
+ <color name="i_am_color_117c">#0000117c</color>
+ <color name="i_am_color_117d">#0000117d</color>
+ <color name="i_am_color_117e">#0000117e</color>
+ <color name="i_am_color_117f">#0000117f</color>
+ <color name="i_am_color_1180">#00001180</color>
+ <color name="i_am_color_1181">#00001181</color>
+ <color name="i_am_color_1182">#00001182</color>
+ <color name="i_am_color_1183">#00001183</color>
+ <color name="i_am_color_1184">#00001184</color>
+ <color name="i_am_color_1185">#00001185</color>
+ <color name="i_am_color_1186">#00001186</color>
+ <color name="i_am_color_1187">#00001187</color>
+ <color name="i_am_color_1188">#00001188</color>
+ <color name="i_am_color_1189">#00001189</color>
+ <color name="i_am_color_118a">#0000118a</color>
+ <color name="i_am_color_118b">#0000118b</color>
+ <color name="i_am_color_118c">#0000118c</color>
+ <color name="i_am_color_118d">#0000118d</color>
+ <color name="i_am_color_118e">#0000118e</color>
+ <color name="i_am_color_118f">#0000118f</color>
+ <color name="i_am_color_1190">#00001190</color>
+ <color name="i_am_color_1191">#00001191</color>
+ <color name="i_am_color_1192">#00001192</color>
+ <color name="i_am_color_1193">#00001193</color>
+ <color name="i_am_color_1194">#00001194</color>
+ <color name="i_am_color_1195">#00001195</color>
+ <color name="i_am_color_1196">#00001196</color>
+ <color name="i_am_color_1197">#00001197</color>
+ <color name="i_am_color_1198">#00001198</color>
+ <color name="i_am_color_1199">#00001199</color>
+ <color name="i_am_color_119a">#0000119a</color>
+ <color name="i_am_color_119b">#0000119b</color>
+ <color name="i_am_color_119c">#0000119c</color>
+ <color name="i_am_color_119d">#0000119d</color>
+ <color name="i_am_color_119e">#0000119e</color>
+ <color name="i_am_color_119f">#0000119f</color>
+ <color name="i_am_color_11a0">#000011a0</color>
+ <color name="i_am_color_11a1">#000011a1</color>
+ <color name="i_am_color_11a2">#000011a2</color>
+ <color name="i_am_color_11a3">#000011a3</color>
+ <color name="i_am_color_11a4">#000011a4</color>
+ <color name="i_am_color_11a5">#000011a5</color>
+ <color name="i_am_color_11a6">#000011a6</color>
+ <color name="i_am_color_11a7">#000011a7</color>
+ <color name="i_am_color_11a8">#000011a8</color>
+ <color name="i_am_color_11a9">#000011a9</color>
+ <color name="i_am_color_11aa">#000011aa</color>
+ <color name="i_am_color_11ab">#000011ab</color>
+ <color name="i_am_color_11ac">#000011ac</color>
+ <color name="i_am_color_11ad">#000011ad</color>
+ <color name="i_am_color_11ae">#000011ae</color>
+ <color name="i_am_color_11af">#000011af</color>
+ <color name="i_am_color_11b0">#000011b0</color>
+ <color name="i_am_color_11b1">#000011b1</color>
+ <color name="i_am_color_11b2">#000011b2</color>
+ <color name="i_am_color_11b3">#000011b3</color>
+ <color name="i_am_color_11b4">#000011b4</color>
+ <color name="i_am_color_11b5">#000011b5</color>
+ <color name="i_am_color_11b6">#000011b6</color>
+ <color name="i_am_color_11b7">#000011b7</color>
+ <color name="i_am_color_11b8">#000011b8</color>
+ <color name="i_am_color_11b9">#000011b9</color>
+ <color name="i_am_color_11ba">#000011ba</color>
+ <color name="i_am_color_11bb">#000011bb</color>
+ <color name="i_am_color_11bc">#000011bc</color>
+ <color name="i_am_color_11bd">#000011bd</color>
+ <color name="i_am_color_11be">#000011be</color>
+ <color name="i_am_color_11bf">#000011bf</color>
+ <color name="i_am_color_11c0">#000011c0</color>
+ <color name="i_am_color_11c1">#000011c1</color>
+ <color name="i_am_color_11c2">#000011c2</color>
+ <color name="i_am_color_11c3">#000011c3</color>
+ <color name="i_am_color_11c4">#000011c4</color>
+ <color name="i_am_color_11c5">#000011c5</color>
+ <color name="i_am_color_11c6">#000011c6</color>
+ <color name="i_am_color_11c7">#000011c7</color>
+ <color name="i_am_color_11c8">#000011c8</color>
+ <color name="i_am_color_11c9">#000011c9</color>
+ <color name="i_am_color_11ca">#000011ca</color>
+ <color name="i_am_color_11cb">#000011cb</color>
+ <color name="i_am_color_11cc">#000011cc</color>
+ <color name="i_am_color_11cd">#000011cd</color>
+ <color name="i_am_color_11ce">#000011ce</color>
+ <color name="i_am_color_11cf">#000011cf</color>
+ <color name="i_am_color_11d0">#000011d0</color>
+ <color name="i_am_color_11d1">#000011d1</color>
+ <color name="i_am_color_11d2">#000011d2</color>
+ <color name="i_am_color_11d3">#000011d3</color>
+ <color name="i_am_color_11d4">#000011d4</color>
+ <color name="i_am_color_11d5">#000011d5</color>
+ <color name="i_am_color_11d6">#000011d6</color>
+ <color name="i_am_color_11d7">#000011d7</color>
+ <color name="i_am_color_11d8">#000011d8</color>
+ <color name="i_am_color_11d9">#000011d9</color>
+ <color name="i_am_color_11da">#000011da</color>
+ <color name="i_am_color_11db">#000011db</color>
+ <color name="i_am_color_11dc">#000011dc</color>
+ <color name="i_am_color_11dd">#000011dd</color>
+ <color name="i_am_color_11de">#000011de</color>
+ <color name="i_am_color_11df">#000011df</color>
+ <color name="i_am_color_11e0">#000011e0</color>
+ <color name="i_am_color_11e1">#000011e1</color>
+ <color name="i_am_color_11e2">#000011e2</color>
+ <color name="i_am_color_11e3">#000011e3</color>
+ <color name="i_am_color_11e4">#000011e4</color>
+ <color name="i_am_color_11e5">#000011e5</color>
+ <color name="i_am_color_11e6">#000011e6</color>
+ <color name="i_am_color_11e7">#000011e7</color>
+ <color name="i_am_color_11e8">#000011e8</color>
+ <color name="i_am_color_11e9">#000011e9</color>
+ <color name="i_am_color_11ea">#000011ea</color>
+ <color name="i_am_color_11eb">#000011eb</color>
+ <color name="i_am_color_11ec">#000011ec</color>
+ <color name="i_am_color_11ed">#000011ed</color>
+ <color name="i_am_color_11ee">#000011ee</color>
+ <color name="i_am_color_11ef">#000011ef</color>
+ <color name="i_am_color_11f0">#000011f0</color>
+ <color name="i_am_color_11f1">#000011f1</color>
+ <color name="i_am_color_11f2">#000011f2</color>
+ <color name="i_am_color_11f3">#000011f3</color>
+ <color name="i_am_color_11f4">#000011f4</color>
+ <color name="i_am_color_11f5">#000011f5</color>
+ <color name="i_am_color_11f6">#000011f6</color>
+ <color name="i_am_color_11f7">#000011f7</color>
+ <color name="i_am_color_11f8">#000011f8</color>
+ <color name="i_am_color_11f9">#000011f9</color>
+ <color name="i_am_color_11fa">#000011fa</color>
+ <color name="i_am_color_11fb">#000011fb</color>
+ <color name="i_am_color_11fc">#000011fc</color>
+ <color name="i_am_color_11fd">#000011fd</color>
+ <color name="i_am_color_11fe">#000011fe</color>
+ <color name="i_am_color_11ff">#000011ff</color>
+ <color name="i_am_color_1200">#00001200</color>
+ <color name="i_am_color_1201">#00001201</color>
+ <color name="i_am_color_1202">#00001202</color>
+ <color name="i_am_color_1203">#00001203</color>
+ <color name="i_am_color_1204">#00001204</color>
+ <color name="i_am_color_1205">#00001205</color>
+ <color name="i_am_color_1206">#00001206</color>
+ <color name="i_am_color_1207">#00001207</color>
+ <color name="i_am_color_1208">#00001208</color>
+ <color name="i_am_color_1209">#00001209</color>
+ <color name="i_am_color_120a">#0000120a</color>
+ <color name="i_am_color_120b">#0000120b</color>
+ <color name="i_am_color_120c">#0000120c</color>
+ <color name="i_am_color_120d">#0000120d</color>
+ <color name="i_am_color_120e">#0000120e</color>
+ <color name="i_am_color_120f">#0000120f</color>
+ <color name="i_am_color_1210">#00001210</color>
+ <color name="i_am_color_1211">#00001211</color>
+ <color name="i_am_color_1212">#00001212</color>
+ <color name="i_am_color_1213">#00001213</color>
+ <color name="i_am_color_1214">#00001214</color>
+ <color name="i_am_color_1215">#00001215</color>
+ <color name="i_am_color_1216">#00001216</color>
+ <color name="i_am_color_1217">#00001217</color>
+ <color name="i_am_color_1218">#00001218</color>
+ <color name="i_am_color_1219">#00001219</color>
+ <color name="i_am_color_121a">#0000121a</color>
+ <color name="i_am_color_121b">#0000121b</color>
+ <color name="i_am_color_121c">#0000121c</color>
+ <color name="i_am_color_121d">#0000121d</color>
+ <color name="i_am_color_121e">#0000121e</color>
+ <color name="i_am_color_121f">#0000121f</color>
+ <color name="i_am_color_1220">#00001220</color>
+ <color name="i_am_color_1221">#00001221</color>
+ <color name="i_am_color_1222">#00001222</color>
+ <color name="i_am_color_1223">#00001223</color>
+ <color name="i_am_color_1224">#00001224</color>
+ <color name="i_am_color_1225">#00001225</color>
+ <color name="i_am_color_1226">#00001226</color>
+ <color name="i_am_color_1227">#00001227</color>
+ <color name="i_am_color_1228">#00001228</color>
+ <color name="i_am_color_1229">#00001229</color>
+ <color name="i_am_color_122a">#0000122a</color>
+ <color name="i_am_color_122b">#0000122b</color>
+ <color name="i_am_color_122c">#0000122c</color>
+ <color name="i_am_color_122d">#0000122d</color>
+ <color name="i_am_color_122e">#0000122e</color>
+ <color name="i_am_color_122f">#0000122f</color>
+ <color name="i_am_color_1230">#00001230</color>
+ <color name="i_am_color_1231">#00001231</color>
+ <color name="i_am_color_1232">#00001232</color>
+ <color name="i_am_color_1233">#00001233</color>
+ <color name="i_am_color_1234">#00001234</color>
+ <color name="i_am_color_1235">#00001235</color>
+ <color name="i_am_color_1236">#00001236</color>
+ <color name="i_am_color_1237">#00001237</color>
+ <color name="i_am_color_1238">#00001238</color>
+ <color name="i_am_color_1239">#00001239</color>
+ <color name="i_am_color_123a">#0000123a</color>
+ <color name="i_am_color_123b">#0000123b</color>
+ <color name="i_am_color_123c">#0000123c</color>
+ <color name="i_am_color_123d">#0000123d</color>
+ <color name="i_am_color_123e">#0000123e</color>
+ <color name="i_am_color_123f">#0000123f</color>
+ <color name="i_am_color_1240">#00001240</color>
+ <color name="i_am_color_1241">#00001241</color>
+ <color name="i_am_color_1242">#00001242</color>
+ <color name="i_am_color_1243">#00001243</color>
+ <color name="i_am_color_1244">#00001244</color>
+ <color name="i_am_color_1245">#00001245</color>
+ <color name="i_am_color_1246">#00001246</color>
+ <color name="i_am_color_1247">#00001247</color>
+ <color name="i_am_color_1248">#00001248</color>
+ <color name="i_am_color_1249">#00001249</color>
+ <color name="i_am_color_124a">#0000124a</color>
+ <color name="i_am_color_124b">#0000124b</color>
+ <color name="i_am_color_124c">#0000124c</color>
+ <color name="i_am_color_124d">#0000124d</color>
+ <color name="i_am_color_124e">#0000124e</color>
+ <color name="i_am_color_124f">#0000124f</color>
+ <color name="i_am_color_1250">#00001250</color>
+ <color name="i_am_color_1251">#00001251</color>
+ <color name="i_am_color_1252">#00001252</color>
+ <color name="i_am_color_1253">#00001253</color>
+ <color name="i_am_color_1254">#00001254</color>
+ <color name="i_am_color_1255">#00001255</color>
+ <color name="i_am_color_1256">#00001256</color>
+ <color name="i_am_color_1257">#00001257</color>
+ <color name="i_am_color_1258">#00001258</color>
+ <color name="i_am_color_1259">#00001259</color>
+ <color name="i_am_color_125a">#0000125a</color>
+ <color name="i_am_color_125b">#0000125b</color>
+ <color name="i_am_color_125c">#0000125c</color>
+ <color name="i_am_color_125d">#0000125d</color>
+ <color name="i_am_color_125e">#0000125e</color>
+ <color name="i_am_color_125f">#0000125f</color>
+ <color name="i_am_color_1260">#00001260</color>
+ <color name="i_am_color_1261">#00001261</color>
+ <color name="i_am_color_1262">#00001262</color>
+ <color name="i_am_color_1263">#00001263</color>
+ <color name="i_am_color_1264">#00001264</color>
+ <color name="i_am_color_1265">#00001265</color>
+ <color name="i_am_color_1266">#00001266</color>
+ <color name="i_am_color_1267">#00001267</color>
+ <color name="i_am_color_1268">#00001268</color>
+ <color name="i_am_color_1269">#00001269</color>
+ <color name="i_am_color_126a">#0000126a</color>
+ <color name="i_am_color_126b">#0000126b</color>
+ <color name="i_am_color_126c">#0000126c</color>
+ <color name="i_am_color_126d">#0000126d</color>
+ <color name="i_am_color_126e">#0000126e</color>
+ <color name="i_am_color_126f">#0000126f</color>
+ <color name="i_am_color_1270">#00001270</color>
+ <color name="i_am_color_1271">#00001271</color>
+ <color name="i_am_color_1272">#00001272</color>
+ <color name="i_am_color_1273">#00001273</color>
+ <color name="i_am_color_1274">#00001274</color>
+ <color name="i_am_color_1275">#00001275</color>
+ <color name="i_am_color_1276">#00001276</color>
+ <color name="i_am_color_1277">#00001277</color>
+ <color name="i_am_color_1278">#00001278</color>
+ <color name="i_am_color_1279">#00001279</color>
+ <color name="i_am_color_127a">#0000127a</color>
+ <color name="i_am_color_127b">#0000127b</color>
+ <color name="i_am_color_127c">#0000127c</color>
+ <color name="i_am_color_127d">#0000127d</color>
+ <color name="i_am_color_127e">#0000127e</color>
+ <color name="i_am_color_127f">#0000127f</color>
+ <color name="i_am_color_1280">#00001280</color>
+ <color name="i_am_color_1281">#00001281</color>
+ <color name="i_am_color_1282">#00001282</color>
+ <color name="i_am_color_1283">#00001283</color>
+ <color name="i_am_color_1284">#00001284</color>
+ <color name="i_am_color_1285">#00001285</color>
+ <color name="i_am_color_1286">#00001286</color>
+ <color name="i_am_color_1287">#00001287</color>
+ <color name="i_am_color_1288">#00001288</color>
+ <color name="i_am_color_1289">#00001289</color>
+ <color name="i_am_color_128a">#0000128a</color>
+ <color name="i_am_color_128b">#0000128b</color>
+ <color name="i_am_color_128c">#0000128c</color>
+ <color name="i_am_color_128d">#0000128d</color>
+ <color name="i_am_color_128e">#0000128e</color>
+ <color name="i_am_color_128f">#0000128f</color>
+ <color name="i_am_color_1290">#00001290</color>
+ <color name="i_am_color_1291">#00001291</color>
+ <color name="i_am_color_1292">#00001292</color>
+ <color name="i_am_color_1293">#00001293</color>
+ <color name="i_am_color_1294">#00001294</color>
+ <color name="i_am_color_1295">#00001295</color>
+ <color name="i_am_color_1296">#00001296</color>
+ <color name="i_am_color_1297">#00001297</color>
+ <color name="i_am_color_1298">#00001298</color>
+ <color name="i_am_color_1299">#00001299</color>
+ <color name="i_am_color_129a">#0000129a</color>
+ <color name="i_am_color_129b">#0000129b</color>
+ <color name="i_am_color_129c">#0000129c</color>
+ <color name="i_am_color_129d">#0000129d</color>
+ <color name="i_am_color_129e">#0000129e</color>
+ <color name="i_am_color_129f">#0000129f</color>
+ <color name="i_am_color_12a0">#000012a0</color>
+ <color name="i_am_color_12a1">#000012a1</color>
+ <color name="i_am_color_12a2">#000012a2</color>
+ <color name="i_am_color_12a3">#000012a3</color>
+ <color name="i_am_color_12a4">#000012a4</color>
+ <color name="i_am_color_12a5">#000012a5</color>
+ <color name="i_am_color_12a6">#000012a6</color>
+ <color name="i_am_color_12a7">#000012a7</color>
+ <color name="i_am_color_12a8">#000012a8</color>
+ <color name="i_am_color_12a9">#000012a9</color>
+ <color name="i_am_color_12aa">#000012aa</color>
+ <color name="i_am_color_12ab">#000012ab</color>
+ <color name="i_am_color_12ac">#000012ac</color>
+ <color name="i_am_color_12ad">#000012ad</color>
+ <color name="i_am_color_12ae">#000012ae</color>
+ <color name="i_am_color_12af">#000012af</color>
+ <color name="i_am_color_12b0">#000012b0</color>
+ <color name="i_am_color_12b1">#000012b1</color>
+ <color name="i_am_color_12b2">#000012b2</color>
+ <color name="i_am_color_12b3">#000012b3</color>
+ <color name="i_am_color_12b4">#000012b4</color>
+ <color name="i_am_color_12b5">#000012b5</color>
+ <color name="i_am_color_12b6">#000012b6</color>
+ <color name="i_am_color_12b7">#000012b7</color>
+ <color name="i_am_color_12b8">#000012b8</color>
+ <color name="i_am_color_12b9">#000012b9</color>
+ <color name="i_am_color_12ba">#000012ba</color>
+ <color name="i_am_color_12bb">#000012bb</color>
+ <color name="i_am_color_12bc">#000012bc</color>
+ <color name="i_am_color_12bd">#000012bd</color>
+ <color name="i_am_color_12be">#000012be</color>
+ <color name="i_am_color_12bf">#000012bf</color>
+ <color name="i_am_color_12c0">#000012c0</color>
+ <color name="i_am_color_12c1">#000012c1</color>
+ <color name="i_am_color_12c2">#000012c2</color>
+ <color name="i_am_color_12c3">#000012c3</color>
+ <color name="i_am_color_12c4">#000012c4</color>
+ <color name="i_am_color_12c5">#000012c5</color>
+ <color name="i_am_color_12c6">#000012c6</color>
+ <color name="i_am_color_12c7">#000012c7</color>
+ <color name="i_am_color_12c8">#000012c8</color>
+ <color name="i_am_color_12c9">#000012c9</color>
+ <color name="i_am_color_12ca">#000012ca</color>
+ <color name="i_am_color_12cb">#000012cb</color>
+ <color name="i_am_color_12cc">#000012cc</color>
+ <color name="i_am_color_12cd">#000012cd</color>
+ <color name="i_am_color_12ce">#000012ce</color>
+ <color name="i_am_color_12cf">#000012cf</color>
+ <color name="i_am_color_12d0">#000012d0</color>
+ <color name="i_am_color_12d1">#000012d1</color>
+ <color name="i_am_color_12d2">#000012d2</color>
+ <color name="i_am_color_12d3">#000012d3</color>
+ <color name="i_am_color_12d4">#000012d4</color>
+ <color name="i_am_color_12d5">#000012d5</color>
+ <color name="i_am_color_12d6">#000012d6</color>
+ <color name="i_am_color_12d7">#000012d7</color>
+ <color name="i_am_color_12d8">#000012d8</color>
+ <color name="i_am_color_12d9">#000012d9</color>
+ <color name="i_am_color_12da">#000012da</color>
+ <color name="i_am_color_12db">#000012db</color>
+ <color name="i_am_color_12dc">#000012dc</color>
+ <color name="i_am_color_12dd">#000012dd</color>
+ <color name="i_am_color_12de">#000012de</color>
+ <color name="i_am_color_12df">#000012df</color>
+ <color name="i_am_color_12e0">#000012e0</color>
+ <color name="i_am_color_12e1">#000012e1</color>
+ <color name="i_am_color_12e2">#000012e2</color>
+ <color name="i_am_color_12e3">#000012e3</color>
+ <color name="i_am_color_12e4">#000012e4</color>
+ <color name="i_am_color_12e5">#000012e5</color>
+ <color name="i_am_color_12e6">#000012e6</color>
+ <color name="i_am_color_12e7">#000012e7</color>
+ <color name="i_am_color_12e8">#000012e8</color>
+ <color name="i_am_color_12e9">#000012e9</color>
+ <color name="i_am_color_12ea">#000012ea</color>
+ <color name="i_am_color_12eb">#000012eb</color>
+ <color name="i_am_color_12ec">#000012ec</color>
+ <color name="i_am_color_12ed">#000012ed</color>
+ <color name="i_am_color_12ee">#000012ee</color>
+ <color name="i_am_color_12ef">#000012ef</color>
+ <color name="i_am_color_12f0">#000012f0</color>
+ <color name="i_am_color_12f1">#000012f1</color>
+ <color name="i_am_color_12f2">#000012f2</color>
+ <color name="i_am_color_12f3">#000012f3</color>
+ <color name="i_am_color_12f4">#000012f4</color>
+ <color name="i_am_color_12f5">#000012f5</color>
+ <color name="i_am_color_12f6">#000012f6</color>
+ <color name="i_am_color_12f7">#000012f7</color>
+ <color name="i_am_color_12f8">#000012f8</color>
+ <color name="i_am_color_12f9">#000012f9</color>
+ <color name="i_am_color_12fa">#000012fa</color>
+ <color name="i_am_color_12fb">#000012fb</color>
+ <color name="i_am_color_12fc">#000012fc</color>
+ <color name="i_am_color_12fd">#000012fd</color>
+ <color name="i_am_color_12fe">#000012fe</color>
+ <color name="i_am_color_12ff">#000012ff</color>
+ <color name="i_am_color_1300">#00001300</color>
+ <color name="i_am_color_1301">#00001301</color>
+ <color name="i_am_color_1302">#00001302</color>
+ <color name="i_am_color_1303">#00001303</color>
+ <color name="i_am_color_1304">#00001304</color>
+ <color name="i_am_color_1305">#00001305</color>
+ <color name="i_am_color_1306">#00001306</color>
+ <color name="i_am_color_1307">#00001307</color>
+ <color name="i_am_color_1308">#00001308</color>
+ <color name="i_am_color_1309">#00001309</color>
+ <color name="i_am_color_130a">#0000130a</color>
+ <color name="i_am_color_130b">#0000130b</color>
+ <color name="i_am_color_130c">#0000130c</color>
+ <color name="i_am_color_130d">#0000130d</color>
+ <color name="i_am_color_130e">#0000130e</color>
+ <color name="i_am_color_130f">#0000130f</color>
+ <color name="i_am_color_1310">#00001310</color>
+ <color name="i_am_color_1311">#00001311</color>
+ <color name="i_am_color_1312">#00001312</color>
+ <color name="i_am_color_1313">#00001313</color>
+ <color name="i_am_color_1314">#00001314</color>
+ <color name="i_am_color_1315">#00001315</color>
+ <color name="i_am_color_1316">#00001316</color>
+ <color name="i_am_color_1317">#00001317</color>
+ <color name="i_am_color_1318">#00001318</color>
+ <color name="i_am_color_1319">#00001319</color>
+ <color name="i_am_color_131a">#0000131a</color>
+ <color name="i_am_color_131b">#0000131b</color>
+ <color name="i_am_color_131c">#0000131c</color>
+ <color name="i_am_color_131d">#0000131d</color>
+ <color name="i_am_color_131e">#0000131e</color>
+ <color name="i_am_color_131f">#0000131f</color>
+ <color name="i_am_color_1320">#00001320</color>
+ <color name="i_am_color_1321">#00001321</color>
+ <color name="i_am_color_1322">#00001322</color>
+ <color name="i_am_color_1323">#00001323</color>
+ <color name="i_am_color_1324">#00001324</color>
+ <color name="i_am_color_1325">#00001325</color>
+ <color name="i_am_color_1326">#00001326</color>
+ <color name="i_am_color_1327">#00001327</color>
+ <color name="i_am_color_1328">#00001328</color>
+ <color name="i_am_color_1329">#00001329</color>
+ <color name="i_am_color_132a">#0000132a</color>
+ <color name="i_am_color_132b">#0000132b</color>
+ <color name="i_am_color_132c">#0000132c</color>
+ <color name="i_am_color_132d">#0000132d</color>
+ <color name="i_am_color_132e">#0000132e</color>
+ <color name="i_am_color_132f">#0000132f</color>
+ <color name="i_am_color_1330">#00001330</color>
+ <color name="i_am_color_1331">#00001331</color>
+ <color name="i_am_color_1332">#00001332</color>
+ <color name="i_am_color_1333">#00001333</color>
+ <color name="i_am_color_1334">#00001334</color>
+ <color name="i_am_color_1335">#00001335</color>
+ <color name="i_am_color_1336">#00001336</color>
+ <color name="i_am_color_1337">#00001337</color>
+ <color name="i_am_color_1338">#00001338</color>
+ <color name="i_am_color_1339">#00001339</color>
+ <color name="i_am_color_133a">#0000133a</color>
+ <color name="i_am_color_133b">#0000133b</color>
+ <color name="i_am_color_133c">#0000133c</color>
+ <color name="i_am_color_133d">#0000133d</color>
+ <color name="i_am_color_133e">#0000133e</color>
+ <color name="i_am_color_133f">#0000133f</color>
+ <color name="i_am_color_1340">#00001340</color>
+ <color name="i_am_color_1341">#00001341</color>
+ <color name="i_am_color_1342">#00001342</color>
+ <color name="i_am_color_1343">#00001343</color>
+ <color name="i_am_color_1344">#00001344</color>
+ <color name="i_am_color_1345">#00001345</color>
+ <color name="i_am_color_1346">#00001346</color>
+ <color name="i_am_color_1347">#00001347</color>
+ <color name="i_am_color_1348">#00001348</color>
+ <color name="i_am_color_1349">#00001349</color>
+ <color name="i_am_color_134a">#0000134a</color>
+ <color name="i_am_color_134b">#0000134b</color>
+ <color name="i_am_color_134c">#0000134c</color>
+ <color name="i_am_color_134d">#0000134d</color>
+ <color name="i_am_color_134e">#0000134e</color>
+ <color name="i_am_color_134f">#0000134f</color>
+ <color name="i_am_color_1350">#00001350</color>
+ <color name="i_am_color_1351">#00001351</color>
+ <color name="i_am_color_1352">#00001352</color>
+ <color name="i_am_color_1353">#00001353</color>
+ <color name="i_am_color_1354">#00001354</color>
+ <color name="i_am_color_1355">#00001355</color>
+ <color name="i_am_color_1356">#00001356</color>
+ <color name="i_am_color_1357">#00001357</color>
+ <color name="i_am_color_1358">#00001358</color>
+ <color name="i_am_color_1359">#00001359</color>
+ <color name="i_am_color_135a">#0000135a</color>
+ <color name="i_am_color_135b">#0000135b</color>
+ <color name="i_am_color_135c">#0000135c</color>
+ <color name="i_am_color_135d">#0000135d</color>
+ <color name="i_am_color_135e">#0000135e</color>
+ <color name="i_am_color_135f">#0000135f</color>
+ <color name="i_am_color_1360">#00001360</color>
+ <color name="i_am_color_1361">#00001361</color>
+ <color name="i_am_color_1362">#00001362</color>
+ <color name="i_am_color_1363">#00001363</color>
+ <color name="i_am_color_1364">#00001364</color>
+ <color name="i_am_color_1365">#00001365</color>
+ <color name="i_am_color_1366">#00001366</color>
+ <color name="i_am_color_1367">#00001367</color>
+ <color name="i_am_color_1368">#00001368</color>
+ <color name="i_am_color_1369">#00001369</color>
+ <color name="i_am_color_136a">#0000136a</color>
+ <color name="i_am_color_136b">#0000136b</color>
+ <color name="i_am_color_136c">#0000136c</color>
+ <color name="i_am_color_136d">#0000136d</color>
+ <color name="i_am_color_136e">#0000136e</color>
+ <color name="i_am_color_136f">#0000136f</color>
+ <color name="i_am_color_1370">#00001370</color>
+ <color name="i_am_color_1371">#00001371</color>
+ <color name="i_am_color_1372">#00001372</color>
+ <color name="i_am_color_1373">#00001373</color>
+ <color name="i_am_color_1374">#00001374</color>
+ <color name="i_am_color_1375">#00001375</color>
+ <color name="i_am_color_1376">#00001376</color>
+ <color name="i_am_color_1377">#00001377</color>
+ <color name="i_am_color_1378">#00001378</color>
+ <color name="i_am_color_1379">#00001379</color>
+ <color name="i_am_color_137a">#0000137a</color>
+ <color name="i_am_color_137b">#0000137b</color>
+ <color name="i_am_color_137c">#0000137c</color>
+ <color name="i_am_color_137d">#0000137d</color>
+ <color name="i_am_color_137e">#0000137e</color>
+ <color name="i_am_color_137f">#0000137f</color>
+ <color name="i_am_color_1380">#00001380</color>
+ <color name="i_am_color_1381">#00001381</color>
+ <color name="i_am_color_1382">#00001382</color>
+ <color name="i_am_color_1383">#00001383</color>
+ <color name="i_am_color_1384">#00001384</color>
+ <color name="i_am_color_1385">#00001385</color>
+ <color name="i_am_color_1386">#00001386</color>
+ <color name="i_am_color_1387">#00001387</color>
+ <color name="i_am_color_1388">#00001388</color>
+ <color name="i_am_color_1389">#00001389</color>
+ <color name="i_am_color_138a">#0000138a</color>
+ <color name="i_am_color_138b">#0000138b</color>
+ <color name="i_am_color_138c">#0000138c</color>
+ <color name="i_am_color_138d">#0000138d</color>
+ <color name="i_am_color_138e">#0000138e</color>
+ <color name="i_am_color_138f">#0000138f</color>
+ <color name="i_am_color_1390">#00001390</color>
+ <color name="i_am_color_1391">#00001391</color>
+ <color name="i_am_color_1392">#00001392</color>
+ <color name="i_am_color_1393">#00001393</color>
+ <color name="i_am_color_1394">#00001394</color>
+ <color name="i_am_color_1395">#00001395</color>
+ <color name="i_am_color_1396">#00001396</color>
+ <color name="i_am_color_1397">#00001397</color>
+ <color name="i_am_color_1398">#00001398</color>
+ <color name="i_am_color_1399">#00001399</color>
+ <color name="i_am_color_139a">#0000139a</color>
+ <color name="i_am_color_139b">#0000139b</color>
+ <color name="i_am_color_139c">#0000139c</color>
+ <color name="i_am_color_139d">#0000139d</color>
+ <color name="i_am_color_139e">#0000139e</color>
+ <color name="i_am_color_139f">#0000139f</color>
+ <color name="i_am_color_13a0">#000013a0</color>
+ <color name="i_am_color_13a1">#000013a1</color>
+ <color name="i_am_color_13a2">#000013a2</color>
+ <color name="i_am_color_13a3">#000013a3</color>
+ <color name="i_am_color_13a4">#000013a4</color>
+ <color name="i_am_color_13a5">#000013a5</color>
+ <color name="i_am_color_13a6">#000013a6</color>
+ <color name="i_am_color_13a7">#000013a7</color>
+ <color name="i_am_color_13a8">#000013a8</color>
+ <color name="i_am_color_13a9">#000013a9</color>
+ <color name="i_am_color_13aa">#000013aa</color>
+ <color name="i_am_color_13ab">#000013ab</color>
+ <color name="i_am_color_13ac">#000013ac</color>
+ <color name="i_am_color_13ad">#000013ad</color>
+ <color name="i_am_color_13ae">#000013ae</color>
+ <color name="i_am_color_13af">#000013af</color>
+ <color name="i_am_color_13b0">#000013b0</color>
+ <color name="i_am_color_13b1">#000013b1</color>
+ <color name="i_am_color_13b2">#000013b2</color>
+ <color name="i_am_color_13b3">#000013b3</color>
+ <color name="i_am_color_13b4">#000013b4</color>
+ <color name="i_am_color_13b5">#000013b5</color>
+ <color name="i_am_color_13b6">#000013b6</color>
+ <color name="i_am_color_13b7">#000013b7</color>
+ <color name="i_am_color_13b8">#000013b8</color>
+ <color name="i_am_color_13b9">#000013b9</color>
+ <color name="i_am_color_13ba">#000013ba</color>
+ <color name="i_am_color_13bb">#000013bb</color>
+ <color name="i_am_color_13bc">#000013bc</color>
+ <color name="i_am_color_13bd">#000013bd</color>
+ <color name="i_am_color_13be">#000013be</color>
+ <color name="i_am_color_13bf">#000013bf</color>
+ <color name="i_am_color_13c0">#000013c0</color>
+ <color name="i_am_color_13c1">#000013c1</color>
+ <color name="i_am_color_13c2">#000013c2</color>
+ <color name="i_am_color_13c3">#000013c3</color>
+ <color name="i_am_color_13c4">#000013c4</color>
+ <color name="i_am_color_13c5">#000013c5</color>
+ <color name="i_am_color_13c6">#000013c6</color>
+ <color name="i_am_color_13c7">#000013c7</color>
+ <color name="i_am_color_13c8">#000013c8</color>
+ <color name="i_am_color_13c9">#000013c9</color>
+ <color name="i_am_color_13ca">#000013ca</color>
+ <color name="i_am_color_13cb">#000013cb</color>
+ <color name="i_am_color_13cc">#000013cc</color>
+ <color name="i_am_color_13cd">#000013cd</color>
+ <color name="i_am_color_13ce">#000013ce</color>
+ <color name="i_am_color_13cf">#000013cf</color>
+ <color name="i_am_color_13d0">#000013d0</color>
+ <color name="i_am_color_13d1">#000013d1</color>
+ <color name="i_am_color_13d2">#000013d2</color>
+ <color name="i_am_color_13d3">#000013d3</color>
+ <color name="i_am_color_13d4">#000013d4</color>
+ <color name="i_am_color_13d5">#000013d5</color>
+ <color name="i_am_color_13d6">#000013d6</color>
+ <color name="i_am_color_13d7">#000013d7</color>
+ <color name="i_am_color_13d8">#000013d8</color>
+ <color name="i_am_color_13d9">#000013d9</color>
+ <color name="i_am_color_13da">#000013da</color>
+ <color name="i_am_color_13db">#000013db</color>
+ <color name="i_am_color_13dc">#000013dc</color>
+ <color name="i_am_color_13dd">#000013dd</color>
+ <color name="i_am_color_13de">#000013de</color>
+ <color name="i_am_color_13df">#000013df</color>
+ <color name="i_am_color_13e0">#000013e0</color>
+ <color name="i_am_color_13e1">#000013e1</color>
+ <color name="i_am_color_13e2">#000013e2</color>
+ <color name="i_am_color_13e3">#000013e3</color>
+ <color name="i_am_color_13e4">#000013e4</color>
+ <color name="i_am_color_13e5">#000013e5</color>
+ <color name="i_am_color_13e6">#000013e6</color>
+ <color name="i_am_color_13e7">#000013e7</color>
+ <color name="i_am_color_13e8">#000013e8</color>
+ <color name="i_am_color_13e9">#000013e9</color>
+ <color name="i_am_color_13ea">#000013ea</color>
+ <color name="i_am_color_13eb">#000013eb</color>
+ <color name="i_am_color_13ec">#000013ec</color>
+ <color name="i_am_color_13ed">#000013ed</color>
+ <color name="i_am_color_13ee">#000013ee</color>
+ <color name="i_am_color_13ef">#000013ef</color>
+ <color name="i_am_color_13f0">#000013f0</color>
+ <color name="i_am_color_13f1">#000013f1</color>
+ <color name="i_am_color_13f2">#000013f2</color>
+ <color name="i_am_color_13f3">#000013f3</color>
+ <color name="i_am_color_13f4">#000013f4</color>
+ <color name="i_am_color_13f5">#000013f5</color>
+ <color name="i_am_color_13f6">#000013f6</color>
+ <color name="i_am_color_13f7">#000013f7</color>
+ <color name="i_am_color_13f8">#000013f8</color>
+ <color name="i_am_color_13f9">#000013f9</color>
+ <color name="i_am_color_13fa">#000013fa</color>
+ <color name="i_am_color_13fb">#000013fb</color>
+ <color name="i_am_color_13fc">#000013fc</color>
+ <color name="i_am_color_13fd">#000013fd</color>
+ <color name="i_am_color_13fe">#000013fe</color>
+ <color name="i_am_color_13ff">#000013ff</color>
+ <color name="i_am_color_1400">#00001400</color>
+ <color name="i_am_color_1401">#00001401</color>
+ <color name="i_am_color_1402">#00001402</color>
+ <color name="i_am_color_1403">#00001403</color>
+ <color name="i_am_color_1404">#00001404</color>
+ <color name="i_am_color_1405">#00001405</color>
+ <color name="i_am_color_1406">#00001406</color>
+ <color name="i_am_color_1407">#00001407</color>
+ <color name="i_am_color_1408">#00001408</color>
+ <color name="i_am_color_1409">#00001409</color>
+ <color name="i_am_color_140a">#0000140a</color>
+ <color name="i_am_color_140b">#0000140b</color>
+ <color name="i_am_color_140c">#0000140c</color>
+ <color name="i_am_color_140d">#0000140d</color>
+ <color name="i_am_color_140e">#0000140e</color>
+ <color name="i_am_color_140f">#0000140f</color>
+ <color name="i_am_color_1410">#00001410</color>
+ <color name="i_am_color_1411">#00001411</color>
+ <color name="i_am_color_1412">#00001412</color>
+ <color name="i_am_color_1413">#00001413</color>
+ <color name="i_am_color_1414">#00001414</color>
+ <color name="i_am_color_1415">#00001415</color>
+ <color name="i_am_color_1416">#00001416</color>
+ <color name="i_am_color_1417">#00001417</color>
+ <color name="i_am_color_1418">#00001418</color>
+ <color name="i_am_color_1419">#00001419</color>
+ <color name="i_am_color_141a">#0000141a</color>
+ <color name="i_am_color_141b">#0000141b</color>
+ <color name="i_am_color_141c">#0000141c</color>
+ <color name="i_am_color_141d">#0000141d</color>
+ <color name="i_am_color_141e">#0000141e</color>
+ <color name="i_am_color_141f">#0000141f</color>
+ <color name="i_am_color_1420">#00001420</color>
+ <color name="i_am_color_1421">#00001421</color>
+ <color name="i_am_color_1422">#00001422</color>
+ <color name="i_am_color_1423">#00001423</color>
+ <color name="i_am_color_1424">#00001424</color>
+ <color name="i_am_color_1425">#00001425</color>
+ <color name="i_am_color_1426">#00001426</color>
+ <color name="i_am_color_1427">#00001427</color>
+ <color name="i_am_color_1428">#00001428</color>
+ <color name="i_am_color_1429">#00001429</color>
+ <color name="i_am_color_142a">#0000142a</color>
+ <color name="i_am_color_142b">#0000142b</color>
+ <color name="i_am_color_142c">#0000142c</color>
+ <color name="i_am_color_142d">#0000142d</color>
+ <color name="i_am_color_142e">#0000142e</color>
+ <color name="i_am_color_142f">#0000142f</color>
+ <color name="i_am_color_1430">#00001430</color>
+ <color name="i_am_color_1431">#00001431</color>
+ <color name="i_am_color_1432">#00001432</color>
+ <color name="i_am_color_1433">#00001433</color>
+ <color name="i_am_color_1434">#00001434</color>
+ <color name="i_am_color_1435">#00001435</color>
+ <color name="i_am_color_1436">#00001436</color>
+ <color name="i_am_color_1437">#00001437</color>
+ <color name="i_am_color_1438">#00001438</color>
+ <color name="i_am_color_1439">#00001439</color>
+ <color name="i_am_color_143a">#0000143a</color>
+ <color name="i_am_color_143b">#0000143b</color>
+ <color name="i_am_color_143c">#0000143c</color>
+ <color name="i_am_color_143d">#0000143d</color>
+ <color name="i_am_color_143e">#0000143e</color>
+ <color name="i_am_color_143f">#0000143f</color>
+ <color name="i_am_color_1440">#00001440</color>
+ <color name="i_am_color_1441">#00001441</color>
+ <color name="i_am_color_1442">#00001442</color>
+ <color name="i_am_color_1443">#00001443</color>
+ <color name="i_am_color_1444">#00001444</color>
+ <color name="i_am_color_1445">#00001445</color>
+ <color name="i_am_color_1446">#00001446</color>
+ <color name="i_am_color_1447">#00001447</color>
+ <color name="i_am_color_1448">#00001448</color>
+ <color name="i_am_color_1449">#00001449</color>
+ <color name="i_am_color_144a">#0000144a</color>
+ <color name="i_am_color_144b">#0000144b</color>
+ <color name="i_am_color_144c">#0000144c</color>
+ <color name="i_am_color_144d">#0000144d</color>
+ <color name="i_am_color_144e">#0000144e</color>
+ <color name="i_am_color_144f">#0000144f</color>
+ <color name="i_am_color_1450">#00001450</color>
+ <color name="i_am_color_1451">#00001451</color>
+ <color name="i_am_color_1452">#00001452</color>
+ <color name="i_am_color_1453">#00001453</color>
+ <color name="i_am_color_1454">#00001454</color>
+ <color name="i_am_color_1455">#00001455</color>
+ <color name="i_am_color_1456">#00001456</color>
+ <color name="i_am_color_1457">#00001457</color>
+ <color name="i_am_color_1458">#00001458</color>
+ <color name="i_am_color_1459">#00001459</color>
+ <color name="i_am_color_145a">#0000145a</color>
+ <color name="i_am_color_145b">#0000145b</color>
+ <color name="i_am_color_145c">#0000145c</color>
+ <color name="i_am_color_145d">#0000145d</color>
+ <color name="i_am_color_145e">#0000145e</color>
+ <color name="i_am_color_145f">#0000145f</color>
+ <color name="i_am_color_1460">#00001460</color>
+ <color name="i_am_color_1461">#00001461</color>
+ <color name="i_am_color_1462">#00001462</color>
+ <color name="i_am_color_1463">#00001463</color>
+ <color name="i_am_color_1464">#00001464</color>
+ <color name="i_am_color_1465">#00001465</color>
+ <color name="i_am_color_1466">#00001466</color>
+ <color name="i_am_color_1467">#00001467</color>
+ <color name="i_am_color_1468">#00001468</color>
+ <color name="i_am_color_1469">#00001469</color>
+ <color name="i_am_color_146a">#0000146a</color>
+ <color name="i_am_color_146b">#0000146b</color>
+ <color name="i_am_color_146c">#0000146c</color>
+ <color name="i_am_color_146d">#0000146d</color>
+ <color name="i_am_color_146e">#0000146e</color>
+ <color name="i_am_color_146f">#0000146f</color>
+ <color name="i_am_color_1470">#00001470</color>
+ <color name="i_am_color_1471">#00001471</color>
+ <color name="i_am_color_1472">#00001472</color>
+ <color name="i_am_color_1473">#00001473</color>
+ <color name="i_am_color_1474">#00001474</color>
+ <color name="i_am_color_1475">#00001475</color>
+ <color name="i_am_color_1476">#00001476</color>
+ <color name="i_am_color_1477">#00001477</color>
+ <color name="i_am_color_1478">#00001478</color>
+ <color name="i_am_color_1479">#00001479</color>
+ <color name="i_am_color_147a">#0000147a</color>
+ <color name="i_am_color_147b">#0000147b</color>
+ <color name="i_am_color_147c">#0000147c</color>
+ <color name="i_am_color_147d">#0000147d</color>
+ <color name="i_am_color_147e">#0000147e</color>
+ <color name="i_am_color_147f">#0000147f</color>
+ <color name="i_am_color_1480">#00001480</color>
+ <color name="i_am_color_1481">#00001481</color>
+ <color name="i_am_color_1482">#00001482</color>
+ <color name="i_am_color_1483">#00001483</color>
+ <color name="i_am_color_1484">#00001484</color>
+ <color name="i_am_color_1485">#00001485</color>
+ <color name="i_am_color_1486">#00001486</color>
+ <color name="i_am_color_1487">#00001487</color>
+ <color name="i_am_color_1488">#00001488</color>
+ <color name="i_am_color_1489">#00001489</color>
+ <color name="i_am_color_148a">#0000148a</color>
+ <color name="i_am_color_148b">#0000148b</color>
+ <color name="i_am_color_148c">#0000148c</color>
+ <color name="i_am_color_148d">#0000148d</color>
+ <color name="i_am_color_148e">#0000148e</color>
+ <color name="i_am_color_148f">#0000148f</color>
+ <color name="i_am_color_1490">#00001490</color>
+ <color name="i_am_color_1491">#00001491</color>
+ <color name="i_am_color_1492">#00001492</color>
+ <color name="i_am_color_1493">#00001493</color>
+ <color name="i_am_color_1494">#00001494</color>
+ <color name="i_am_color_1495">#00001495</color>
+ <color name="i_am_color_1496">#00001496</color>
+ <color name="i_am_color_1497">#00001497</color>
+ <color name="i_am_color_1498">#00001498</color>
+ <color name="i_am_color_1499">#00001499</color>
+ <color name="i_am_color_149a">#0000149a</color>
+ <color name="i_am_color_149b">#0000149b</color>
+ <color name="i_am_color_149c">#0000149c</color>
+ <color name="i_am_color_149d">#0000149d</color>
+ <color name="i_am_color_149e">#0000149e</color>
+ <color name="i_am_color_149f">#0000149f</color>
+ <color name="i_am_color_14a0">#000014a0</color>
+ <color name="i_am_color_14a1">#000014a1</color>
+ <color name="i_am_color_14a2">#000014a2</color>
+ <color name="i_am_color_14a3">#000014a3</color>
+ <color name="i_am_color_14a4">#000014a4</color>
+ <color name="i_am_color_14a5">#000014a5</color>
+ <color name="i_am_color_14a6">#000014a6</color>
+ <color name="i_am_color_14a7">#000014a7</color>
+ <color name="i_am_color_14a8">#000014a8</color>
+ <color name="i_am_color_14a9">#000014a9</color>
+ <color name="i_am_color_14aa">#000014aa</color>
+ <color name="i_am_color_14ab">#000014ab</color>
+ <color name="i_am_color_14ac">#000014ac</color>
+ <color name="i_am_color_14ad">#000014ad</color>
+ <color name="i_am_color_14ae">#000014ae</color>
+ <color name="i_am_color_14af">#000014af</color>
+ <color name="i_am_color_14b0">#000014b0</color>
+ <color name="i_am_color_14b1">#000014b1</color>
+ <color name="i_am_color_14b2">#000014b2</color>
+ <color name="i_am_color_14b3">#000014b3</color>
+ <color name="i_am_color_14b4">#000014b4</color>
+ <color name="i_am_color_14b5">#000014b5</color>
+ <color name="i_am_color_14b6">#000014b6</color>
+ <color name="i_am_color_14b7">#000014b7</color>
+ <color name="i_am_color_14b8">#000014b8</color>
+ <color name="i_am_color_14b9">#000014b9</color>
+ <color name="i_am_color_14ba">#000014ba</color>
+ <color name="i_am_color_14bb">#000014bb</color>
+ <color name="i_am_color_14bc">#000014bc</color>
+ <color name="i_am_color_14bd">#000014bd</color>
+ <color name="i_am_color_14be">#000014be</color>
+ <color name="i_am_color_14bf">#000014bf</color>
+ <color name="i_am_color_14c0">#000014c0</color>
+ <color name="i_am_color_14c1">#000014c1</color>
+ <color name="i_am_color_14c2">#000014c2</color>
+ <color name="i_am_color_14c3">#000014c3</color>
+ <color name="i_am_color_14c4">#000014c4</color>
+ <color name="i_am_color_14c5">#000014c5</color>
+ <color name="i_am_color_14c6">#000014c6</color>
+ <color name="i_am_color_14c7">#000014c7</color>
+ <color name="i_am_color_14c8">#000014c8</color>
+ <color name="i_am_color_14c9">#000014c9</color>
+ <color name="i_am_color_14ca">#000014ca</color>
+ <color name="i_am_color_14cb">#000014cb</color>
+ <color name="i_am_color_14cc">#000014cc</color>
+ <color name="i_am_color_14cd">#000014cd</color>
+ <color name="i_am_color_14ce">#000014ce</color>
+ <color name="i_am_color_14cf">#000014cf</color>
+ <color name="i_am_color_14d0">#000014d0</color>
+ <color name="i_am_color_14d1">#000014d1</color>
+ <color name="i_am_color_14d2">#000014d2</color>
+ <color name="i_am_color_14d3">#000014d3</color>
+ <color name="i_am_color_14d4">#000014d4</color>
+ <color name="i_am_color_14d5">#000014d5</color>
+ <color name="i_am_color_14d6">#000014d6</color>
+ <color name="i_am_color_14d7">#000014d7</color>
+ <color name="i_am_color_14d8">#000014d8</color>
+ <color name="i_am_color_14d9">#000014d9</color>
+ <color name="i_am_color_14da">#000014da</color>
+ <color name="i_am_color_14db">#000014db</color>
+ <color name="i_am_color_14dc">#000014dc</color>
+ <color name="i_am_color_14dd">#000014dd</color>
+ <color name="i_am_color_14de">#000014de</color>
+ <color name="i_am_color_14df">#000014df</color>
+ <color name="i_am_color_14e0">#000014e0</color>
+ <color name="i_am_color_14e1">#000014e1</color>
+ <color name="i_am_color_14e2">#000014e2</color>
+ <color name="i_am_color_14e3">#000014e3</color>
+ <color name="i_am_color_14e4">#000014e4</color>
+ <color name="i_am_color_14e5">#000014e5</color>
+ <color name="i_am_color_14e6">#000014e6</color>
+ <color name="i_am_color_14e7">#000014e7</color>
+ <color name="i_am_color_14e8">#000014e8</color>
+ <color name="i_am_color_14e9">#000014e9</color>
+ <color name="i_am_color_14ea">#000014ea</color>
+ <color name="i_am_color_14eb">#000014eb</color>
+ <color name="i_am_color_14ec">#000014ec</color>
+ <color name="i_am_color_14ed">#000014ed</color>
+ <color name="i_am_color_14ee">#000014ee</color>
+ <color name="i_am_color_14ef">#000014ef</color>
+ <color name="i_am_color_14f0">#000014f0</color>
+ <color name="i_am_color_14f1">#000014f1</color>
+ <color name="i_am_color_14f2">#000014f2</color>
+ <color name="i_am_color_14f3">#000014f3</color>
+ <color name="i_am_color_14f4">#000014f4</color>
+ <color name="i_am_color_14f5">#000014f5</color>
+ <color name="i_am_color_14f6">#000014f6</color>
+ <color name="i_am_color_14f7">#000014f7</color>
+ <color name="i_am_color_14f8">#000014f8</color>
+ <color name="i_am_color_14f9">#000014f9</color>
+ <color name="i_am_color_14fa">#000014fa</color>
+ <color name="i_am_color_14fb">#000014fb</color>
+ <color name="i_am_color_14fc">#000014fc</color>
+ <color name="i_am_color_14fd">#000014fd</color>
+ <color name="i_am_color_14fe">#000014fe</color>
+ <color name="i_am_color_14ff">#000014ff</color>
+ <color name="i_am_color_1500">#00001500</color>
+ <color name="i_am_color_1501">#00001501</color>
+ <color name="i_am_color_1502">#00001502</color>
+ <color name="i_am_color_1503">#00001503</color>
+ <color name="i_am_color_1504">#00001504</color>
+ <color name="i_am_color_1505">#00001505</color>
+ <color name="i_am_color_1506">#00001506</color>
+ <color name="i_am_color_1507">#00001507</color>
+ <color name="i_am_color_1508">#00001508</color>
+ <color name="i_am_color_1509">#00001509</color>
+ <color name="i_am_color_150a">#0000150a</color>
+ <color name="i_am_color_150b">#0000150b</color>
+ <color name="i_am_color_150c">#0000150c</color>
+ <color name="i_am_color_150d">#0000150d</color>
+ <color name="i_am_color_150e">#0000150e</color>
+ <color name="i_am_color_150f">#0000150f</color>
+ <color name="i_am_color_1510">#00001510</color>
+ <color name="i_am_color_1511">#00001511</color>
+ <color name="i_am_color_1512">#00001512</color>
+ <color name="i_am_color_1513">#00001513</color>
+ <color name="i_am_color_1514">#00001514</color>
+ <color name="i_am_color_1515">#00001515</color>
+ <color name="i_am_color_1516">#00001516</color>
+ <color name="i_am_color_1517">#00001517</color>
+ <color name="i_am_color_1518">#00001518</color>
+ <color name="i_am_color_1519">#00001519</color>
+ <color name="i_am_color_151a">#0000151a</color>
+ <color name="i_am_color_151b">#0000151b</color>
+ <color name="i_am_color_151c">#0000151c</color>
+ <color name="i_am_color_151d">#0000151d</color>
+ <color name="i_am_color_151e">#0000151e</color>
+ <color name="i_am_color_151f">#0000151f</color>
+ <color name="i_am_color_1520">#00001520</color>
+ <color name="i_am_color_1521">#00001521</color>
+ <color name="i_am_color_1522">#00001522</color>
+ <color name="i_am_color_1523">#00001523</color>
+ <color name="i_am_color_1524">#00001524</color>
+ <color name="i_am_color_1525">#00001525</color>
+ <color name="i_am_color_1526">#00001526</color>
+ <color name="i_am_color_1527">#00001527</color>
+ <color name="i_am_color_1528">#00001528</color>
+ <color name="i_am_color_1529">#00001529</color>
+ <color name="i_am_color_152a">#0000152a</color>
+ <color name="i_am_color_152b">#0000152b</color>
+ <color name="i_am_color_152c">#0000152c</color>
+ <color name="i_am_color_152d">#0000152d</color>
+ <color name="i_am_color_152e">#0000152e</color>
+ <color name="i_am_color_152f">#0000152f</color>
+ <color name="i_am_color_1530">#00001530</color>
+ <color name="i_am_color_1531">#00001531</color>
+ <color name="i_am_color_1532">#00001532</color>
+ <color name="i_am_color_1533">#00001533</color>
+ <color name="i_am_color_1534">#00001534</color>
+ <color name="i_am_color_1535">#00001535</color>
+ <color name="i_am_color_1536">#00001536</color>
+ <color name="i_am_color_1537">#00001537</color>
+ <color name="i_am_color_1538">#00001538</color>
+ <color name="i_am_color_1539">#00001539</color>
+ <color name="i_am_color_153a">#0000153a</color>
+ <color name="i_am_color_153b">#0000153b</color>
+ <color name="i_am_color_153c">#0000153c</color>
+ <color name="i_am_color_153d">#0000153d</color>
+ <color name="i_am_color_153e">#0000153e</color>
+ <color name="i_am_color_153f">#0000153f</color>
+ <color name="i_am_color_1540">#00001540</color>
+ <color name="i_am_color_1541">#00001541</color>
+ <color name="i_am_color_1542">#00001542</color>
+ <color name="i_am_color_1543">#00001543</color>
+ <color name="i_am_color_1544">#00001544</color>
+ <color name="i_am_color_1545">#00001545</color>
+ <color name="i_am_color_1546">#00001546</color>
+ <color name="i_am_color_1547">#00001547</color>
+ <color name="i_am_color_1548">#00001548</color>
+ <color name="i_am_color_1549">#00001549</color>
+ <color name="i_am_color_154a">#0000154a</color>
+ <color name="i_am_color_154b">#0000154b</color>
+ <color name="i_am_color_154c">#0000154c</color>
+ <color name="i_am_color_154d">#0000154d</color>
+ <color name="i_am_color_154e">#0000154e</color>
+ <color name="i_am_color_154f">#0000154f</color>
+ <color name="i_am_color_1550">#00001550</color>
+ <color name="i_am_color_1551">#00001551</color>
+ <color name="i_am_color_1552">#00001552</color>
+ <color name="i_am_color_1553">#00001553</color>
+ <color name="i_am_color_1554">#00001554</color>
+ <color name="i_am_color_1555">#00001555</color>
+ <color name="i_am_color_1556">#00001556</color>
+ <color name="i_am_color_1557">#00001557</color>
+ <color name="i_am_color_1558">#00001558</color>
+ <color name="i_am_color_1559">#00001559</color>
+ <color name="i_am_color_155a">#0000155a</color>
+ <color name="i_am_color_155b">#0000155b</color>
+ <color name="i_am_color_155c">#0000155c</color>
+ <color name="i_am_color_155d">#0000155d</color>
+ <color name="i_am_color_155e">#0000155e</color>
+ <color name="i_am_color_155f">#0000155f</color>
+ <color name="i_am_color_1560">#00001560</color>
+ <color name="i_am_color_1561">#00001561</color>
+ <color name="i_am_color_1562">#00001562</color>
+ <color name="i_am_color_1563">#00001563</color>
+ <color name="i_am_color_1564">#00001564</color>
+ <color name="i_am_color_1565">#00001565</color>
+ <color name="i_am_color_1566">#00001566</color>
+ <color name="i_am_color_1567">#00001567</color>
+ <color name="i_am_color_1568">#00001568</color>
+ <color name="i_am_color_1569">#00001569</color>
+ <color name="i_am_color_156a">#0000156a</color>
+ <color name="i_am_color_156b">#0000156b</color>
+ <color name="i_am_color_156c">#0000156c</color>
+ <color name="i_am_color_156d">#0000156d</color>
+ <color name="i_am_color_156e">#0000156e</color>
+ <color name="i_am_color_156f">#0000156f</color>
+ <color name="i_am_color_1570">#00001570</color>
+ <color name="i_am_color_1571">#00001571</color>
+ <color name="i_am_color_1572">#00001572</color>
+ <color name="i_am_color_1573">#00001573</color>
+ <color name="i_am_color_1574">#00001574</color>
+ <color name="i_am_color_1575">#00001575</color>
+ <color name="i_am_color_1576">#00001576</color>
+ <color name="i_am_color_1577">#00001577</color>
+ <color name="i_am_color_1578">#00001578</color>
+ <color name="i_am_color_1579">#00001579</color>
+ <color name="i_am_color_157a">#0000157a</color>
+ <color name="i_am_color_157b">#0000157b</color>
+ <color name="i_am_color_157c">#0000157c</color>
+ <color name="i_am_color_157d">#0000157d</color>
+ <color name="i_am_color_157e">#0000157e</color>
+ <color name="i_am_color_157f">#0000157f</color>
+ <color name="i_am_color_1580">#00001580</color>
+ <color name="i_am_color_1581">#00001581</color>
+ <color name="i_am_color_1582">#00001582</color>
+ <color name="i_am_color_1583">#00001583</color>
+ <color name="i_am_color_1584">#00001584</color>
+ <color name="i_am_color_1585">#00001585</color>
+ <color name="i_am_color_1586">#00001586</color>
+ <color name="i_am_color_1587">#00001587</color>
+ <color name="i_am_color_1588">#00001588</color>
+ <color name="i_am_color_1589">#00001589</color>
+ <color name="i_am_color_158a">#0000158a</color>
+ <color name="i_am_color_158b">#0000158b</color>
+ <color name="i_am_color_158c">#0000158c</color>
+ <color name="i_am_color_158d">#0000158d</color>
+ <color name="i_am_color_158e">#0000158e</color>
+ <color name="i_am_color_158f">#0000158f</color>
+ <color name="i_am_color_1590">#00001590</color>
+ <color name="i_am_color_1591">#00001591</color>
+ <color name="i_am_color_1592">#00001592</color>
+ <color name="i_am_color_1593">#00001593</color>
+ <color name="i_am_color_1594">#00001594</color>
+ <color name="i_am_color_1595">#00001595</color>
+ <color name="i_am_color_1596">#00001596</color>
+ <color name="i_am_color_1597">#00001597</color>
+ <color name="i_am_color_1598">#00001598</color>
+ <color name="i_am_color_1599">#00001599</color>
+ <color name="i_am_color_159a">#0000159a</color>
+ <color name="i_am_color_159b">#0000159b</color>
+ <color name="i_am_color_159c">#0000159c</color>
+ <color name="i_am_color_159d">#0000159d</color>
+ <color name="i_am_color_159e">#0000159e</color>
+ <color name="i_am_color_159f">#0000159f</color>
+ <color name="i_am_color_15a0">#000015a0</color>
+ <color name="i_am_color_15a1">#000015a1</color>
+ <color name="i_am_color_15a2">#000015a2</color>
+ <color name="i_am_color_15a3">#000015a3</color>
+ <color name="i_am_color_15a4">#000015a4</color>
+ <color name="i_am_color_15a5">#000015a5</color>
+ <color name="i_am_color_15a6">#000015a6</color>
+ <color name="i_am_color_15a7">#000015a7</color>
+ <color name="i_am_color_15a8">#000015a8</color>
+ <color name="i_am_color_15a9">#000015a9</color>
+ <color name="i_am_color_15aa">#000015aa</color>
+ <color name="i_am_color_15ab">#000015ab</color>
+ <color name="i_am_color_15ac">#000015ac</color>
+ <color name="i_am_color_15ad">#000015ad</color>
+ <color name="i_am_color_15ae">#000015ae</color>
+ <color name="i_am_color_15af">#000015af</color>
+ <color name="i_am_color_15b0">#000015b0</color>
+ <color name="i_am_color_15b1">#000015b1</color>
+ <color name="i_am_color_15b2">#000015b2</color>
+ <color name="i_am_color_15b3">#000015b3</color>
+ <color name="i_am_color_15b4">#000015b4</color>
+ <color name="i_am_color_15b5">#000015b5</color>
+ <color name="i_am_color_15b6">#000015b6</color>
+ <color name="i_am_color_15b7">#000015b7</color>
+ <color name="i_am_color_15b8">#000015b8</color>
+ <color name="i_am_color_15b9">#000015b9</color>
+ <color name="i_am_color_15ba">#000015ba</color>
+ <color name="i_am_color_15bb">#000015bb</color>
+ <color name="i_am_color_15bc">#000015bc</color>
+ <color name="i_am_color_15bd">#000015bd</color>
+ <color name="i_am_color_15be">#000015be</color>
+ <color name="i_am_color_15bf">#000015bf</color>
+ <color name="i_am_color_15c0">#000015c0</color>
+ <color name="i_am_color_15c1">#000015c1</color>
+ <color name="i_am_color_15c2">#000015c2</color>
+ <color name="i_am_color_15c3">#000015c3</color>
+ <color name="i_am_color_15c4">#000015c4</color>
+ <color name="i_am_color_15c5">#000015c5</color>
+ <color name="i_am_color_15c6">#000015c6</color>
+ <color name="i_am_color_15c7">#000015c7</color>
+ <color name="i_am_color_15c8">#000015c8</color>
+ <color name="i_am_color_15c9">#000015c9</color>
+ <color name="i_am_color_15ca">#000015ca</color>
+ <color name="i_am_color_15cb">#000015cb</color>
+ <color name="i_am_color_15cc">#000015cc</color>
+ <color name="i_am_color_15cd">#000015cd</color>
+ <color name="i_am_color_15ce">#000015ce</color>
+ <color name="i_am_color_15cf">#000015cf</color>
+ <color name="i_am_color_15d0">#000015d0</color>
+ <color name="i_am_color_15d1">#000015d1</color>
+ <color name="i_am_color_15d2">#000015d2</color>
+ <color name="i_am_color_15d3">#000015d3</color>
+ <color name="i_am_color_15d4">#000015d4</color>
+ <color name="i_am_color_15d5">#000015d5</color>
+ <color name="i_am_color_15d6">#000015d6</color>
+ <color name="i_am_color_15d7">#000015d7</color>
+ <color name="i_am_color_15d8">#000015d8</color>
+ <color name="i_am_color_15d9">#000015d9</color>
+ <color name="i_am_color_15da">#000015da</color>
+ <color name="i_am_color_15db">#000015db</color>
+ <color name="i_am_color_15dc">#000015dc</color>
+ <color name="i_am_color_15dd">#000015dd</color>
+ <color name="i_am_color_15de">#000015de</color>
+ <color name="i_am_color_15df">#000015df</color>
+ <color name="i_am_color_15e0">#000015e0</color>
+ <color name="i_am_color_15e1">#000015e1</color>
+ <color name="i_am_color_15e2">#000015e2</color>
+ <color name="i_am_color_15e3">#000015e3</color>
+ <color name="i_am_color_15e4">#000015e4</color>
+ <color name="i_am_color_15e5">#000015e5</color>
+ <color name="i_am_color_15e6">#000015e6</color>
+ <color name="i_am_color_15e7">#000015e7</color>
+ <color name="i_am_color_15e8">#000015e8</color>
+ <color name="i_am_color_15e9">#000015e9</color>
+ <color name="i_am_color_15ea">#000015ea</color>
+ <color name="i_am_color_15eb">#000015eb</color>
+ <color name="i_am_color_15ec">#000015ec</color>
+ <color name="i_am_color_15ed">#000015ed</color>
+ <color name="i_am_color_15ee">#000015ee</color>
+ <color name="i_am_color_15ef">#000015ef</color>
+ <color name="i_am_color_15f0">#000015f0</color>
+ <color name="i_am_color_15f1">#000015f1</color>
+ <color name="i_am_color_15f2">#000015f2</color>
+ <color name="i_am_color_15f3">#000015f3</color>
+ <color name="i_am_color_15f4">#000015f4</color>
+ <color name="i_am_color_15f5">#000015f5</color>
+ <color name="i_am_color_15f6">#000015f6</color>
+ <color name="i_am_color_15f7">#000015f7</color>
+ <color name="i_am_color_15f8">#000015f8</color>
+ <color name="i_am_color_15f9">#000015f9</color>
+ <color name="i_am_color_15fa">#000015fa</color>
+ <color name="i_am_color_15fb">#000015fb</color>
+ <color name="i_am_color_15fc">#000015fc</color>
+ <color name="i_am_color_15fd">#000015fd</color>
+ <color name="i_am_color_15fe">#000015fe</color>
+ <color name="i_am_color_15ff">#000015ff</color>
+ <color name="i_am_color_1600">#00001600</color>
+ <color name="i_am_color_1601">#00001601</color>
+ <color name="i_am_color_1602">#00001602</color>
+ <color name="i_am_color_1603">#00001603</color>
+ <color name="i_am_color_1604">#00001604</color>
+ <color name="i_am_color_1605">#00001605</color>
+ <color name="i_am_color_1606">#00001606</color>
+ <color name="i_am_color_1607">#00001607</color>
+ <color name="i_am_color_1608">#00001608</color>
+ <color name="i_am_color_1609">#00001609</color>
+ <color name="i_am_color_160a">#0000160a</color>
+ <color name="i_am_color_160b">#0000160b</color>
+ <color name="i_am_color_160c">#0000160c</color>
+ <color name="i_am_color_160d">#0000160d</color>
+ <color name="i_am_color_160e">#0000160e</color>
+ <color name="i_am_color_160f">#0000160f</color>
+ <color name="i_am_color_1610">#00001610</color>
+ <color name="i_am_color_1611">#00001611</color>
+ <color name="i_am_color_1612">#00001612</color>
+ <color name="i_am_color_1613">#00001613</color>
+ <color name="i_am_color_1614">#00001614</color>
+ <color name="i_am_color_1615">#00001615</color>
+ <color name="i_am_color_1616">#00001616</color>
+ <color name="i_am_color_1617">#00001617</color>
+ <color name="i_am_color_1618">#00001618</color>
+ <color name="i_am_color_1619">#00001619</color>
+ <color name="i_am_color_161a">#0000161a</color>
+ <color name="i_am_color_161b">#0000161b</color>
+ <color name="i_am_color_161c">#0000161c</color>
+ <color name="i_am_color_161d">#0000161d</color>
+ <color name="i_am_color_161e">#0000161e</color>
+ <color name="i_am_color_161f">#0000161f</color>
+ <color name="i_am_color_1620">#00001620</color>
+ <color name="i_am_color_1621">#00001621</color>
+ <color name="i_am_color_1622">#00001622</color>
+ <color name="i_am_color_1623">#00001623</color>
+ <color name="i_am_color_1624">#00001624</color>
+ <color name="i_am_color_1625">#00001625</color>
+ <color name="i_am_color_1626">#00001626</color>
+ <color name="i_am_color_1627">#00001627</color>
+ <color name="i_am_color_1628">#00001628</color>
+ <color name="i_am_color_1629">#00001629</color>
+ <color name="i_am_color_162a">#0000162a</color>
+ <color name="i_am_color_162b">#0000162b</color>
+ <color name="i_am_color_162c">#0000162c</color>
+ <color name="i_am_color_162d">#0000162d</color>
+ <color name="i_am_color_162e">#0000162e</color>
+ <color name="i_am_color_162f">#0000162f</color>
+ <color name="i_am_color_1630">#00001630</color>
+ <color name="i_am_color_1631">#00001631</color>
+ <color name="i_am_color_1632">#00001632</color>
+ <color name="i_am_color_1633">#00001633</color>
+ <color name="i_am_color_1634">#00001634</color>
+ <color name="i_am_color_1635">#00001635</color>
+ <color name="i_am_color_1636">#00001636</color>
+ <color name="i_am_color_1637">#00001637</color>
+ <color name="i_am_color_1638">#00001638</color>
+ <color name="i_am_color_1639">#00001639</color>
+ <color name="i_am_color_163a">#0000163a</color>
+ <color name="i_am_color_163b">#0000163b</color>
+ <color name="i_am_color_163c">#0000163c</color>
+ <color name="i_am_color_163d">#0000163d</color>
+ <color name="i_am_color_163e">#0000163e</color>
+ <color name="i_am_color_163f">#0000163f</color>
+ <color name="i_am_color_1640">#00001640</color>
+ <color name="i_am_color_1641">#00001641</color>
+ <color name="i_am_color_1642">#00001642</color>
+ <color name="i_am_color_1643">#00001643</color>
+ <color name="i_am_color_1644">#00001644</color>
+ <color name="i_am_color_1645">#00001645</color>
+ <color name="i_am_color_1646">#00001646</color>
+ <color name="i_am_color_1647">#00001647</color>
+ <color name="i_am_color_1648">#00001648</color>
+ <color name="i_am_color_1649">#00001649</color>
+ <color name="i_am_color_164a">#0000164a</color>
+ <color name="i_am_color_164b">#0000164b</color>
+ <color name="i_am_color_164c">#0000164c</color>
+ <color name="i_am_color_164d">#0000164d</color>
+ <color name="i_am_color_164e">#0000164e</color>
+ <color name="i_am_color_164f">#0000164f</color>
+ <color name="i_am_color_1650">#00001650</color>
+ <color name="i_am_color_1651">#00001651</color>
+ <color name="i_am_color_1652">#00001652</color>
+ <color name="i_am_color_1653">#00001653</color>
+ <color name="i_am_color_1654">#00001654</color>
+ <color name="i_am_color_1655">#00001655</color>
+ <color name="i_am_color_1656">#00001656</color>
+ <color name="i_am_color_1657">#00001657</color>
+ <color name="i_am_color_1658">#00001658</color>
+ <color name="i_am_color_1659">#00001659</color>
+ <color name="i_am_color_165a">#0000165a</color>
+ <color name="i_am_color_165b">#0000165b</color>
+ <color name="i_am_color_165c">#0000165c</color>
+ <color name="i_am_color_165d">#0000165d</color>
+ <color name="i_am_color_165e">#0000165e</color>
+ <color name="i_am_color_165f">#0000165f</color>
+ <color name="i_am_color_1660">#00001660</color>
+ <color name="i_am_color_1661">#00001661</color>
+ <color name="i_am_color_1662">#00001662</color>
+ <color name="i_am_color_1663">#00001663</color>
+ <color name="i_am_color_1664">#00001664</color>
+ <color name="i_am_color_1665">#00001665</color>
+ <color name="i_am_color_1666">#00001666</color>
+ <color name="i_am_color_1667">#00001667</color>
+ <color name="i_am_color_1668">#00001668</color>
+ <color name="i_am_color_1669">#00001669</color>
+ <color name="i_am_color_166a">#0000166a</color>
+ <color name="i_am_color_166b">#0000166b</color>
+ <color name="i_am_color_166c">#0000166c</color>
+ <color name="i_am_color_166d">#0000166d</color>
+ <color name="i_am_color_166e">#0000166e</color>
+ <color name="i_am_color_166f">#0000166f</color>
+ <color name="i_am_color_1670">#00001670</color>
+ <color name="i_am_color_1671">#00001671</color>
+ <color name="i_am_color_1672">#00001672</color>
+ <color name="i_am_color_1673">#00001673</color>
+ <color name="i_am_color_1674">#00001674</color>
+ <color name="i_am_color_1675">#00001675</color>
+ <color name="i_am_color_1676">#00001676</color>
+ <color name="i_am_color_1677">#00001677</color>
+ <color name="i_am_color_1678">#00001678</color>
+ <color name="i_am_color_1679">#00001679</color>
+ <color name="i_am_color_167a">#0000167a</color>
+ <color name="i_am_color_167b">#0000167b</color>
+ <color name="i_am_color_167c">#0000167c</color>
+ <color name="i_am_color_167d">#0000167d</color>
+ <color name="i_am_color_167e">#0000167e</color>
+ <color name="i_am_color_167f">#0000167f</color>
+ <color name="i_am_color_1680">#00001680</color>
+ <color name="i_am_color_1681">#00001681</color>
+ <color name="i_am_color_1682">#00001682</color>
+ <color name="i_am_color_1683">#00001683</color>
+ <color name="i_am_color_1684">#00001684</color>
+ <color name="i_am_color_1685">#00001685</color>
+ <color name="i_am_color_1686">#00001686</color>
+ <color name="i_am_color_1687">#00001687</color>
+ <color name="i_am_color_1688">#00001688</color>
+ <color name="i_am_color_1689">#00001689</color>
+ <color name="i_am_color_168a">#0000168a</color>
+ <color name="i_am_color_168b">#0000168b</color>
+ <color name="i_am_color_168c">#0000168c</color>
+ <color name="i_am_color_168d">#0000168d</color>
+ <color name="i_am_color_168e">#0000168e</color>
+ <color name="i_am_color_168f">#0000168f</color>
+ <color name="i_am_color_1690">#00001690</color>
+ <color name="i_am_color_1691">#00001691</color>
+ <color name="i_am_color_1692">#00001692</color>
+ <color name="i_am_color_1693">#00001693</color>
+ <color name="i_am_color_1694">#00001694</color>
+ <color name="i_am_color_1695">#00001695</color>
+ <color name="i_am_color_1696">#00001696</color>
+ <color name="i_am_color_1697">#00001697</color>
+ <color name="i_am_color_1698">#00001698</color>
+ <color name="i_am_color_1699">#00001699</color>
+ <color name="i_am_color_169a">#0000169a</color>
+ <color name="i_am_color_169b">#0000169b</color>
+ <color name="i_am_color_169c">#0000169c</color>
+ <color name="i_am_color_169d">#0000169d</color>
+ <color name="i_am_color_169e">#0000169e</color>
+ <color name="i_am_color_169f">#0000169f</color>
+ <color name="i_am_color_16a0">#000016a0</color>
+ <color name="i_am_color_16a1">#000016a1</color>
+ <color name="i_am_color_16a2">#000016a2</color>
+ <color name="i_am_color_16a3">#000016a3</color>
+ <color name="i_am_color_16a4">#000016a4</color>
+ <color name="i_am_color_16a5">#000016a5</color>
+ <color name="i_am_color_16a6">#000016a6</color>
+ <color name="i_am_color_16a7">#000016a7</color>
+ <color name="i_am_color_16a8">#000016a8</color>
+ <color name="i_am_color_16a9">#000016a9</color>
+ <color name="i_am_color_16aa">#000016aa</color>
+ <color name="i_am_color_16ab">#000016ab</color>
+ <color name="i_am_color_16ac">#000016ac</color>
+ <color name="i_am_color_16ad">#000016ad</color>
+ <color name="i_am_color_16ae">#000016ae</color>
+ <color name="i_am_color_16af">#000016af</color>
+ <color name="i_am_color_16b0">#000016b0</color>
+ <color name="i_am_color_16b1">#000016b1</color>
+ <color name="i_am_color_16b2">#000016b2</color>
+ <color name="i_am_color_16b3">#000016b3</color>
+ <color name="i_am_color_16b4">#000016b4</color>
+ <color name="i_am_color_16b5">#000016b5</color>
+ <color name="i_am_color_16b6">#000016b6</color>
+ <color name="i_am_color_16b7">#000016b7</color>
+ <color name="i_am_color_16b8">#000016b8</color>
+ <color name="i_am_color_16b9">#000016b9</color>
+ <color name="i_am_color_16ba">#000016ba</color>
+ <color name="i_am_color_16bb">#000016bb</color>
+ <color name="i_am_color_16bc">#000016bc</color>
+ <color name="i_am_color_16bd">#000016bd</color>
+ <color name="i_am_color_16be">#000016be</color>
+ <color name="i_am_color_16bf">#000016bf</color>
+ <color name="i_am_color_16c0">#000016c0</color>
+ <color name="i_am_color_16c1">#000016c1</color>
+ <color name="i_am_color_16c2">#000016c2</color>
+ <color name="i_am_color_16c3">#000016c3</color>
+ <color name="i_am_color_16c4">#000016c4</color>
+ <color name="i_am_color_16c5">#000016c5</color>
+ <color name="i_am_color_16c6">#000016c6</color>
+ <color name="i_am_color_16c7">#000016c7</color>
+ <color name="i_am_color_16c8">#000016c8</color>
+ <color name="i_am_color_16c9">#000016c9</color>
+ <color name="i_am_color_16ca">#000016ca</color>
+ <color name="i_am_color_16cb">#000016cb</color>
+ <color name="i_am_color_16cc">#000016cc</color>
+ <color name="i_am_color_16cd">#000016cd</color>
+ <color name="i_am_color_16ce">#000016ce</color>
+ <color name="i_am_color_16cf">#000016cf</color>
+ <color name="i_am_color_16d0">#000016d0</color>
+ <color name="i_am_color_16d1">#000016d1</color>
+ <color name="i_am_color_16d2">#000016d2</color>
+ <color name="i_am_color_16d3">#000016d3</color>
+ <color name="i_am_color_16d4">#000016d4</color>
+ <color name="i_am_color_16d5">#000016d5</color>
+ <color name="i_am_color_16d6">#000016d6</color>
+ <color name="i_am_color_16d7">#000016d7</color>
+ <color name="i_am_color_16d8">#000016d8</color>
+ <color name="i_am_color_16d9">#000016d9</color>
+ <color name="i_am_color_16da">#000016da</color>
+ <color name="i_am_color_16db">#000016db</color>
+ <color name="i_am_color_16dc">#000016dc</color>
+ <color name="i_am_color_16dd">#000016dd</color>
+ <color name="i_am_color_16de">#000016de</color>
+ <color name="i_am_color_16df">#000016df</color>
+ <color name="i_am_color_16e0">#000016e0</color>
+ <color name="i_am_color_16e1">#000016e1</color>
+ <color name="i_am_color_16e2">#000016e2</color>
+ <color name="i_am_color_16e3">#000016e3</color>
+ <color name="i_am_color_16e4">#000016e4</color>
+ <color name="i_am_color_16e5">#000016e5</color>
+ <color name="i_am_color_16e6">#000016e6</color>
+ <color name="i_am_color_16e7">#000016e7</color>
+ <color name="i_am_color_16e8">#000016e8</color>
+ <color name="i_am_color_16e9">#000016e9</color>
+ <color name="i_am_color_16ea">#000016ea</color>
+ <color name="i_am_color_16eb">#000016eb</color>
+ <color name="i_am_color_16ec">#000016ec</color>
+ <color name="i_am_color_16ed">#000016ed</color>
+ <color name="i_am_color_16ee">#000016ee</color>
+ <color name="i_am_color_16ef">#000016ef</color>
+ <color name="i_am_color_16f0">#000016f0</color>
+ <color name="i_am_color_16f1">#000016f1</color>
+ <color name="i_am_color_16f2">#000016f2</color>
+ <color name="i_am_color_16f3">#000016f3</color>
+ <color name="i_am_color_16f4">#000016f4</color>
+ <color name="i_am_color_16f5">#000016f5</color>
+ <color name="i_am_color_16f6">#000016f6</color>
+ <color name="i_am_color_16f7">#000016f7</color>
+ <color name="i_am_color_16f8">#000016f8</color>
+ <color name="i_am_color_16f9">#000016f9</color>
+ <color name="i_am_color_16fa">#000016fa</color>
+ <color name="i_am_color_16fb">#000016fb</color>
+ <color name="i_am_color_16fc">#000016fc</color>
+ <color name="i_am_color_16fd">#000016fd</color>
+ <color name="i_am_color_16fe">#000016fe</color>
+ <color name="i_am_color_16ff">#000016ff</color>
+ <color name="i_am_color_1700">#00001700</color>
+ <color name="i_am_color_1701">#00001701</color>
+ <color name="i_am_color_1702">#00001702</color>
+ <color name="i_am_color_1703">#00001703</color>
+ <color name="i_am_color_1704">#00001704</color>
+ <color name="i_am_color_1705">#00001705</color>
+ <color name="i_am_color_1706">#00001706</color>
+ <color name="i_am_color_1707">#00001707</color>
+ <color name="i_am_color_1708">#00001708</color>
+ <color name="i_am_color_1709">#00001709</color>
+ <color name="i_am_color_170a">#0000170a</color>
+ <color name="i_am_color_170b">#0000170b</color>
+ <color name="i_am_color_170c">#0000170c</color>
+ <color name="i_am_color_170d">#0000170d</color>
+ <color name="i_am_color_170e">#0000170e</color>
+ <color name="i_am_color_170f">#0000170f</color>
+ <color name="i_am_color_1710">#00001710</color>
+ <color name="i_am_color_1711">#00001711</color>
+ <color name="i_am_color_1712">#00001712</color>
+ <color name="i_am_color_1713">#00001713</color>
+ <color name="i_am_color_1714">#00001714</color>
+ <color name="i_am_color_1715">#00001715</color>
+ <color name="i_am_color_1716">#00001716</color>
+ <color name="i_am_color_1717">#00001717</color>
+ <color name="i_am_color_1718">#00001718</color>
+ <color name="i_am_color_1719">#00001719</color>
+ <color name="i_am_color_171a">#0000171a</color>
+ <color name="i_am_color_171b">#0000171b</color>
+ <color name="i_am_color_171c">#0000171c</color>
+ <color name="i_am_color_171d">#0000171d</color>
+ <color name="i_am_color_171e">#0000171e</color>
+ <color name="i_am_color_171f">#0000171f</color>
+ <color name="i_am_color_1720">#00001720</color>
+ <color name="i_am_color_1721">#00001721</color>
+ <color name="i_am_color_1722">#00001722</color>
+ <color name="i_am_color_1723">#00001723</color>
+ <color name="i_am_color_1724">#00001724</color>
+ <color name="i_am_color_1725">#00001725</color>
+ <color name="i_am_color_1726">#00001726</color>
+ <color name="i_am_color_1727">#00001727</color>
+ <color name="i_am_color_1728">#00001728</color>
+ <color name="i_am_color_1729">#00001729</color>
+ <color name="i_am_color_172a">#0000172a</color>
+ <color name="i_am_color_172b">#0000172b</color>
+ <color name="i_am_color_172c">#0000172c</color>
+ <color name="i_am_color_172d">#0000172d</color>
+ <color name="i_am_color_172e">#0000172e</color>
+ <color name="i_am_color_172f">#0000172f</color>
+ <color name="i_am_color_1730">#00001730</color>
+ <color name="i_am_color_1731">#00001731</color>
+ <color name="i_am_color_1732">#00001732</color>
+ <color name="i_am_color_1733">#00001733</color>
+ <color name="i_am_color_1734">#00001734</color>
+ <color name="i_am_color_1735">#00001735</color>
+ <color name="i_am_color_1736">#00001736</color>
+ <color name="i_am_color_1737">#00001737</color>
+ <color name="i_am_color_1738">#00001738</color>
+ <color name="i_am_color_1739">#00001739</color>
+ <color name="i_am_color_173a">#0000173a</color>
+ <color name="i_am_color_173b">#0000173b</color>
+ <color name="i_am_color_173c">#0000173c</color>
+ <color name="i_am_color_173d">#0000173d</color>
+ <color name="i_am_color_173e">#0000173e</color>
+ <color name="i_am_color_173f">#0000173f</color>
+ <color name="i_am_color_1740">#00001740</color>
+ <color name="i_am_color_1741">#00001741</color>
+ <color name="i_am_color_1742">#00001742</color>
+ <color name="i_am_color_1743">#00001743</color>
+ <color name="i_am_color_1744">#00001744</color>
+ <color name="i_am_color_1745">#00001745</color>
+ <color name="i_am_color_1746">#00001746</color>
+ <color name="i_am_color_1747">#00001747</color>
+ <color name="i_am_color_1748">#00001748</color>
+ <color name="i_am_color_1749">#00001749</color>
+ <color name="i_am_color_174a">#0000174a</color>
+ <color name="i_am_color_174b">#0000174b</color>
+ <color name="i_am_color_174c">#0000174c</color>
+ <color name="i_am_color_174d">#0000174d</color>
+ <color name="i_am_color_174e">#0000174e</color>
+ <color name="i_am_color_174f">#0000174f</color>
+ <color name="i_am_color_1750">#00001750</color>
+ <color name="i_am_color_1751">#00001751</color>
+ <color name="i_am_color_1752">#00001752</color>
+ <color name="i_am_color_1753">#00001753</color>
+ <color name="i_am_color_1754">#00001754</color>
+ <color name="i_am_color_1755">#00001755</color>
+ <color name="i_am_color_1756">#00001756</color>
+ <color name="i_am_color_1757">#00001757</color>
+ <color name="i_am_color_1758">#00001758</color>
+ <color name="i_am_color_1759">#00001759</color>
+ <color name="i_am_color_175a">#0000175a</color>
+ <color name="i_am_color_175b">#0000175b</color>
+ <color name="i_am_color_175c">#0000175c</color>
+ <color name="i_am_color_175d">#0000175d</color>
+ <color name="i_am_color_175e">#0000175e</color>
+ <color name="i_am_color_175f">#0000175f</color>
+ <color name="i_am_color_1760">#00001760</color>
+ <color name="i_am_color_1761">#00001761</color>
+ <color name="i_am_color_1762">#00001762</color>
+ <color name="i_am_color_1763">#00001763</color>
+ <color name="i_am_color_1764">#00001764</color>
+ <color name="i_am_color_1765">#00001765</color>
+ <color name="i_am_color_1766">#00001766</color>
+ <color name="i_am_color_1767">#00001767</color>
+ <color name="i_am_color_1768">#00001768</color>
+ <color name="i_am_color_1769">#00001769</color>
+ <color name="i_am_color_176a">#0000176a</color>
+ <color name="i_am_color_176b">#0000176b</color>
+ <color name="i_am_color_176c">#0000176c</color>
+ <color name="i_am_color_176d">#0000176d</color>
+ <color name="i_am_color_176e">#0000176e</color>
+ <color name="i_am_color_176f">#0000176f</color>
+ <color name="i_am_color_1770">#00001770</color>
+ <color name="i_am_color_1771">#00001771</color>
+ <color name="i_am_color_1772">#00001772</color>
+ <color name="i_am_color_1773">#00001773</color>
+ <color name="i_am_color_1774">#00001774</color>
+ <color name="i_am_color_1775">#00001775</color>
+ <color name="i_am_color_1776">#00001776</color>
+ <color name="i_am_color_1777">#00001777</color>
+ <color name="i_am_color_1778">#00001778</color>
+ <color name="i_am_color_1779">#00001779</color>
+ <color name="i_am_color_177a">#0000177a</color>
+ <color name="i_am_color_177b">#0000177b</color>
+ <color name="i_am_color_177c">#0000177c</color>
+ <color name="i_am_color_177d">#0000177d</color>
+ <color name="i_am_color_177e">#0000177e</color>
+ <color name="i_am_color_177f">#0000177f</color>
+ <color name="i_am_color_1780">#00001780</color>
+ <color name="i_am_color_1781">#00001781</color>
+ <color name="i_am_color_1782">#00001782</color>
+ <color name="i_am_color_1783">#00001783</color>
+ <color name="i_am_color_1784">#00001784</color>
+ <color name="i_am_color_1785">#00001785</color>
+ <color name="i_am_color_1786">#00001786</color>
+ <color name="i_am_color_1787">#00001787</color>
+ <color name="i_am_color_1788">#00001788</color>
+ <color name="i_am_color_1789">#00001789</color>
+ <color name="i_am_color_178a">#0000178a</color>
+ <color name="i_am_color_178b">#0000178b</color>
+ <color name="i_am_color_178c">#0000178c</color>
+ <color name="i_am_color_178d">#0000178d</color>
+ <color name="i_am_color_178e">#0000178e</color>
+ <color name="i_am_color_178f">#0000178f</color>
+ <color name="i_am_color_1790">#00001790</color>
+ <color name="i_am_color_1791">#00001791</color>
+ <color name="i_am_color_1792">#00001792</color>
+ <color name="i_am_color_1793">#00001793</color>
+ <color name="i_am_color_1794">#00001794</color>
+ <color name="i_am_color_1795">#00001795</color>
+ <color name="i_am_color_1796">#00001796</color>
+ <color name="i_am_color_1797">#00001797</color>
+ <color name="i_am_color_1798">#00001798</color>
+ <color name="i_am_color_1799">#00001799</color>
+ <color name="i_am_color_179a">#0000179a</color>
+ <color name="i_am_color_179b">#0000179b</color>
+ <color name="i_am_color_179c">#0000179c</color>
+ <color name="i_am_color_179d">#0000179d</color>
+ <color name="i_am_color_179e">#0000179e</color>
+ <color name="i_am_color_179f">#0000179f</color>
+ <color name="i_am_color_17a0">#000017a0</color>
+ <color name="i_am_color_17a1">#000017a1</color>
+ <color name="i_am_color_17a2">#000017a2</color>
+ <color name="i_am_color_17a3">#000017a3</color>
+ <color name="i_am_color_17a4">#000017a4</color>
+ <color name="i_am_color_17a5">#000017a5</color>
+ <color name="i_am_color_17a6">#000017a6</color>
+ <color name="i_am_color_17a7">#000017a7</color>
+ <color name="i_am_color_17a8">#000017a8</color>
+ <color name="i_am_color_17a9">#000017a9</color>
+ <color name="i_am_color_17aa">#000017aa</color>
+ <color name="i_am_color_17ab">#000017ab</color>
+ <color name="i_am_color_17ac">#000017ac</color>
+ <color name="i_am_color_17ad">#000017ad</color>
+ <color name="i_am_color_17ae">#000017ae</color>
+ <color name="i_am_color_17af">#000017af</color>
+ <color name="i_am_color_17b0">#000017b0</color>
+ <color name="i_am_color_17b1">#000017b1</color>
+ <color name="i_am_color_17b2">#000017b2</color>
+ <color name="i_am_color_17b3">#000017b3</color>
+ <color name="i_am_color_17b4">#000017b4</color>
+ <color name="i_am_color_17b5">#000017b5</color>
+ <color name="i_am_color_17b6">#000017b6</color>
+ <color name="i_am_color_17b7">#000017b7</color>
+ <color name="i_am_color_17b8">#000017b8</color>
+ <color name="i_am_color_17b9">#000017b9</color>
+ <color name="i_am_color_17ba">#000017ba</color>
+ <color name="i_am_color_17bb">#000017bb</color>
+ <color name="i_am_color_17bc">#000017bc</color>
+ <color name="i_am_color_17bd">#000017bd</color>
+ <color name="i_am_color_17be">#000017be</color>
+ <color name="i_am_color_17bf">#000017bf</color>
+ <color name="i_am_color_17c0">#000017c0</color>
+ <color name="i_am_color_17c1">#000017c1</color>
+ <color name="i_am_color_17c2">#000017c2</color>
+ <color name="i_am_color_17c3">#000017c3</color>
+ <color name="i_am_color_17c4">#000017c4</color>
+ <color name="i_am_color_17c5">#000017c5</color>
+ <color name="i_am_color_17c6">#000017c6</color>
+ <color name="i_am_color_17c7">#000017c7</color>
+ <color name="i_am_color_17c8">#000017c8</color>
+ <color name="i_am_color_17c9">#000017c9</color>
+ <color name="i_am_color_17ca">#000017ca</color>
+ <color name="i_am_color_17cb">#000017cb</color>
+ <color name="i_am_color_17cc">#000017cc</color>
+ <color name="i_am_color_17cd">#000017cd</color>
+ <color name="i_am_color_17ce">#000017ce</color>
+ <color name="i_am_color_17cf">#000017cf</color>
+ <color name="i_am_color_17d0">#000017d0</color>
+ <color name="i_am_color_17d1">#000017d1</color>
+ <color name="i_am_color_17d2">#000017d2</color>
+ <color name="i_am_color_17d3">#000017d3</color>
+ <color name="i_am_color_17d4">#000017d4</color>
+ <color name="i_am_color_17d5">#000017d5</color>
+ <color name="i_am_color_17d6">#000017d6</color>
+ <color name="i_am_color_17d7">#000017d7</color>
+ <color name="i_am_color_17d8">#000017d8</color>
+ <color name="i_am_color_17d9">#000017d9</color>
+ <color name="i_am_color_17da">#000017da</color>
+ <color name="i_am_color_17db">#000017db</color>
+ <color name="i_am_color_17dc">#000017dc</color>
+ <color name="i_am_color_17dd">#000017dd</color>
+ <color name="i_am_color_17de">#000017de</color>
+ <color name="i_am_color_17df">#000017df</color>
+ <color name="i_am_color_17e0">#000017e0</color>
+ <color name="i_am_color_17e1">#000017e1</color>
+ <color name="i_am_color_17e2">#000017e2</color>
+ <color name="i_am_color_17e3">#000017e3</color>
+ <color name="i_am_color_17e4">#000017e4</color>
+ <color name="i_am_color_17e5">#000017e5</color>
+ <color name="i_am_color_17e6">#000017e6</color>
+ <color name="i_am_color_17e7">#000017e7</color>
+ <color name="i_am_color_17e8">#000017e8</color>
+ <color name="i_am_color_17e9">#000017e9</color>
+ <color name="i_am_color_17ea">#000017ea</color>
+ <color name="i_am_color_17eb">#000017eb</color>
+ <color name="i_am_color_17ec">#000017ec</color>
+ <color name="i_am_color_17ed">#000017ed</color>
+ <color name="i_am_color_17ee">#000017ee</color>
+ <color name="i_am_color_17ef">#000017ef</color>
+ <color name="i_am_color_17f0">#000017f0</color>
+ <color name="i_am_color_17f1">#000017f1</color>
+ <color name="i_am_color_17f2">#000017f2</color>
+ <color name="i_am_color_17f3">#000017f3</color>
+ <color name="i_am_color_17f4">#000017f4</color>
+ <color name="i_am_color_17f5">#000017f5</color>
+ <color name="i_am_color_17f6">#000017f6</color>
+ <color name="i_am_color_17f7">#000017f7</color>
+ <color name="i_am_color_17f8">#000017f8</color>
+ <color name="i_am_color_17f9">#000017f9</color>
+ <color name="i_am_color_17fa">#000017fa</color>
+ <color name="i_am_color_17fb">#000017fb</color>
+ <color name="i_am_color_17fc">#000017fc</color>
+ <color name="i_am_color_17fd">#000017fd</color>
+ <color name="i_am_color_17fe">#000017fe</color>
+ <color name="i_am_color_17ff">#000017ff</color>
+ <color name="i_am_color_1800">#00001800</color>
+ <color name="i_am_color_1801">#00001801</color>
+ <color name="i_am_color_1802">#00001802</color>
+ <color name="i_am_color_1803">#00001803</color>
+ <color name="i_am_color_1804">#00001804</color>
+ <color name="i_am_color_1805">#00001805</color>
+ <color name="i_am_color_1806">#00001806</color>
+ <color name="i_am_color_1807">#00001807</color>
+ <color name="i_am_color_1808">#00001808</color>
+ <color name="i_am_color_1809">#00001809</color>
+ <color name="i_am_color_180a">#0000180a</color>
+ <color name="i_am_color_180b">#0000180b</color>
+ <color name="i_am_color_180c">#0000180c</color>
+ <color name="i_am_color_180d">#0000180d</color>
+ <color name="i_am_color_180e">#0000180e</color>
+ <color name="i_am_color_180f">#0000180f</color>
+ <color name="i_am_color_1810">#00001810</color>
+ <color name="i_am_color_1811">#00001811</color>
+ <color name="i_am_color_1812">#00001812</color>
+ <color name="i_am_color_1813">#00001813</color>
+ <color name="i_am_color_1814">#00001814</color>
+ <color name="i_am_color_1815">#00001815</color>
+ <color name="i_am_color_1816">#00001816</color>
+ <color name="i_am_color_1817">#00001817</color>
+ <color name="i_am_color_1818">#00001818</color>
+ <color name="i_am_color_1819">#00001819</color>
+ <color name="i_am_color_181a">#0000181a</color>
+ <color name="i_am_color_181b">#0000181b</color>
+ <color name="i_am_color_181c">#0000181c</color>
+ <color name="i_am_color_181d">#0000181d</color>
+ <color name="i_am_color_181e">#0000181e</color>
+ <color name="i_am_color_181f">#0000181f</color>
+ <color name="i_am_color_1820">#00001820</color>
+ <color name="i_am_color_1821">#00001821</color>
+ <color name="i_am_color_1822">#00001822</color>
+ <color name="i_am_color_1823">#00001823</color>
+ <color name="i_am_color_1824">#00001824</color>
+ <color name="i_am_color_1825">#00001825</color>
+ <color name="i_am_color_1826">#00001826</color>
+ <color name="i_am_color_1827">#00001827</color>
+ <color name="i_am_color_1828">#00001828</color>
+ <color name="i_am_color_1829">#00001829</color>
+ <color name="i_am_color_182a">#0000182a</color>
+ <color name="i_am_color_182b">#0000182b</color>
+ <color name="i_am_color_182c">#0000182c</color>
+ <color name="i_am_color_182d">#0000182d</color>
+ <color name="i_am_color_182e">#0000182e</color>
+ <color name="i_am_color_182f">#0000182f</color>
+ <color name="i_am_color_1830">#00001830</color>
+ <color name="i_am_color_1831">#00001831</color>
+ <color name="i_am_color_1832">#00001832</color>
+ <color name="i_am_color_1833">#00001833</color>
+ <color name="i_am_color_1834">#00001834</color>
+ <color name="i_am_color_1835">#00001835</color>
+ <color name="i_am_color_1836">#00001836</color>
+ <color name="i_am_color_1837">#00001837</color>
+ <color name="i_am_color_1838">#00001838</color>
+ <color name="i_am_color_1839">#00001839</color>
+ <color name="i_am_color_183a">#0000183a</color>
+ <color name="i_am_color_183b">#0000183b</color>
+ <color name="i_am_color_183c">#0000183c</color>
+ <color name="i_am_color_183d">#0000183d</color>
+ <color name="i_am_color_183e">#0000183e</color>
+ <color name="i_am_color_183f">#0000183f</color>
+ <color name="i_am_color_1840">#00001840</color>
+ <color name="i_am_color_1841">#00001841</color>
+ <color name="i_am_color_1842">#00001842</color>
+ <color name="i_am_color_1843">#00001843</color>
+ <color name="i_am_color_1844">#00001844</color>
+ <color name="i_am_color_1845">#00001845</color>
+ <color name="i_am_color_1846">#00001846</color>
+ <color name="i_am_color_1847">#00001847</color>
+ <color name="i_am_color_1848">#00001848</color>
+ <color name="i_am_color_1849">#00001849</color>
+ <color name="i_am_color_184a">#0000184a</color>
+ <color name="i_am_color_184b">#0000184b</color>
+ <color name="i_am_color_184c">#0000184c</color>
+ <color name="i_am_color_184d">#0000184d</color>
+ <color name="i_am_color_184e">#0000184e</color>
+ <color name="i_am_color_184f">#0000184f</color>
+ <color name="i_am_color_1850">#00001850</color>
+ <color name="i_am_color_1851">#00001851</color>
+ <color name="i_am_color_1852">#00001852</color>
+ <color name="i_am_color_1853">#00001853</color>
+ <color name="i_am_color_1854">#00001854</color>
+ <color name="i_am_color_1855">#00001855</color>
+ <color name="i_am_color_1856">#00001856</color>
+ <color name="i_am_color_1857">#00001857</color>
+ <color name="i_am_color_1858">#00001858</color>
+ <color name="i_am_color_1859">#00001859</color>
+ <color name="i_am_color_185a">#0000185a</color>
+ <color name="i_am_color_185b">#0000185b</color>
+ <color name="i_am_color_185c">#0000185c</color>
+ <color name="i_am_color_185d">#0000185d</color>
+ <color name="i_am_color_185e">#0000185e</color>
+ <color name="i_am_color_185f">#0000185f</color>
+ <color name="i_am_color_1860">#00001860</color>
+ <color name="i_am_color_1861">#00001861</color>
+ <color name="i_am_color_1862">#00001862</color>
+ <color name="i_am_color_1863">#00001863</color>
+ <color name="i_am_color_1864">#00001864</color>
+ <color name="i_am_color_1865">#00001865</color>
+ <color name="i_am_color_1866">#00001866</color>
+ <color name="i_am_color_1867">#00001867</color>
+ <color name="i_am_color_1868">#00001868</color>
+ <color name="i_am_color_1869">#00001869</color>
+ <color name="i_am_color_186a">#0000186a</color>
+ <color name="i_am_color_186b">#0000186b</color>
+ <color name="i_am_color_186c">#0000186c</color>
+ <color name="i_am_color_186d">#0000186d</color>
+ <color name="i_am_color_186e">#0000186e</color>
+ <color name="i_am_color_186f">#0000186f</color>
+ <color name="i_am_color_1870">#00001870</color>
+ <color name="i_am_color_1871">#00001871</color>
+ <color name="i_am_color_1872">#00001872</color>
+ <color name="i_am_color_1873">#00001873</color>
+ <color name="i_am_color_1874">#00001874</color>
+ <color name="i_am_color_1875">#00001875</color>
+ <color name="i_am_color_1876">#00001876</color>
+ <color name="i_am_color_1877">#00001877</color>
+ <color name="i_am_color_1878">#00001878</color>
+ <color name="i_am_color_1879">#00001879</color>
+ <color name="i_am_color_187a">#0000187a</color>
+ <color name="i_am_color_187b">#0000187b</color>
+ <color name="i_am_color_187c">#0000187c</color>
+ <color name="i_am_color_187d">#0000187d</color>
+ <color name="i_am_color_187e">#0000187e</color>
+ <color name="i_am_color_187f">#0000187f</color>
+ <color name="i_am_color_1880">#00001880</color>
+ <color name="i_am_color_1881">#00001881</color>
+ <color name="i_am_color_1882">#00001882</color>
+ <color name="i_am_color_1883">#00001883</color>
+ <color name="i_am_color_1884">#00001884</color>
+ <color name="i_am_color_1885">#00001885</color>
+ <color name="i_am_color_1886">#00001886</color>
+ <color name="i_am_color_1887">#00001887</color>
+ <color name="i_am_color_1888">#00001888</color>
+ <color name="i_am_color_1889">#00001889</color>
+ <color name="i_am_color_188a">#0000188a</color>
+ <color name="i_am_color_188b">#0000188b</color>
+ <color name="i_am_color_188c">#0000188c</color>
+ <color name="i_am_color_188d">#0000188d</color>
+ <color name="i_am_color_188e">#0000188e</color>
+ <color name="i_am_color_188f">#0000188f</color>
+ <color name="i_am_color_1890">#00001890</color>
+ <color name="i_am_color_1891">#00001891</color>
+ <color name="i_am_color_1892">#00001892</color>
+ <color name="i_am_color_1893">#00001893</color>
+ <color name="i_am_color_1894">#00001894</color>
+ <color name="i_am_color_1895">#00001895</color>
+ <color name="i_am_color_1896">#00001896</color>
+ <color name="i_am_color_1897">#00001897</color>
+ <color name="i_am_color_1898">#00001898</color>
+ <color name="i_am_color_1899">#00001899</color>
+ <color name="i_am_color_189a">#0000189a</color>
+ <color name="i_am_color_189b">#0000189b</color>
+ <color name="i_am_color_189c">#0000189c</color>
+ <color name="i_am_color_189d">#0000189d</color>
+ <color name="i_am_color_189e">#0000189e</color>
+ <color name="i_am_color_189f">#0000189f</color>
+ <color name="i_am_color_18a0">#000018a0</color>
+ <color name="i_am_color_18a1">#000018a1</color>
+ <color name="i_am_color_18a2">#000018a2</color>
+ <color name="i_am_color_18a3">#000018a3</color>
+ <color name="i_am_color_18a4">#000018a4</color>
+ <color name="i_am_color_18a5">#000018a5</color>
+ <color name="i_am_color_18a6">#000018a6</color>
+ <color name="i_am_color_18a7">#000018a7</color>
+ <color name="i_am_color_18a8">#000018a8</color>
+ <color name="i_am_color_18a9">#000018a9</color>
+ <color name="i_am_color_18aa">#000018aa</color>
+ <color name="i_am_color_18ab">#000018ab</color>
+ <color name="i_am_color_18ac">#000018ac</color>
+ <color name="i_am_color_18ad">#000018ad</color>
+ <color name="i_am_color_18ae">#000018ae</color>
+ <color name="i_am_color_18af">#000018af</color>
+ <color name="i_am_color_18b0">#000018b0</color>
+ <color name="i_am_color_18b1">#000018b1</color>
+ <color name="i_am_color_18b2">#000018b2</color>
+ <color name="i_am_color_18b3">#000018b3</color>
+ <color name="i_am_color_18b4">#000018b4</color>
+ <color name="i_am_color_18b5">#000018b5</color>
+ <color name="i_am_color_18b6">#000018b6</color>
+ <color name="i_am_color_18b7">#000018b7</color>
+ <color name="i_am_color_18b8">#000018b8</color>
+ <color name="i_am_color_18b9">#000018b9</color>
+ <color name="i_am_color_18ba">#000018ba</color>
+ <color name="i_am_color_18bb">#000018bb</color>
+ <color name="i_am_color_18bc">#000018bc</color>
+ <color name="i_am_color_18bd">#000018bd</color>
+ <color name="i_am_color_18be">#000018be</color>
+ <color name="i_am_color_18bf">#000018bf</color>
+ <color name="i_am_color_18c0">#000018c0</color>
+ <color name="i_am_color_18c1">#000018c1</color>
+ <color name="i_am_color_18c2">#000018c2</color>
+ <color name="i_am_color_18c3">#000018c3</color>
+ <color name="i_am_color_18c4">#000018c4</color>
+ <color name="i_am_color_18c5">#000018c5</color>
+ <color name="i_am_color_18c6">#000018c6</color>
+ <color name="i_am_color_18c7">#000018c7</color>
+ <color name="i_am_color_18c8">#000018c8</color>
+ <color name="i_am_color_18c9">#000018c9</color>
+ <color name="i_am_color_18ca">#000018ca</color>
+ <color name="i_am_color_18cb">#000018cb</color>
+ <color name="i_am_color_18cc">#000018cc</color>
+ <color name="i_am_color_18cd">#000018cd</color>
+ <color name="i_am_color_18ce">#000018ce</color>
+ <color name="i_am_color_18cf">#000018cf</color>
+ <color name="i_am_color_18d0">#000018d0</color>
+ <color name="i_am_color_18d1">#000018d1</color>
+ <color name="i_am_color_18d2">#000018d2</color>
+ <color name="i_am_color_18d3">#000018d3</color>
+ <color name="i_am_color_18d4">#000018d4</color>
+ <color name="i_am_color_18d5">#000018d5</color>
+ <color name="i_am_color_18d6">#000018d6</color>
+ <color name="i_am_color_18d7">#000018d7</color>
+ <color name="i_am_color_18d8">#000018d8</color>
+ <color name="i_am_color_18d9">#000018d9</color>
+ <color name="i_am_color_18da">#000018da</color>
+ <color name="i_am_color_18db">#000018db</color>
+ <color name="i_am_color_18dc">#000018dc</color>
+ <color name="i_am_color_18dd">#000018dd</color>
+ <color name="i_am_color_18de">#000018de</color>
+ <color name="i_am_color_18df">#000018df</color>
+ <color name="i_am_color_18e0">#000018e0</color>
+ <color name="i_am_color_18e1">#000018e1</color>
+ <color name="i_am_color_18e2">#000018e2</color>
+ <color name="i_am_color_18e3">#000018e3</color>
+ <color name="i_am_color_18e4">#000018e4</color>
+ <color name="i_am_color_18e5">#000018e5</color>
+ <color name="i_am_color_18e6">#000018e6</color>
+ <color name="i_am_color_18e7">#000018e7</color>
+ <color name="i_am_color_18e8">#000018e8</color>
+ <color name="i_am_color_18e9">#000018e9</color>
+ <color name="i_am_color_18ea">#000018ea</color>
+ <color name="i_am_color_18eb">#000018eb</color>
+ <color name="i_am_color_18ec">#000018ec</color>
+ <color name="i_am_color_18ed">#000018ed</color>
+ <color name="i_am_color_18ee">#000018ee</color>
+ <color name="i_am_color_18ef">#000018ef</color>
+ <color name="i_am_color_18f0">#000018f0</color>
+ <color name="i_am_color_18f1">#000018f1</color>
+ <color name="i_am_color_18f2">#000018f2</color>
+ <color name="i_am_color_18f3">#000018f3</color>
+ <color name="i_am_color_18f4">#000018f4</color>
+ <color name="i_am_color_18f5">#000018f5</color>
+ <color name="i_am_color_18f6">#000018f6</color>
+ <color name="i_am_color_18f7">#000018f7</color>
+ <color name="i_am_color_18f8">#000018f8</color>
+ <color name="i_am_color_18f9">#000018f9</color>
+ <color name="i_am_color_18fa">#000018fa</color>
+ <color name="i_am_color_18fb">#000018fb</color>
+ <color name="i_am_color_18fc">#000018fc</color>
+ <color name="i_am_color_18fd">#000018fd</color>
+ <color name="i_am_color_18fe">#000018fe</color>
+ <color name="i_am_color_18ff">#000018ff</color>
+ <color name="i_am_color_1900">#00001900</color>
+ <color name="i_am_color_1901">#00001901</color>
+ <color name="i_am_color_1902">#00001902</color>
+ <color name="i_am_color_1903">#00001903</color>
+ <color name="i_am_color_1904">#00001904</color>
+ <color name="i_am_color_1905">#00001905</color>
+ <color name="i_am_color_1906">#00001906</color>
+ <color name="i_am_color_1907">#00001907</color>
+ <color name="i_am_color_1908">#00001908</color>
+ <color name="i_am_color_1909">#00001909</color>
+ <color name="i_am_color_190a">#0000190a</color>
+ <color name="i_am_color_190b">#0000190b</color>
+ <color name="i_am_color_190c">#0000190c</color>
+ <color name="i_am_color_190d">#0000190d</color>
+ <color name="i_am_color_190e">#0000190e</color>
+ <color name="i_am_color_190f">#0000190f</color>
+ <color name="i_am_color_1910">#00001910</color>
+ <color name="i_am_color_1911">#00001911</color>
+ <color name="i_am_color_1912">#00001912</color>
+ <color name="i_am_color_1913">#00001913</color>
+ <color name="i_am_color_1914">#00001914</color>
+ <color name="i_am_color_1915">#00001915</color>
+ <color name="i_am_color_1916">#00001916</color>
+ <color name="i_am_color_1917">#00001917</color>
+ <color name="i_am_color_1918">#00001918</color>
+ <color name="i_am_color_1919">#00001919</color>
+ <color name="i_am_color_191a">#0000191a</color>
+ <color name="i_am_color_191b">#0000191b</color>
+ <color name="i_am_color_191c">#0000191c</color>
+ <color name="i_am_color_191d">#0000191d</color>
+ <color name="i_am_color_191e">#0000191e</color>
+ <color name="i_am_color_191f">#0000191f</color>
+ <color name="i_am_color_1920">#00001920</color>
+ <color name="i_am_color_1921">#00001921</color>
+ <color name="i_am_color_1922">#00001922</color>
+ <color name="i_am_color_1923">#00001923</color>
+ <color name="i_am_color_1924">#00001924</color>
+ <color name="i_am_color_1925">#00001925</color>
+ <color name="i_am_color_1926">#00001926</color>
+ <color name="i_am_color_1927">#00001927</color>
+ <color name="i_am_color_1928">#00001928</color>
+ <color name="i_am_color_1929">#00001929</color>
+ <color name="i_am_color_192a">#0000192a</color>
+ <color name="i_am_color_192b">#0000192b</color>
+ <color name="i_am_color_192c">#0000192c</color>
+ <color name="i_am_color_192d">#0000192d</color>
+ <color name="i_am_color_192e">#0000192e</color>
+ <color name="i_am_color_192f">#0000192f</color>
+ <color name="i_am_color_1930">#00001930</color>
+ <color name="i_am_color_1931">#00001931</color>
+ <color name="i_am_color_1932">#00001932</color>
+ <color name="i_am_color_1933">#00001933</color>
+ <color name="i_am_color_1934">#00001934</color>
+ <color name="i_am_color_1935">#00001935</color>
+ <color name="i_am_color_1936">#00001936</color>
+ <color name="i_am_color_1937">#00001937</color>
+ <color name="i_am_color_1938">#00001938</color>
+ <color name="i_am_color_1939">#00001939</color>
+ <color name="i_am_color_193a">#0000193a</color>
+ <color name="i_am_color_193b">#0000193b</color>
+ <color name="i_am_color_193c">#0000193c</color>
+ <color name="i_am_color_193d">#0000193d</color>
+ <color name="i_am_color_193e">#0000193e</color>
+ <color name="i_am_color_193f">#0000193f</color>
+ <color name="i_am_color_1940">#00001940</color>
+ <color name="i_am_color_1941">#00001941</color>
+ <color name="i_am_color_1942">#00001942</color>
+ <color name="i_am_color_1943">#00001943</color>
+ <color name="i_am_color_1944">#00001944</color>
+ <color name="i_am_color_1945">#00001945</color>
+ <color name="i_am_color_1946">#00001946</color>
+ <color name="i_am_color_1947">#00001947</color>
+ <color name="i_am_color_1948">#00001948</color>
+ <color name="i_am_color_1949">#00001949</color>
+ <color name="i_am_color_194a">#0000194a</color>
+ <color name="i_am_color_194b">#0000194b</color>
+ <color name="i_am_color_194c">#0000194c</color>
+ <color name="i_am_color_194d">#0000194d</color>
+ <color name="i_am_color_194e">#0000194e</color>
+ <color name="i_am_color_194f">#0000194f</color>
+ <color name="i_am_color_1950">#00001950</color>
+ <color name="i_am_color_1951">#00001951</color>
+ <color name="i_am_color_1952">#00001952</color>
+ <color name="i_am_color_1953">#00001953</color>
+ <color name="i_am_color_1954">#00001954</color>
+ <color name="i_am_color_1955">#00001955</color>
+ <color name="i_am_color_1956">#00001956</color>
+ <color name="i_am_color_1957">#00001957</color>
+ <color name="i_am_color_1958">#00001958</color>
+ <color name="i_am_color_1959">#00001959</color>
+ <color name="i_am_color_195a">#0000195a</color>
+ <color name="i_am_color_195b">#0000195b</color>
+ <color name="i_am_color_195c">#0000195c</color>
+ <color name="i_am_color_195d">#0000195d</color>
+ <color name="i_am_color_195e">#0000195e</color>
+ <color name="i_am_color_195f">#0000195f</color>
+ <color name="i_am_color_1960">#00001960</color>
+ <color name="i_am_color_1961">#00001961</color>
+ <color name="i_am_color_1962">#00001962</color>
+ <color name="i_am_color_1963">#00001963</color>
+ <color name="i_am_color_1964">#00001964</color>
+ <color name="i_am_color_1965">#00001965</color>
+ <color name="i_am_color_1966">#00001966</color>
+ <color name="i_am_color_1967">#00001967</color>
+ <color name="i_am_color_1968">#00001968</color>
+ <color name="i_am_color_1969">#00001969</color>
+ <color name="i_am_color_196a">#0000196a</color>
+ <color name="i_am_color_196b">#0000196b</color>
+ <color name="i_am_color_196c">#0000196c</color>
+ <color name="i_am_color_196d">#0000196d</color>
+ <color name="i_am_color_196e">#0000196e</color>
+ <color name="i_am_color_196f">#0000196f</color>
+ <color name="i_am_color_1970">#00001970</color>
+ <color name="i_am_color_1971">#00001971</color>
+ <color name="i_am_color_1972">#00001972</color>
+ <color name="i_am_color_1973">#00001973</color>
+ <color name="i_am_color_1974">#00001974</color>
+ <color name="i_am_color_1975">#00001975</color>
+ <color name="i_am_color_1976">#00001976</color>
+ <color name="i_am_color_1977">#00001977</color>
+ <color name="i_am_color_1978">#00001978</color>
+ <color name="i_am_color_1979">#00001979</color>
+ <color name="i_am_color_197a">#0000197a</color>
+ <color name="i_am_color_197b">#0000197b</color>
+ <color name="i_am_color_197c">#0000197c</color>
+ <color name="i_am_color_197d">#0000197d</color>
+ <color name="i_am_color_197e">#0000197e</color>
+ <color name="i_am_color_197f">#0000197f</color>
+ <color name="i_am_color_1980">#00001980</color>
+ <color name="i_am_color_1981">#00001981</color>
+ <color name="i_am_color_1982">#00001982</color>
+ <color name="i_am_color_1983">#00001983</color>
+ <color name="i_am_color_1984">#00001984</color>
+ <color name="i_am_color_1985">#00001985</color>
+ <color name="i_am_color_1986">#00001986</color>
+ <color name="i_am_color_1987">#00001987</color>
+ <color name="i_am_color_1988">#00001988</color>
+ <color name="i_am_color_1989">#00001989</color>
+ <color name="i_am_color_198a">#0000198a</color>
+ <color name="i_am_color_198b">#0000198b</color>
+ <color name="i_am_color_198c">#0000198c</color>
+ <color name="i_am_color_198d">#0000198d</color>
+ <color name="i_am_color_198e">#0000198e</color>
+ <color name="i_am_color_198f">#0000198f</color>
+ <color name="i_am_color_1990">#00001990</color>
+ <color name="i_am_color_1991">#00001991</color>
+ <color name="i_am_color_1992">#00001992</color>
+ <color name="i_am_color_1993">#00001993</color>
+ <color name="i_am_color_1994">#00001994</color>
+ <color name="i_am_color_1995">#00001995</color>
+ <color name="i_am_color_1996">#00001996</color>
+ <color name="i_am_color_1997">#00001997</color>
+ <color name="i_am_color_1998">#00001998</color>
+ <color name="i_am_color_1999">#00001999</color>
+ <color name="i_am_color_199a">#0000199a</color>
+ <color name="i_am_color_199b">#0000199b</color>
+ <color name="i_am_color_199c">#0000199c</color>
+ <color name="i_am_color_199d">#0000199d</color>
+ <color name="i_am_color_199e">#0000199e</color>
+ <color name="i_am_color_199f">#0000199f</color>
+ <color name="i_am_color_19a0">#000019a0</color>
+ <color name="i_am_color_19a1">#000019a1</color>
+ <color name="i_am_color_19a2">#000019a2</color>
+ <color name="i_am_color_19a3">#000019a3</color>
+ <color name="i_am_color_19a4">#000019a4</color>
+ <color name="i_am_color_19a5">#000019a5</color>
+ <color name="i_am_color_19a6">#000019a6</color>
+ <color name="i_am_color_19a7">#000019a7</color>
+ <color name="i_am_color_19a8">#000019a8</color>
+ <color name="i_am_color_19a9">#000019a9</color>
+ <color name="i_am_color_19aa">#000019aa</color>
+ <color name="i_am_color_19ab">#000019ab</color>
+ <color name="i_am_color_19ac">#000019ac</color>
+ <color name="i_am_color_19ad">#000019ad</color>
+ <color name="i_am_color_19ae">#000019ae</color>
+ <color name="i_am_color_19af">#000019af</color>
+ <color name="i_am_color_19b0">#000019b0</color>
+ <color name="i_am_color_19b1">#000019b1</color>
+ <color name="i_am_color_19b2">#000019b2</color>
+ <color name="i_am_color_19b3">#000019b3</color>
+ <color name="i_am_color_19b4">#000019b4</color>
+ <color name="i_am_color_19b5">#000019b5</color>
+ <color name="i_am_color_19b6">#000019b6</color>
+ <color name="i_am_color_19b7">#000019b7</color>
+ <color name="i_am_color_19b8">#000019b8</color>
+ <color name="i_am_color_19b9">#000019b9</color>
+ <color name="i_am_color_19ba">#000019ba</color>
+ <color name="i_am_color_19bb">#000019bb</color>
+ <color name="i_am_color_19bc">#000019bc</color>
+ <color name="i_am_color_19bd">#000019bd</color>
+ <color name="i_am_color_19be">#000019be</color>
+ <color name="i_am_color_19bf">#000019bf</color>
+ <color name="i_am_color_19c0">#000019c0</color>
+ <color name="i_am_color_19c1">#000019c1</color>
+ <color name="i_am_color_19c2">#000019c2</color>
+ <color name="i_am_color_19c3">#000019c3</color>
+ <color name="i_am_color_19c4">#000019c4</color>
+ <color name="i_am_color_19c5">#000019c5</color>
+ <color name="i_am_color_19c6">#000019c6</color>
+ <color name="i_am_color_19c7">#000019c7</color>
+ <color name="i_am_color_19c8">#000019c8</color>
+ <color name="i_am_color_19c9">#000019c9</color>
+ <color name="i_am_color_19ca">#000019ca</color>
+ <color name="i_am_color_19cb">#000019cb</color>
+ <color name="i_am_color_19cc">#000019cc</color>
+ <color name="i_am_color_19cd">#000019cd</color>
+ <color name="i_am_color_19ce">#000019ce</color>
+ <color name="i_am_color_19cf">#000019cf</color>
+ <color name="i_am_color_19d0">#000019d0</color>
+ <color name="i_am_color_19d1">#000019d1</color>
+ <color name="i_am_color_19d2">#000019d2</color>
+ <color name="i_am_color_19d3">#000019d3</color>
+ <color name="i_am_color_19d4">#000019d4</color>
+ <color name="i_am_color_19d5">#000019d5</color>
+ <color name="i_am_color_19d6">#000019d6</color>
+ <color name="i_am_color_19d7">#000019d7</color>
+ <color name="i_am_color_19d8">#000019d8</color>
+ <color name="i_am_color_19d9">#000019d9</color>
+ <color name="i_am_color_19da">#000019da</color>
+ <color name="i_am_color_19db">#000019db</color>
+ <color name="i_am_color_19dc">#000019dc</color>
+ <color name="i_am_color_19dd">#000019dd</color>
+ <color name="i_am_color_19de">#000019de</color>
+ <color name="i_am_color_19df">#000019df</color>
+ <color name="i_am_color_19e0">#000019e0</color>
+ <color name="i_am_color_19e1">#000019e1</color>
+ <color name="i_am_color_19e2">#000019e2</color>
+ <color name="i_am_color_19e3">#000019e3</color>
+ <color name="i_am_color_19e4">#000019e4</color>
+ <color name="i_am_color_19e5">#000019e5</color>
+ <color name="i_am_color_19e6">#000019e6</color>
+ <color name="i_am_color_19e7">#000019e7</color>
+ <color name="i_am_color_19e8">#000019e8</color>
+ <color name="i_am_color_19e9">#000019e9</color>
+ <color name="i_am_color_19ea">#000019ea</color>
+ <color name="i_am_color_19eb">#000019eb</color>
+ <color name="i_am_color_19ec">#000019ec</color>
+ <color name="i_am_color_19ed">#000019ed</color>
+ <color name="i_am_color_19ee">#000019ee</color>
+ <color name="i_am_color_19ef">#000019ef</color>
+ <color name="i_am_color_19f0">#000019f0</color>
+ <color name="i_am_color_19f1">#000019f1</color>
+ <color name="i_am_color_19f2">#000019f2</color>
+ <color name="i_am_color_19f3">#000019f3</color>
+ <color name="i_am_color_19f4">#000019f4</color>
+ <color name="i_am_color_19f5">#000019f5</color>
+ <color name="i_am_color_19f6">#000019f6</color>
+ <color name="i_am_color_19f7">#000019f7</color>
+ <color name="i_am_color_19f8">#000019f8</color>
+ <color name="i_am_color_19f9">#000019f9</color>
+ <color name="i_am_color_19fa">#000019fa</color>
+ <color name="i_am_color_19fb">#000019fb</color>
+ <color name="i_am_color_19fc">#000019fc</color>
+ <color name="i_am_color_19fd">#000019fd</color>
+ <color name="i_am_color_19fe">#000019fe</color>
+ <color name="i_am_color_19ff">#000019ff</color>
+ <color name="i_am_color_1a00">#00001a00</color>
+ <color name="i_am_color_1a01">#00001a01</color>
+ <color name="i_am_color_1a02">#00001a02</color>
+ <color name="i_am_color_1a03">#00001a03</color>
+ <color name="i_am_color_1a04">#00001a04</color>
+ <color name="i_am_color_1a05">#00001a05</color>
+ <color name="i_am_color_1a06">#00001a06</color>
+ <color name="i_am_color_1a07">#00001a07</color>
+ <color name="i_am_color_1a08">#00001a08</color>
+ <color name="i_am_color_1a09">#00001a09</color>
+ <color name="i_am_color_1a0a">#00001a0a</color>
+ <color name="i_am_color_1a0b">#00001a0b</color>
+ <color name="i_am_color_1a0c">#00001a0c</color>
+ <color name="i_am_color_1a0d">#00001a0d</color>
+ <color name="i_am_color_1a0e">#00001a0e</color>
+ <color name="i_am_color_1a0f">#00001a0f</color>
+ <color name="i_am_color_1a10">#00001a10</color>
+ <color name="i_am_color_1a11">#00001a11</color>
+ <color name="i_am_color_1a12">#00001a12</color>
+ <color name="i_am_color_1a13">#00001a13</color>
+ <color name="i_am_color_1a14">#00001a14</color>
+ <color name="i_am_color_1a15">#00001a15</color>
+ <color name="i_am_color_1a16">#00001a16</color>
+ <color name="i_am_color_1a17">#00001a17</color>
+ <color name="i_am_color_1a18">#00001a18</color>
+ <color name="i_am_color_1a19">#00001a19</color>
+ <color name="i_am_color_1a1a">#00001a1a</color>
+ <color name="i_am_color_1a1b">#00001a1b</color>
+ <color name="i_am_color_1a1c">#00001a1c</color>
+ <color name="i_am_color_1a1d">#00001a1d</color>
+ <color name="i_am_color_1a1e">#00001a1e</color>
+ <color name="i_am_color_1a1f">#00001a1f</color>
+ <color name="i_am_color_1a20">#00001a20</color>
+ <color name="i_am_color_1a21">#00001a21</color>
+ <color name="i_am_color_1a22">#00001a22</color>
+ <color name="i_am_color_1a23">#00001a23</color>
+ <color name="i_am_color_1a24">#00001a24</color>
+ <color name="i_am_color_1a25">#00001a25</color>
+ <color name="i_am_color_1a26">#00001a26</color>
+ <color name="i_am_color_1a27">#00001a27</color>
+ <color name="i_am_color_1a28">#00001a28</color>
+ <color name="i_am_color_1a29">#00001a29</color>
+ <color name="i_am_color_1a2a">#00001a2a</color>
+ <color name="i_am_color_1a2b">#00001a2b</color>
+ <color name="i_am_color_1a2c">#00001a2c</color>
+ <color name="i_am_color_1a2d">#00001a2d</color>
+ <color name="i_am_color_1a2e">#00001a2e</color>
+ <color name="i_am_color_1a2f">#00001a2f</color>
+ <color name="i_am_color_1a30">#00001a30</color>
+ <color name="i_am_color_1a31">#00001a31</color>
+ <color name="i_am_color_1a32">#00001a32</color>
+ <color name="i_am_color_1a33">#00001a33</color>
+ <color name="i_am_color_1a34">#00001a34</color>
+ <color name="i_am_color_1a35">#00001a35</color>
+ <color name="i_am_color_1a36">#00001a36</color>
+ <color name="i_am_color_1a37">#00001a37</color>
+ <color name="i_am_color_1a38">#00001a38</color>
+ <color name="i_am_color_1a39">#00001a39</color>
+ <color name="i_am_color_1a3a">#00001a3a</color>
+ <color name="i_am_color_1a3b">#00001a3b</color>
+ <color name="i_am_color_1a3c">#00001a3c</color>
+ <color name="i_am_color_1a3d">#00001a3d</color>
+ <color name="i_am_color_1a3e">#00001a3e</color>
+ <color name="i_am_color_1a3f">#00001a3f</color>
+ <color name="i_am_color_1a40">#00001a40</color>
+ <color name="i_am_color_1a41">#00001a41</color>
+ <color name="i_am_color_1a42">#00001a42</color>
+ <color name="i_am_color_1a43">#00001a43</color>
+ <color name="i_am_color_1a44">#00001a44</color>
+ <color name="i_am_color_1a45">#00001a45</color>
+ <color name="i_am_color_1a46">#00001a46</color>
+ <color name="i_am_color_1a47">#00001a47</color>
+ <color name="i_am_color_1a48">#00001a48</color>
+ <color name="i_am_color_1a49">#00001a49</color>
+ <color name="i_am_color_1a4a">#00001a4a</color>
+ <color name="i_am_color_1a4b">#00001a4b</color>
+ <color name="i_am_color_1a4c">#00001a4c</color>
+ <color name="i_am_color_1a4d">#00001a4d</color>
+ <color name="i_am_color_1a4e">#00001a4e</color>
+ <color name="i_am_color_1a4f">#00001a4f</color>
+ <color name="i_am_color_1a50">#00001a50</color>
+ <color name="i_am_color_1a51">#00001a51</color>
+ <color name="i_am_color_1a52">#00001a52</color>
+ <color name="i_am_color_1a53">#00001a53</color>
+ <color name="i_am_color_1a54">#00001a54</color>
+ <color name="i_am_color_1a55">#00001a55</color>
+ <color name="i_am_color_1a56">#00001a56</color>
+ <color name="i_am_color_1a57">#00001a57</color>
+ <color name="i_am_color_1a58">#00001a58</color>
+ <color name="i_am_color_1a59">#00001a59</color>
+ <color name="i_am_color_1a5a">#00001a5a</color>
+ <color name="i_am_color_1a5b">#00001a5b</color>
+ <color name="i_am_color_1a5c">#00001a5c</color>
+ <color name="i_am_color_1a5d">#00001a5d</color>
+ <color name="i_am_color_1a5e">#00001a5e</color>
+ <color name="i_am_color_1a5f">#00001a5f</color>
+ <color name="i_am_color_1a60">#00001a60</color>
+ <color name="i_am_color_1a61">#00001a61</color>
+ <color name="i_am_color_1a62">#00001a62</color>
+ <color name="i_am_color_1a63">#00001a63</color>
+ <color name="i_am_color_1a64">#00001a64</color>
+ <color name="i_am_color_1a65">#00001a65</color>
+ <color name="i_am_color_1a66">#00001a66</color>
+ <color name="i_am_color_1a67">#00001a67</color>
+ <color name="i_am_color_1a68">#00001a68</color>
+ <color name="i_am_color_1a69">#00001a69</color>
+ <color name="i_am_color_1a6a">#00001a6a</color>
+ <color name="i_am_color_1a6b">#00001a6b</color>
+ <color name="i_am_color_1a6c">#00001a6c</color>
+ <color name="i_am_color_1a6d">#00001a6d</color>
+ <color name="i_am_color_1a6e">#00001a6e</color>
+ <color name="i_am_color_1a6f">#00001a6f</color>
+ <color name="i_am_color_1a70">#00001a70</color>
+ <color name="i_am_color_1a71">#00001a71</color>
+ <color name="i_am_color_1a72">#00001a72</color>
+ <color name="i_am_color_1a73">#00001a73</color>
+ <color name="i_am_color_1a74">#00001a74</color>
+ <color name="i_am_color_1a75">#00001a75</color>
+ <color name="i_am_color_1a76">#00001a76</color>
+ <color name="i_am_color_1a77">#00001a77</color>
+ <color name="i_am_color_1a78">#00001a78</color>
+ <color name="i_am_color_1a79">#00001a79</color>
+ <color name="i_am_color_1a7a">#00001a7a</color>
+ <color name="i_am_color_1a7b">#00001a7b</color>
+ <color name="i_am_color_1a7c">#00001a7c</color>
+ <color name="i_am_color_1a7d">#00001a7d</color>
+ <color name="i_am_color_1a7e">#00001a7e</color>
+ <color name="i_am_color_1a7f">#00001a7f</color>
+ <color name="i_am_color_1a80">#00001a80</color>
+ <color name="i_am_color_1a81">#00001a81</color>
+ <color name="i_am_color_1a82">#00001a82</color>
+ <color name="i_am_color_1a83">#00001a83</color>
+ <color name="i_am_color_1a84">#00001a84</color>
+ <color name="i_am_color_1a85">#00001a85</color>
+ <color name="i_am_color_1a86">#00001a86</color>
+ <color name="i_am_color_1a87">#00001a87</color>
+ <color name="i_am_color_1a88">#00001a88</color>
+ <color name="i_am_color_1a89">#00001a89</color>
+ <color name="i_am_color_1a8a">#00001a8a</color>
+ <color name="i_am_color_1a8b">#00001a8b</color>
+ <color name="i_am_color_1a8c">#00001a8c</color>
+ <color name="i_am_color_1a8d">#00001a8d</color>
+ <color name="i_am_color_1a8e">#00001a8e</color>
+ <color name="i_am_color_1a8f">#00001a8f</color>
+ <color name="i_am_color_1a90">#00001a90</color>
+ <color name="i_am_color_1a91">#00001a91</color>
+ <color name="i_am_color_1a92">#00001a92</color>
+ <color name="i_am_color_1a93">#00001a93</color>
+ <color name="i_am_color_1a94">#00001a94</color>
+ <color name="i_am_color_1a95">#00001a95</color>
+ <color name="i_am_color_1a96">#00001a96</color>
+ <color name="i_am_color_1a97">#00001a97</color>
+ <color name="i_am_color_1a98">#00001a98</color>
+ <color name="i_am_color_1a99">#00001a99</color>
+ <color name="i_am_color_1a9a">#00001a9a</color>
+ <color name="i_am_color_1a9b">#00001a9b</color>
+ <color name="i_am_color_1a9c">#00001a9c</color>
+ <color name="i_am_color_1a9d">#00001a9d</color>
+ <color name="i_am_color_1a9e">#00001a9e</color>
+ <color name="i_am_color_1a9f">#00001a9f</color>
+ <color name="i_am_color_1aa0">#00001aa0</color>
+ <color name="i_am_color_1aa1">#00001aa1</color>
+ <color name="i_am_color_1aa2">#00001aa2</color>
+ <color name="i_am_color_1aa3">#00001aa3</color>
+ <color name="i_am_color_1aa4">#00001aa4</color>
+ <color name="i_am_color_1aa5">#00001aa5</color>
+ <color name="i_am_color_1aa6">#00001aa6</color>
+ <color name="i_am_color_1aa7">#00001aa7</color>
+ <color name="i_am_color_1aa8">#00001aa8</color>
+ <color name="i_am_color_1aa9">#00001aa9</color>
+ <color name="i_am_color_1aaa">#00001aaa</color>
+ <color name="i_am_color_1aab">#00001aab</color>
+ <color name="i_am_color_1aac">#00001aac</color>
+ <color name="i_am_color_1aad">#00001aad</color>
+ <color name="i_am_color_1aae">#00001aae</color>
+ <color name="i_am_color_1aaf">#00001aaf</color>
+ <color name="i_am_color_1ab0">#00001ab0</color>
+ <color name="i_am_color_1ab1">#00001ab1</color>
+ <color name="i_am_color_1ab2">#00001ab2</color>
+ <color name="i_am_color_1ab3">#00001ab3</color>
+ <color name="i_am_color_1ab4">#00001ab4</color>
+ <color name="i_am_color_1ab5">#00001ab5</color>
+ <color name="i_am_color_1ab6">#00001ab6</color>
+ <color name="i_am_color_1ab7">#00001ab7</color>
+ <color name="i_am_color_1ab8">#00001ab8</color>
+ <color name="i_am_color_1ab9">#00001ab9</color>
+ <color name="i_am_color_1aba">#00001aba</color>
+ <color name="i_am_color_1abb">#00001abb</color>
+ <color name="i_am_color_1abc">#00001abc</color>
+ <color name="i_am_color_1abd">#00001abd</color>
+ <color name="i_am_color_1abe">#00001abe</color>
+ <color name="i_am_color_1abf">#00001abf</color>
+ <color name="i_am_color_1ac0">#00001ac0</color>
+ <color name="i_am_color_1ac1">#00001ac1</color>
+ <color name="i_am_color_1ac2">#00001ac2</color>
+ <color name="i_am_color_1ac3">#00001ac3</color>
+ <color name="i_am_color_1ac4">#00001ac4</color>
+ <color name="i_am_color_1ac5">#00001ac5</color>
+ <color name="i_am_color_1ac6">#00001ac6</color>
+ <color name="i_am_color_1ac7">#00001ac7</color>
+ <color name="i_am_color_1ac8">#00001ac8</color>
+ <color name="i_am_color_1ac9">#00001ac9</color>
+ <color name="i_am_color_1aca">#00001aca</color>
+ <color name="i_am_color_1acb">#00001acb</color>
+ <color name="i_am_color_1acc">#00001acc</color>
+ <color name="i_am_color_1acd">#00001acd</color>
+ <color name="i_am_color_1ace">#00001ace</color>
+ <color name="i_am_color_1acf">#00001acf</color>
+ <color name="i_am_color_1ad0">#00001ad0</color>
+ <color name="i_am_color_1ad1">#00001ad1</color>
+ <color name="i_am_color_1ad2">#00001ad2</color>
+ <color name="i_am_color_1ad3">#00001ad3</color>
+ <color name="i_am_color_1ad4">#00001ad4</color>
+ <color name="i_am_color_1ad5">#00001ad5</color>
+ <color name="i_am_color_1ad6">#00001ad6</color>
+ <color name="i_am_color_1ad7">#00001ad7</color>
+ <color name="i_am_color_1ad8">#00001ad8</color>
+ <color name="i_am_color_1ad9">#00001ad9</color>
+ <color name="i_am_color_1ada">#00001ada</color>
+ <color name="i_am_color_1adb">#00001adb</color>
+ <color name="i_am_color_1adc">#00001adc</color>
+ <color name="i_am_color_1add">#00001add</color>
+ <color name="i_am_color_1ade">#00001ade</color>
+ <color name="i_am_color_1adf">#00001adf</color>
+ <color name="i_am_color_1ae0">#00001ae0</color>
+ <color name="i_am_color_1ae1">#00001ae1</color>
+ <color name="i_am_color_1ae2">#00001ae2</color>
+ <color name="i_am_color_1ae3">#00001ae3</color>
+ <color name="i_am_color_1ae4">#00001ae4</color>
+ <color name="i_am_color_1ae5">#00001ae5</color>
+ <color name="i_am_color_1ae6">#00001ae6</color>
+ <color name="i_am_color_1ae7">#00001ae7</color>
+ <color name="i_am_color_1ae8">#00001ae8</color>
+ <color name="i_am_color_1ae9">#00001ae9</color>
+ <color name="i_am_color_1aea">#00001aea</color>
+ <color name="i_am_color_1aeb">#00001aeb</color>
+ <color name="i_am_color_1aec">#00001aec</color>
+ <color name="i_am_color_1aed">#00001aed</color>
+ <color name="i_am_color_1aee">#00001aee</color>
+ <color name="i_am_color_1aef">#00001aef</color>
+ <color name="i_am_color_1af0">#00001af0</color>
+ <color name="i_am_color_1af1">#00001af1</color>
+ <color name="i_am_color_1af2">#00001af2</color>
+ <color name="i_am_color_1af3">#00001af3</color>
+ <color name="i_am_color_1af4">#00001af4</color>
+ <color name="i_am_color_1af5">#00001af5</color>
+ <color name="i_am_color_1af6">#00001af6</color>
+ <color name="i_am_color_1af7">#00001af7</color>
+ <color name="i_am_color_1af8">#00001af8</color>
+ <color name="i_am_color_1af9">#00001af9</color>
+ <color name="i_am_color_1afa">#00001afa</color>
+ <color name="i_am_color_1afb">#00001afb</color>
+ <color name="i_am_color_1afc">#00001afc</color>
+ <color name="i_am_color_1afd">#00001afd</color>
+ <color name="i_am_color_1afe">#00001afe</color>
+ <color name="i_am_color_1aff">#00001aff</color>
+ <color name="i_am_color_1b00">#00001b00</color>
+ <color name="i_am_color_1b01">#00001b01</color>
+ <color name="i_am_color_1b02">#00001b02</color>
+ <color name="i_am_color_1b03">#00001b03</color>
+ <color name="i_am_color_1b04">#00001b04</color>
+ <color name="i_am_color_1b05">#00001b05</color>
+ <color name="i_am_color_1b06">#00001b06</color>
+ <color name="i_am_color_1b07">#00001b07</color>
+ <color name="i_am_color_1b08">#00001b08</color>
+ <color name="i_am_color_1b09">#00001b09</color>
+ <color name="i_am_color_1b0a">#00001b0a</color>
+ <color name="i_am_color_1b0b">#00001b0b</color>
+ <color name="i_am_color_1b0c">#00001b0c</color>
+ <color name="i_am_color_1b0d">#00001b0d</color>
+ <color name="i_am_color_1b0e">#00001b0e</color>
+ <color name="i_am_color_1b0f">#00001b0f</color>
+ <color name="i_am_color_1b10">#00001b10</color>
+ <color name="i_am_color_1b11">#00001b11</color>
+ <color name="i_am_color_1b12">#00001b12</color>
+ <color name="i_am_color_1b13">#00001b13</color>
+ <color name="i_am_color_1b14">#00001b14</color>
+ <color name="i_am_color_1b15">#00001b15</color>
+ <color name="i_am_color_1b16">#00001b16</color>
+ <color name="i_am_color_1b17">#00001b17</color>
+ <color name="i_am_color_1b18">#00001b18</color>
+ <color name="i_am_color_1b19">#00001b19</color>
+ <color name="i_am_color_1b1a">#00001b1a</color>
+ <color name="i_am_color_1b1b">#00001b1b</color>
+ <color name="i_am_color_1b1c">#00001b1c</color>
+ <color name="i_am_color_1b1d">#00001b1d</color>
+ <color name="i_am_color_1b1e">#00001b1e</color>
+ <color name="i_am_color_1b1f">#00001b1f</color>
+ <color name="i_am_color_1b20">#00001b20</color>
+ <color name="i_am_color_1b21">#00001b21</color>
+ <color name="i_am_color_1b22">#00001b22</color>
+ <color name="i_am_color_1b23">#00001b23</color>
+ <color name="i_am_color_1b24">#00001b24</color>
+ <color name="i_am_color_1b25">#00001b25</color>
+ <color name="i_am_color_1b26">#00001b26</color>
+ <color name="i_am_color_1b27">#00001b27</color>
+ <color name="i_am_color_1b28">#00001b28</color>
+ <color name="i_am_color_1b29">#00001b29</color>
+ <color name="i_am_color_1b2a">#00001b2a</color>
+ <color name="i_am_color_1b2b">#00001b2b</color>
+ <color name="i_am_color_1b2c">#00001b2c</color>
+ <color name="i_am_color_1b2d">#00001b2d</color>
+ <color name="i_am_color_1b2e">#00001b2e</color>
+ <color name="i_am_color_1b2f">#00001b2f</color>
+ <color name="i_am_color_1b30">#00001b30</color>
+ <color name="i_am_color_1b31">#00001b31</color>
+ <color name="i_am_color_1b32">#00001b32</color>
+ <color name="i_am_color_1b33">#00001b33</color>
+ <color name="i_am_color_1b34">#00001b34</color>
+ <color name="i_am_color_1b35">#00001b35</color>
+ <color name="i_am_color_1b36">#00001b36</color>
+ <color name="i_am_color_1b37">#00001b37</color>
+ <color name="i_am_color_1b38">#00001b38</color>
+ <color name="i_am_color_1b39">#00001b39</color>
+ <color name="i_am_color_1b3a">#00001b3a</color>
+ <color name="i_am_color_1b3b">#00001b3b</color>
+ <color name="i_am_color_1b3c">#00001b3c</color>
+ <color name="i_am_color_1b3d">#00001b3d</color>
+ <color name="i_am_color_1b3e">#00001b3e</color>
+ <color name="i_am_color_1b3f">#00001b3f</color>
+ <color name="i_am_color_1b40">#00001b40</color>
+ <color name="i_am_color_1b41">#00001b41</color>
+ <color name="i_am_color_1b42">#00001b42</color>
+ <color name="i_am_color_1b43">#00001b43</color>
+ <color name="i_am_color_1b44">#00001b44</color>
+ <color name="i_am_color_1b45">#00001b45</color>
+ <color name="i_am_color_1b46">#00001b46</color>
+ <color name="i_am_color_1b47">#00001b47</color>
+ <color name="i_am_color_1b48">#00001b48</color>
+ <color name="i_am_color_1b49">#00001b49</color>
+ <color name="i_am_color_1b4a">#00001b4a</color>
+ <color name="i_am_color_1b4b">#00001b4b</color>
+ <color name="i_am_color_1b4c">#00001b4c</color>
+ <color name="i_am_color_1b4d">#00001b4d</color>
+ <color name="i_am_color_1b4e">#00001b4e</color>
+ <color name="i_am_color_1b4f">#00001b4f</color>
+ <color name="i_am_color_1b50">#00001b50</color>
+ <color name="i_am_color_1b51">#00001b51</color>
+ <color name="i_am_color_1b52">#00001b52</color>
+ <color name="i_am_color_1b53">#00001b53</color>
+ <color name="i_am_color_1b54">#00001b54</color>
+ <color name="i_am_color_1b55">#00001b55</color>
+ <color name="i_am_color_1b56">#00001b56</color>
+ <color name="i_am_color_1b57">#00001b57</color>
+ <color name="i_am_color_1b58">#00001b58</color>
+ <color name="i_am_color_1b59">#00001b59</color>
+ <color name="i_am_color_1b5a">#00001b5a</color>
+ <color name="i_am_color_1b5b">#00001b5b</color>
+ <color name="i_am_color_1b5c">#00001b5c</color>
+ <color name="i_am_color_1b5d">#00001b5d</color>
+ <color name="i_am_color_1b5e">#00001b5e</color>
+ <color name="i_am_color_1b5f">#00001b5f</color>
+ <color name="i_am_color_1b60">#00001b60</color>
+ <color name="i_am_color_1b61">#00001b61</color>
+ <color name="i_am_color_1b62">#00001b62</color>
+ <color name="i_am_color_1b63">#00001b63</color>
+ <color name="i_am_color_1b64">#00001b64</color>
+ <color name="i_am_color_1b65">#00001b65</color>
+ <color name="i_am_color_1b66">#00001b66</color>
+ <color name="i_am_color_1b67">#00001b67</color>
+ <color name="i_am_color_1b68">#00001b68</color>
+ <color name="i_am_color_1b69">#00001b69</color>
+ <color name="i_am_color_1b6a">#00001b6a</color>
+ <color name="i_am_color_1b6b">#00001b6b</color>
+ <color name="i_am_color_1b6c">#00001b6c</color>
+ <color name="i_am_color_1b6d">#00001b6d</color>
+ <color name="i_am_color_1b6e">#00001b6e</color>
+ <color name="i_am_color_1b6f">#00001b6f</color>
+ <color name="i_am_color_1b70">#00001b70</color>
+ <color name="i_am_color_1b71">#00001b71</color>
+ <color name="i_am_color_1b72">#00001b72</color>
+ <color name="i_am_color_1b73">#00001b73</color>
+ <color name="i_am_color_1b74">#00001b74</color>
+ <color name="i_am_color_1b75">#00001b75</color>
+ <color name="i_am_color_1b76">#00001b76</color>
+ <color name="i_am_color_1b77">#00001b77</color>
+ <color name="i_am_color_1b78">#00001b78</color>
+ <color name="i_am_color_1b79">#00001b79</color>
+ <color name="i_am_color_1b7a">#00001b7a</color>
+ <color name="i_am_color_1b7b">#00001b7b</color>
+ <color name="i_am_color_1b7c">#00001b7c</color>
+ <color name="i_am_color_1b7d">#00001b7d</color>
+ <color name="i_am_color_1b7e">#00001b7e</color>
+ <color name="i_am_color_1b7f">#00001b7f</color>
+ <color name="i_am_color_1b80">#00001b80</color>
+ <color name="i_am_color_1b81">#00001b81</color>
+ <color name="i_am_color_1b82">#00001b82</color>
+ <color name="i_am_color_1b83">#00001b83</color>
+ <color name="i_am_color_1b84">#00001b84</color>
+ <color name="i_am_color_1b85">#00001b85</color>
+ <color name="i_am_color_1b86">#00001b86</color>
+ <color name="i_am_color_1b87">#00001b87</color>
+ <color name="i_am_color_1b88">#00001b88</color>
+ <color name="i_am_color_1b89">#00001b89</color>
+ <color name="i_am_color_1b8a">#00001b8a</color>
+ <color name="i_am_color_1b8b">#00001b8b</color>
+ <color name="i_am_color_1b8c">#00001b8c</color>
+ <color name="i_am_color_1b8d">#00001b8d</color>
+ <color name="i_am_color_1b8e">#00001b8e</color>
+ <color name="i_am_color_1b8f">#00001b8f</color>
+ <color name="i_am_color_1b90">#00001b90</color>
+ <color name="i_am_color_1b91">#00001b91</color>
+ <color name="i_am_color_1b92">#00001b92</color>
+ <color name="i_am_color_1b93">#00001b93</color>
+ <color name="i_am_color_1b94">#00001b94</color>
+ <color name="i_am_color_1b95">#00001b95</color>
+ <color name="i_am_color_1b96">#00001b96</color>
+ <color name="i_am_color_1b97">#00001b97</color>
+ <color name="i_am_color_1b98">#00001b98</color>
+ <color name="i_am_color_1b99">#00001b99</color>
+ <color name="i_am_color_1b9a">#00001b9a</color>
+ <color name="i_am_color_1b9b">#00001b9b</color>
+ <color name="i_am_color_1b9c">#00001b9c</color>
+ <color name="i_am_color_1b9d">#00001b9d</color>
+ <color name="i_am_color_1b9e">#00001b9e</color>
+ <color name="i_am_color_1b9f">#00001b9f</color>
+ <color name="i_am_color_1ba0">#00001ba0</color>
+ <color name="i_am_color_1ba1">#00001ba1</color>
+ <color name="i_am_color_1ba2">#00001ba2</color>
+ <color name="i_am_color_1ba3">#00001ba3</color>
+ <color name="i_am_color_1ba4">#00001ba4</color>
+ <color name="i_am_color_1ba5">#00001ba5</color>
+ <color name="i_am_color_1ba6">#00001ba6</color>
+ <color name="i_am_color_1ba7">#00001ba7</color>
+ <color name="i_am_color_1ba8">#00001ba8</color>
+ <color name="i_am_color_1ba9">#00001ba9</color>
+ <color name="i_am_color_1baa">#00001baa</color>
+ <color name="i_am_color_1bab">#00001bab</color>
+ <color name="i_am_color_1bac">#00001bac</color>
+ <color name="i_am_color_1bad">#00001bad</color>
+ <color name="i_am_color_1bae">#00001bae</color>
+ <color name="i_am_color_1baf">#00001baf</color>
+ <color name="i_am_color_1bb0">#00001bb0</color>
+ <color name="i_am_color_1bb1">#00001bb1</color>
+ <color name="i_am_color_1bb2">#00001bb2</color>
+ <color name="i_am_color_1bb3">#00001bb3</color>
+ <color name="i_am_color_1bb4">#00001bb4</color>
+ <color name="i_am_color_1bb5">#00001bb5</color>
+ <color name="i_am_color_1bb6">#00001bb6</color>
+ <color name="i_am_color_1bb7">#00001bb7</color>
+ <color name="i_am_color_1bb8">#00001bb8</color>
+ <color name="i_am_color_1bb9">#00001bb9</color>
+ <color name="i_am_color_1bba">#00001bba</color>
+ <color name="i_am_color_1bbb">#00001bbb</color>
+ <color name="i_am_color_1bbc">#00001bbc</color>
+ <color name="i_am_color_1bbd">#00001bbd</color>
+ <color name="i_am_color_1bbe">#00001bbe</color>
+ <color name="i_am_color_1bbf">#00001bbf</color>
+ <color name="i_am_color_1bc0">#00001bc0</color>
+ <color name="i_am_color_1bc1">#00001bc1</color>
+ <color name="i_am_color_1bc2">#00001bc2</color>
+ <color name="i_am_color_1bc3">#00001bc3</color>
+ <color name="i_am_color_1bc4">#00001bc4</color>
+ <color name="i_am_color_1bc5">#00001bc5</color>
+ <color name="i_am_color_1bc6">#00001bc6</color>
+ <color name="i_am_color_1bc7">#00001bc7</color>
+ <color name="i_am_color_1bc8">#00001bc8</color>
+ <color name="i_am_color_1bc9">#00001bc9</color>
+ <color name="i_am_color_1bca">#00001bca</color>
+ <color name="i_am_color_1bcb">#00001bcb</color>
+ <color name="i_am_color_1bcc">#00001bcc</color>
+ <color name="i_am_color_1bcd">#00001bcd</color>
+ <color name="i_am_color_1bce">#00001bce</color>
+ <color name="i_am_color_1bcf">#00001bcf</color>
+ <color name="i_am_color_1bd0">#00001bd0</color>
+ <color name="i_am_color_1bd1">#00001bd1</color>
+ <color name="i_am_color_1bd2">#00001bd2</color>
+ <color name="i_am_color_1bd3">#00001bd3</color>
+ <color name="i_am_color_1bd4">#00001bd4</color>
+ <color name="i_am_color_1bd5">#00001bd5</color>
+ <color name="i_am_color_1bd6">#00001bd6</color>
+ <color name="i_am_color_1bd7">#00001bd7</color>
+ <color name="i_am_color_1bd8">#00001bd8</color>
+ <color name="i_am_color_1bd9">#00001bd9</color>
+ <color name="i_am_color_1bda">#00001bda</color>
+ <color name="i_am_color_1bdb">#00001bdb</color>
+ <color name="i_am_color_1bdc">#00001bdc</color>
+ <color name="i_am_color_1bdd">#00001bdd</color>
+ <color name="i_am_color_1bde">#00001bde</color>
+ <color name="i_am_color_1bdf">#00001bdf</color>
+ <color name="i_am_color_1be0">#00001be0</color>
+ <color name="i_am_color_1be1">#00001be1</color>
+ <color name="i_am_color_1be2">#00001be2</color>
+ <color name="i_am_color_1be3">#00001be3</color>
+ <color name="i_am_color_1be4">#00001be4</color>
+ <color name="i_am_color_1be5">#00001be5</color>
+ <color name="i_am_color_1be6">#00001be6</color>
+ <color name="i_am_color_1be7">#00001be7</color>
+ <color name="i_am_color_1be8">#00001be8</color>
+ <color name="i_am_color_1be9">#00001be9</color>
+ <color name="i_am_color_1bea">#00001bea</color>
+ <color name="i_am_color_1beb">#00001beb</color>
+ <color name="i_am_color_1bec">#00001bec</color>
+ <color name="i_am_color_1bed">#00001bed</color>
+ <color name="i_am_color_1bee">#00001bee</color>
+ <color name="i_am_color_1bef">#00001bef</color>
+ <color name="i_am_color_1bf0">#00001bf0</color>
+ <color name="i_am_color_1bf1">#00001bf1</color>
+ <color name="i_am_color_1bf2">#00001bf2</color>
+ <color name="i_am_color_1bf3">#00001bf3</color>
+ <color name="i_am_color_1bf4">#00001bf4</color>
+ <color name="i_am_color_1bf5">#00001bf5</color>
+ <color name="i_am_color_1bf6">#00001bf6</color>
+ <color name="i_am_color_1bf7">#00001bf7</color>
+ <color name="i_am_color_1bf8">#00001bf8</color>
+ <color name="i_am_color_1bf9">#00001bf9</color>
+ <color name="i_am_color_1bfa">#00001bfa</color>
+ <color name="i_am_color_1bfb">#00001bfb</color>
+ <color name="i_am_color_1bfc">#00001bfc</color>
+ <color name="i_am_color_1bfd">#00001bfd</color>
+ <color name="i_am_color_1bfe">#00001bfe</color>
+ <color name="i_am_color_1bff">#00001bff</color>
+ <color name="i_am_color_1c00">#00001c00</color>
+ <color name="i_am_color_1c01">#00001c01</color>
+ <color name="i_am_color_1c02">#00001c02</color>
+ <color name="i_am_color_1c03">#00001c03</color>
+ <color name="i_am_color_1c04">#00001c04</color>
+ <color name="i_am_color_1c05">#00001c05</color>
+ <color name="i_am_color_1c06">#00001c06</color>
+ <color name="i_am_color_1c07">#00001c07</color>
+ <color name="i_am_color_1c08">#00001c08</color>
+ <color name="i_am_color_1c09">#00001c09</color>
+ <color name="i_am_color_1c0a">#00001c0a</color>
+ <color name="i_am_color_1c0b">#00001c0b</color>
+ <color name="i_am_color_1c0c">#00001c0c</color>
+ <color name="i_am_color_1c0d">#00001c0d</color>
+ <color name="i_am_color_1c0e">#00001c0e</color>
+ <color name="i_am_color_1c0f">#00001c0f</color>
+ <color name="i_am_color_1c10">#00001c10</color>
+ <color name="i_am_color_1c11">#00001c11</color>
+ <color name="i_am_color_1c12">#00001c12</color>
+ <color name="i_am_color_1c13">#00001c13</color>
+ <color name="i_am_color_1c14">#00001c14</color>
+ <color name="i_am_color_1c15">#00001c15</color>
+ <color name="i_am_color_1c16">#00001c16</color>
+ <color name="i_am_color_1c17">#00001c17</color>
+ <color name="i_am_color_1c18">#00001c18</color>
+ <color name="i_am_color_1c19">#00001c19</color>
+ <color name="i_am_color_1c1a">#00001c1a</color>
+ <color name="i_am_color_1c1b">#00001c1b</color>
+ <color name="i_am_color_1c1c">#00001c1c</color>
+ <color name="i_am_color_1c1d">#00001c1d</color>
+ <color name="i_am_color_1c1e">#00001c1e</color>
+ <color name="i_am_color_1c1f">#00001c1f</color>
+ <color name="i_am_color_1c20">#00001c20</color>
+ <color name="i_am_color_1c21">#00001c21</color>
+ <color name="i_am_color_1c22">#00001c22</color>
+ <color name="i_am_color_1c23">#00001c23</color>
+ <color name="i_am_color_1c24">#00001c24</color>
+ <color name="i_am_color_1c25">#00001c25</color>
+ <color name="i_am_color_1c26">#00001c26</color>
+ <color name="i_am_color_1c27">#00001c27</color>
+ <color name="i_am_color_1c28">#00001c28</color>
+ <color name="i_am_color_1c29">#00001c29</color>
+ <color name="i_am_color_1c2a">#00001c2a</color>
+ <color name="i_am_color_1c2b">#00001c2b</color>
+ <color name="i_am_color_1c2c">#00001c2c</color>
+ <color name="i_am_color_1c2d">#00001c2d</color>
+ <color name="i_am_color_1c2e">#00001c2e</color>
+ <color name="i_am_color_1c2f">#00001c2f</color>
+ <color name="i_am_color_1c30">#00001c30</color>
+ <color name="i_am_color_1c31">#00001c31</color>
+ <color name="i_am_color_1c32">#00001c32</color>
+ <color name="i_am_color_1c33">#00001c33</color>
+ <color name="i_am_color_1c34">#00001c34</color>
+ <color name="i_am_color_1c35">#00001c35</color>
+ <color name="i_am_color_1c36">#00001c36</color>
+ <color name="i_am_color_1c37">#00001c37</color>
+ <color name="i_am_color_1c38">#00001c38</color>
+ <color name="i_am_color_1c39">#00001c39</color>
+ <color name="i_am_color_1c3a">#00001c3a</color>
+ <color name="i_am_color_1c3b">#00001c3b</color>
+ <color name="i_am_color_1c3c">#00001c3c</color>
+ <color name="i_am_color_1c3d">#00001c3d</color>
+ <color name="i_am_color_1c3e">#00001c3e</color>
+ <color name="i_am_color_1c3f">#00001c3f</color>
+ <color name="i_am_color_1c40">#00001c40</color>
+ <color name="i_am_color_1c41">#00001c41</color>
+ <color name="i_am_color_1c42">#00001c42</color>
+ <color name="i_am_color_1c43">#00001c43</color>
+ <color name="i_am_color_1c44">#00001c44</color>
+ <color name="i_am_color_1c45">#00001c45</color>
+ <color name="i_am_color_1c46">#00001c46</color>
+ <color name="i_am_color_1c47">#00001c47</color>
+ <color name="i_am_color_1c48">#00001c48</color>
+ <color name="i_am_color_1c49">#00001c49</color>
+ <color name="i_am_color_1c4a">#00001c4a</color>
+ <color name="i_am_color_1c4b">#00001c4b</color>
+ <color name="i_am_color_1c4c">#00001c4c</color>
+ <color name="i_am_color_1c4d">#00001c4d</color>
+ <color name="i_am_color_1c4e">#00001c4e</color>
+ <color name="i_am_color_1c4f">#00001c4f</color>
+ <color name="i_am_color_1c50">#00001c50</color>
+ <color name="i_am_color_1c51">#00001c51</color>
+ <color name="i_am_color_1c52">#00001c52</color>
+ <color name="i_am_color_1c53">#00001c53</color>
+ <color name="i_am_color_1c54">#00001c54</color>
+ <color name="i_am_color_1c55">#00001c55</color>
+ <color name="i_am_color_1c56">#00001c56</color>
+ <color name="i_am_color_1c57">#00001c57</color>
+ <color name="i_am_color_1c58">#00001c58</color>
+ <color name="i_am_color_1c59">#00001c59</color>
+ <color name="i_am_color_1c5a">#00001c5a</color>
+ <color name="i_am_color_1c5b">#00001c5b</color>
+ <color name="i_am_color_1c5c">#00001c5c</color>
+ <color name="i_am_color_1c5d">#00001c5d</color>
+ <color name="i_am_color_1c5e">#00001c5e</color>
+ <color name="i_am_color_1c5f">#00001c5f</color>
+ <color name="i_am_color_1c60">#00001c60</color>
+ <color name="i_am_color_1c61">#00001c61</color>
+ <color name="i_am_color_1c62">#00001c62</color>
+ <color name="i_am_color_1c63">#00001c63</color>
+ <color name="i_am_color_1c64">#00001c64</color>
+ <color name="i_am_color_1c65">#00001c65</color>
+ <color name="i_am_color_1c66">#00001c66</color>
+ <color name="i_am_color_1c67">#00001c67</color>
+ <color name="i_am_color_1c68">#00001c68</color>
+ <color name="i_am_color_1c69">#00001c69</color>
+ <color name="i_am_color_1c6a">#00001c6a</color>
+ <color name="i_am_color_1c6b">#00001c6b</color>
+ <color name="i_am_color_1c6c">#00001c6c</color>
+ <color name="i_am_color_1c6d">#00001c6d</color>
+ <color name="i_am_color_1c6e">#00001c6e</color>
+ <color name="i_am_color_1c6f">#00001c6f</color>
+ <color name="i_am_color_1c70">#00001c70</color>
+ <color name="i_am_color_1c71">#00001c71</color>
+ <color name="i_am_color_1c72">#00001c72</color>
+ <color name="i_am_color_1c73">#00001c73</color>
+ <color name="i_am_color_1c74">#00001c74</color>
+ <color name="i_am_color_1c75">#00001c75</color>
+ <color name="i_am_color_1c76">#00001c76</color>
+ <color name="i_am_color_1c77">#00001c77</color>
+ <color name="i_am_color_1c78">#00001c78</color>
+ <color name="i_am_color_1c79">#00001c79</color>
+ <color name="i_am_color_1c7a">#00001c7a</color>
+ <color name="i_am_color_1c7b">#00001c7b</color>
+ <color name="i_am_color_1c7c">#00001c7c</color>
+ <color name="i_am_color_1c7d">#00001c7d</color>
+ <color name="i_am_color_1c7e">#00001c7e</color>
+ <color name="i_am_color_1c7f">#00001c7f</color>
+ <color name="i_am_color_1c80">#00001c80</color>
+ <color name="i_am_color_1c81">#00001c81</color>
+ <color name="i_am_color_1c82">#00001c82</color>
+ <color name="i_am_color_1c83">#00001c83</color>
+ <color name="i_am_color_1c84">#00001c84</color>
+ <color name="i_am_color_1c85">#00001c85</color>
+ <color name="i_am_color_1c86">#00001c86</color>
+ <color name="i_am_color_1c87">#00001c87</color>
+ <color name="i_am_color_1c88">#00001c88</color>
+ <color name="i_am_color_1c89">#00001c89</color>
+ <color name="i_am_color_1c8a">#00001c8a</color>
+ <color name="i_am_color_1c8b">#00001c8b</color>
+ <color name="i_am_color_1c8c">#00001c8c</color>
+ <color name="i_am_color_1c8d">#00001c8d</color>
+ <color name="i_am_color_1c8e">#00001c8e</color>
+ <color name="i_am_color_1c8f">#00001c8f</color>
+ <color name="i_am_color_1c90">#00001c90</color>
+ <color name="i_am_color_1c91">#00001c91</color>
+ <color name="i_am_color_1c92">#00001c92</color>
+ <color name="i_am_color_1c93">#00001c93</color>
+ <color name="i_am_color_1c94">#00001c94</color>
+ <color name="i_am_color_1c95">#00001c95</color>
+ <color name="i_am_color_1c96">#00001c96</color>
+ <color name="i_am_color_1c97">#00001c97</color>
+ <color name="i_am_color_1c98">#00001c98</color>
+ <color name="i_am_color_1c99">#00001c99</color>
+ <color name="i_am_color_1c9a">#00001c9a</color>
+ <color name="i_am_color_1c9b">#00001c9b</color>
+ <color name="i_am_color_1c9c">#00001c9c</color>
+ <color name="i_am_color_1c9d">#00001c9d</color>
+ <color name="i_am_color_1c9e">#00001c9e</color>
+ <color name="i_am_color_1c9f">#00001c9f</color>
+ <color name="i_am_color_1ca0">#00001ca0</color>
+ <color name="i_am_color_1ca1">#00001ca1</color>
+ <color name="i_am_color_1ca2">#00001ca2</color>
+ <color name="i_am_color_1ca3">#00001ca3</color>
+ <color name="i_am_color_1ca4">#00001ca4</color>
+ <color name="i_am_color_1ca5">#00001ca5</color>
+ <color name="i_am_color_1ca6">#00001ca6</color>
+ <color name="i_am_color_1ca7">#00001ca7</color>
+ <color name="i_am_color_1ca8">#00001ca8</color>
+ <color name="i_am_color_1ca9">#00001ca9</color>
+ <color name="i_am_color_1caa">#00001caa</color>
+ <color name="i_am_color_1cab">#00001cab</color>
+ <color name="i_am_color_1cac">#00001cac</color>
+ <color name="i_am_color_1cad">#00001cad</color>
+ <color name="i_am_color_1cae">#00001cae</color>
+ <color name="i_am_color_1caf">#00001caf</color>
+ <color name="i_am_color_1cb0">#00001cb0</color>
+ <color name="i_am_color_1cb1">#00001cb1</color>
+ <color name="i_am_color_1cb2">#00001cb2</color>
+ <color name="i_am_color_1cb3">#00001cb3</color>
+ <color name="i_am_color_1cb4">#00001cb4</color>
+ <color name="i_am_color_1cb5">#00001cb5</color>
+ <color name="i_am_color_1cb6">#00001cb6</color>
+ <color name="i_am_color_1cb7">#00001cb7</color>
+ <color name="i_am_color_1cb8">#00001cb8</color>
+ <color name="i_am_color_1cb9">#00001cb9</color>
+ <color name="i_am_color_1cba">#00001cba</color>
+ <color name="i_am_color_1cbb">#00001cbb</color>
+ <color name="i_am_color_1cbc">#00001cbc</color>
+ <color name="i_am_color_1cbd">#00001cbd</color>
+ <color name="i_am_color_1cbe">#00001cbe</color>
+ <color name="i_am_color_1cbf">#00001cbf</color>
+ <color name="i_am_color_1cc0">#00001cc0</color>
+ <color name="i_am_color_1cc1">#00001cc1</color>
+ <color name="i_am_color_1cc2">#00001cc2</color>
+ <color name="i_am_color_1cc3">#00001cc3</color>
+ <color name="i_am_color_1cc4">#00001cc4</color>
+ <color name="i_am_color_1cc5">#00001cc5</color>
+ <color name="i_am_color_1cc6">#00001cc6</color>
+ <color name="i_am_color_1cc7">#00001cc7</color>
+ <color name="i_am_color_1cc8">#00001cc8</color>
+ <color name="i_am_color_1cc9">#00001cc9</color>
+ <color name="i_am_color_1cca">#00001cca</color>
+ <color name="i_am_color_1ccb">#00001ccb</color>
+ <color name="i_am_color_1ccc">#00001ccc</color>
+ <color name="i_am_color_1ccd">#00001ccd</color>
+ <color name="i_am_color_1cce">#00001cce</color>
+ <color name="i_am_color_1ccf">#00001ccf</color>
+ <color name="i_am_color_1cd0">#00001cd0</color>
+ <color name="i_am_color_1cd1">#00001cd1</color>
+ <color name="i_am_color_1cd2">#00001cd2</color>
+ <color name="i_am_color_1cd3">#00001cd3</color>
+ <color name="i_am_color_1cd4">#00001cd4</color>
+ <color name="i_am_color_1cd5">#00001cd5</color>
+ <color name="i_am_color_1cd6">#00001cd6</color>
+ <color name="i_am_color_1cd7">#00001cd7</color>
+ <color name="i_am_color_1cd8">#00001cd8</color>
+ <color name="i_am_color_1cd9">#00001cd9</color>
+ <color name="i_am_color_1cda">#00001cda</color>
+ <color name="i_am_color_1cdb">#00001cdb</color>
+ <color name="i_am_color_1cdc">#00001cdc</color>
+ <color name="i_am_color_1cdd">#00001cdd</color>
+ <color name="i_am_color_1cde">#00001cde</color>
+ <color name="i_am_color_1cdf">#00001cdf</color>
+ <color name="i_am_color_1ce0">#00001ce0</color>
+ <color name="i_am_color_1ce1">#00001ce1</color>
+ <color name="i_am_color_1ce2">#00001ce2</color>
+ <color name="i_am_color_1ce3">#00001ce3</color>
+ <color name="i_am_color_1ce4">#00001ce4</color>
+ <color name="i_am_color_1ce5">#00001ce5</color>
+ <color name="i_am_color_1ce6">#00001ce6</color>
+ <color name="i_am_color_1ce7">#00001ce7</color>
+ <color name="i_am_color_1ce8">#00001ce8</color>
+ <color name="i_am_color_1ce9">#00001ce9</color>
+ <color name="i_am_color_1cea">#00001cea</color>
+ <color name="i_am_color_1ceb">#00001ceb</color>
+ <color name="i_am_color_1cec">#00001cec</color>
+ <color name="i_am_color_1ced">#00001ced</color>
+ <color name="i_am_color_1cee">#00001cee</color>
+ <color name="i_am_color_1cef">#00001cef</color>
+ <color name="i_am_color_1cf0">#00001cf0</color>
+ <color name="i_am_color_1cf1">#00001cf1</color>
+ <color name="i_am_color_1cf2">#00001cf2</color>
+ <color name="i_am_color_1cf3">#00001cf3</color>
+ <color name="i_am_color_1cf4">#00001cf4</color>
+ <color name="i_am_color_1cf5">#00001cf5</color>
+ <color name="i_am_color_1cf6">#00001cf6</color>
+ <color name="i_am_color_1cf7">#00001cf7</color>
+ <color name="i_am_color_1cf8">#00001cf8</color>
+ <color name="i_am_color_1cf9">#00001cf9</color>
+ <color name="i_am_color_1cfa">#00001cfa</color>
+ <color name="i_am_color_1cfb">#00001cfb</color>
+ <color name="i_am_color_1cfc">#00001cfc</color>
+ <color name="i_am_color_1cfd">#00001cfd</color>
+ <color name="i_am_color_1cfe">#00001cfe</color>
+ <color name="i_am_color_1cff">#00001cff</color>
+ <color name="i_am_color_1d00">#00001d00</color>
+ <color name="i_am_color_1d01">#00001d01</color>
+ <color name="i_am_color_1d02">#00001d02</color>
+ <color name="i_am_color_1d03">#00001d03</color>
+ <color name="i_am_color_1d04">#00001d04</color>
+ <color name="i_am_color_1d05">#00001d05</color>
+ <color name="i_am_color_1d06">#00001d06</color>
+ <color name="i_am_color_1d07">#00001d07</color>
+ <color name="i_am_color_1d08">#00001d08</color>
+ <color name="i_am_color_1d09">#00001d09</color>
+ <color name="i_am_color_1d0a">#00001d0a</color>
+ <color name="i_am_color_1d0b">#00001d0b</color>
+ <color name="i_am_color_1d0c">#00001d0c</color>
+ <color name="i_am_color_1d0d">#00001d0d</color>
+ <color name="i_am_color_1d0e">#00001d0e</color>
+ <color name="i_am_color_1d0f">#00001d0f</color>
+ <color name="i_am_color_1d10">#00001d10</color>
+ <color name="i_am_color_1d11">#00001d11</color>
+ <color name="i_am_color_1d12">#00001d12</color>
+ <color name="i_am_color_1d13">#00001d13</color>
+ <color name="i_am_color_1d14">#00001d14</color>
+ <color name="i_am_color_1d15">#00001d15</color>
+ <color name="i_am_color_1d16">#00001d16</color>
+ <color name="i_am_color_1d17">#00001d17</color>
+ <color name="i_am_color_1d18">#00001d18</color>
+ <color name="i_am_color_1d19">#00001d19</color>
+ <color name="i_am_color_1d1a">#00001d1a</color>
+ <color name="i_am_color_1d1b">#00001d1b</color>
+ <color name="i_am_color_1d1c">#00001d1c</color>
+ <color name="i_am_color_1d1d">#00001d1d</color>
+ <color name="i_am_color_1d1e">#00001d1e</color>
+ <color name="i_am_color_1d1f">#00001d1f</color>
+ <color name="i_am_color_1d20">#00001d20</color>
+ <color name="i_am_color_1d21">#00001d21</color>
+ <color name="i_am_color_1d22">#00001d22</color>
+ <color name="i_am_color_1d23">#00001d23</color>
+ <color name="i_am_color_1d24">#00001d24</color>
+ <color name="i_am_color_1d25">#00001d25</color>
+ <color name="i_am_color_1d26">#00001d26</color>
+ <color name="i_am_color_1d27">#00001d27</color>
+ <color name="i_am_color_1d28">#00001d28</color>
+ <color name="i_am_color_1d29">#00001d29</color>
+ <color name="i_am_color_1d2a">#00001d2a</color>
+ <color name="i_am_color_1d2b">#00001d2b</color>
+ <color name="i_am_color_1d2c">#00001d2c</color>
+ <color name="i_am_color_1d2d">#00001d2d</color>
+ <color name="i_am_color_1d2e">#00001d2e</color>
+ <color name="i_am_color_1d2f">#00001d2f</color>
+ <color name="i_am_color_1d30">#00001d30</color>
+ <color name="i_am_color_1d31">#00001d31</color>
+ <color name="i_am_color_1d32">#00001d32</color>
+ <color name="i_am_color_1d33">#00001d33</color>
+ <color name="i_am_color_1d34">#00001d34</color>
+ <color name="i_am_color_1d35">#00001d35</color>
+ <color name="i_am_color_1d36">#00001d36</color>
+ <color name="i_am_color_1d37">#00001d37</color>
+ <color name="i_am_color_1d38">#00001d38</color>
+ <color name="i_am_color_1d39">#00001d39</color>
+ <color name="i_am_color_1d3a">#00001d3a</color>
+ <color name="i_am_color_1d3b">#00001d3b</color>
+ <color name="i_am_color_1d3c">#00001d3c</color>
+ <color name="i_am_color_1d3d">#00001d3d</color>
+ <color name="i_am_color_1d3e">#00001d3e</color>
+ <color name="i_am_color_1d3f">#00001d3f</color>
+ <color name="i_am_color_1d40">#00001d40</color>
+ <color name="i_am_color_1d41">#00001d41</color>
+ <color name="i_am_color_1d42">#00001d42</color>
+ <color name="i_am_color_1d43">#00001d43</color>
+ <color name="i_am_color_1d44">#00001d44</color>
+ <color name="i_am_color_1d45">#00001d45</color>
+ <color name="i_am_color_1d46">#00001d46</color>
+ <color name="i_am_color_1d47">#00001d47</color>
+ <color name="i_am_color_1d48">#00001d48</color>
+ <color name="i_am_color_1d49">#00001d49</color>
+ <color name="i_am_color_1d4a">#00001d4a</color>
+ <color name="i_am_color_1d4b">#00001d4b</color>
+ <color name="i_am_color_1d4c">#00001d4c</color>
+ <color name="i_am_color_1d4d">#00001d4d</color>
+ <color name="i_am_color_1d4e">#00001d4e</color>
+ <color name="i_am_color_1d4f">#00001d4f</color>
+ <color name="i_am_color_1d50">#00001d50</color>
+ <color name="i_am_color_1d51">#00001d51</color>
+ <color name="i_am_color_1d52">#00001d52</color>
+ <color name="i_am_color_1d53">#00001d53</color>
+ <color name="i_am_color_1d54">#00001d54</color>
+ <color name="i_am_color_1d55">#00001d55</color>
+ <color name="i_am_color_1d56">#00001d56</color>
+ <color name="i_am_color_1d57">#00001d57</color>
+ <color name="i_am_color_1d58">#00001d58</color>
+ <color name="i_am_color_1d59">#00001d59</color>
+ <color name="i_am_color_1d5a">#00001d5a</color>
+ <color name="i_am_color_1d5b">#00001d5b</color>
+ <color name="i_am_color_1d5c">#00001d5c</color>
+ <color name="i_am_color_1d5d">#00001d5d</color>
+ <color name="i_am_color_1d5e">#00001d5e</color>
+ <color name="i_am_color_1d5f">#00001d5f</color>
+ <color name="i_am_color_1d60">#00001d60</color>
+ <color name="i_am_color_1d61">#00001d61</color>
+ <color name="i_am_color_1d62">#00001d62</color>
+ <color name="i_am_color_1d63">#00001d63</color>
+ <color name="i_am_color_1d64">#00001d64</color>
+ <color name="i_am_color_1d65">#00001d65</color>
+ <color name="i_am_color_1d66">#00001d66</color>
+ <color name="i_am_color_1d67">#00001d67</color>
+ <color name="i_am_color_1d68">#00001d68</color>
+ <color name="i_am_color_1d69">#00001d69</color>
+ <color name="i_am_color_1d6a">#00001d6a</color>
+ <color name="i_am_color_1d6b">#00001d6b</color>
+ <color name="i_am_color_1d6c">#00001d6c</color>
+ <color name="i_am_color_1d6d">#00001d6d</color>
+ <color name="i_am_color_1d6e">#00001d6e</color>
+ <color name="i_am_color_1d6f">#00001d6f</color>
+ <color name="i_am_color_1d70">#00001d70</color>
+ <color name="i_am_color_1d71">#00001d71</color>
+ <color name="i_am_color_1d72">#00001d72</color>
+ <color name="i_am_color_1d73">#00001d73</color>
+ <color name="i_am_color_1d74">#00001d74</color>
+ <color name="i_am_color_1d75">#00001d75</color>
+ <color name="i_am_color_1d76">#00001d76</color>
+ <color name="i_am_color_1d77">#00001d77</color>
+ <color name="i_am_color_1d78">#00001d78</color>
+ <color name="i_am_color_1d79">#00001d79</color>
+ <color name="i_am_color_1d7a">#00001d7a</color>
+ <color name="i_am_color_1d7b">#00001d7b</color>
+ <color name="i_am_color_1d7c">#00001d7c</color>
+ <color name="i_am_color_1d7d">#00001d7d</color>
+ <color name="i_am_color_1d7e">#00001d7e</color>
+ <color name="i_am_color_1d7f">#00001d7f</color>
+ <color name="i_am_color_1d80">#00001d80</color>
+ <color name="i_am_color_1d81">#00001d81</color>
+ <color name="i_am_color_1d82">#00001d82</color>
+ <color name="i_am_color_1d83">#00001d83</color>
+ <color name="i_am_color_1d84">#00001d84</color>
+ <color name="i_am_color_1d85">#00001d85</color>
+ <color name="i_am_color_1d86">#00001d86</color>
+ <color name="i_am_color_1d87">#00001d87</color>
+ <color name="i_am_color_1d88">#00001d88</color>
+ <color name="i_am_color_1d89">#00001d89</color>
+ <color name="i_am_color_1d8a">#00001d8a</color>
+ <color name="i_am_color_1d8b">#00001d8b</color>
+ <color name="i_am_color_1d8c">#00001d8c</color>
+ <color name="i_am_color_1d8d">#00001d8d</color>
+ <color name="i_am_color_1d8e">#00001d8e</color>
+ <color name="i_am_color_1d8f">#00001d8f</color>
+ <color name="i_am_color_1d90">#00001d90</color>
+ <color name="i_am_color_1d91">#00001d91</color>
+ <color name="i_am_color_1d92">#00001d92</color>
+ <color name="i_am_color_1d93">#00001d93</color>
+ <color name="i_am_color_1d94">#00001d94</color>
+ <color name="i_am_color_1d95">#00001d95</color>
+ <color name="i_am_color_1d96">#00001d96</color>
+ <color name="i_am_color_1d97">#00001d97</color>
+ <color name="i_am_color_1d98">#00001d98</color>
+ <color name="i_am_color_1d99">#00001d99</color>
+ <color name="i_am_color_1d9a">#00001d9a</color>
+ <color name="i_am_color_1d9b">#00001d9b</color>
+ <color name="i_am_color_1d9c">#00001d9c</color>
+ <color name="i_am_color_1d9d">#00001d9d</color>
+ <color name="i_am_color_1d9e">#00001d9e</color>
+ <color name="i_am_color_1d9f">#00001d9f</color>
+ <color name="i_am_color_1da0">#00001da0</color>
+ <color name="i_am_color_1da1">#00001da1</color>
+ <color name="i_am_color_1da2">#00001da2</color>
+ <color name="i_am_color_1da3">#00001da3</color>
+ <color name="i_am_color_1da4">#00001da4</color>
+ <color name="i_am_color_1da5">#00001da5</color>
+ <color name="i_am_color_1da6">#00001da6</color>
+ <color name="i_am_color_1da7">#00001da7</color>
+ <color name="i_am_color_1da8">#00001da8</color>
+ <color name="i_am_color_1da9">#00001da9</color>
+ <color name="i_am_color_1daa">#00001daa</color>
+ <color name="i_am_color_1dab">#00001dab</color>
+ <color name="i_am_color_1dac">#00001dac</color>
+ <color name="i_am_color_1dad">#00001dad</color>
+ <color name="i_am_color_1dae">#00001dae</color>
+ <color name="i_am_color_1daf">#00001daf</color>
+ <color name="i_am_color_1db0">#00001db0</color>
+ <color name="i_am_color_1db1">#00001db1</color>
+ <color name="i_am_color_1db2">#00001db2</color>
+ <color name="i_am_color_1db3">#00001db3</color>
+ <color name="i_am_color_1db4">#00001db4</color>
+ <color name="i_am_color_1db5">#00001db5</color>
+ <color name="i_am_color_1db6">#00001db6</color>
+ <color name="i_am_color_1db7">#00001db7</color>
+ <color name="i_am_color_1db8">#00001db8</color>
+ <color name="i_am_color_1db9">#00001db9</color>
+ <color name="i_am_color_1dba">#00001dba</color>
+ <color name="i_am_color_1dbb">#00001dbb</color>
+ <color name="i_am_color_1dbc">#00001dbc</color>
+ <color name="i_am_color_1dbd">#00001dbd</color>
+ <color name="i_am_color_1dbe">#00001dbe</color>
+ <color name="i_am_color_1dbf">#00001dbf</color>
+ <color name="i_am_color_1dc0">#00001dc0</color>
+ <color name="i_am_color_1dc1">#00001dc1</color>
+ <color name="i_am_color_1dc2">#00001dc2</color>
+ <color name="i_am_color_1dc3">#00001dc3</color>
+ <color name="i_am_color_1dc4">#00001dc4</color>
+ <color name="i_am_color_1dc5">#00001dc5</color>
+ <color name="i_am_color_1dc6">#00001dc6</color>
+ <color name="i_am_color_1dc7">#00001dc7</color>
+ <color name="i_am_color_1dc8">#00001dc8</color>
+ <color name="i_am_color_1dc9">#00001dc9</color>
+ <color name="i_am_color_1dca">#00001dca</color>
+ <color name="i_am_color_1dcb">#00001dcb</color>
+ <color name="i_am_color_1dcc">#00001dcc</color>
+ <color name="i_am_color_1dcd">#00001dcd</color>
+ <color name="i_am_color_1dce">#00001dce</color>
+ <color name="i_am_color_1dcf">#00001dcf</color>
+ <color name="i_am_color_1dd0">#00001dd0</color>
+ <color name="i_am_color_1dd1">#00001dd1</color>
+ <color name="i_am_color_1dd2">#00001dd2</color>
+ <color name="i_am_color_1dd3">#00001dd3</color>
+ <color name="i_am_color_1dd4">#00001dd4</color>
+ <color name="i_am_color_1dd5">#00001dd5</color>
+ <color name="i_am_color_1dd6">#00001dd6</color>
+ <color name="i_am_color_1dd7">#00001dd7</color>
+ <color name="i_am_color_1dd8">#00001dd8</color>
+ <color name="i_am_color_1dd9">#00001dd9</color>
+ <color name="i_am_color_1dda">#00001dda</color>
+ <color name="i_am_color_1ddb">#00001ddb</color>
+ <color name="i_am_color_1ddc">#00001ddc</color>
+ <color name="i_am_color_1ddd">#00001ddd</color>
+ <color name="i_am_color_1dde">#00001dde</color>
+ <color name="i_am_color_1ddf">#00001ddf</color>
+ <color name="i_am_color_1de0">#00001de0</color>
+ <color name="i_am_color_1de1">#00001de1</color>
+ <color name="i_am_color_1de2">#00001de2</color>
+ <color name="i_am_color_1de3">#00001de3</color>
+ <color name="i_am_color_1de4">#00001de4</color>
+ <color name="i_am_color_1de5">#00001de5</color>
+ <color name="i_am_color_1de6">#00001de6</color>
+ <color name="i_am_color_1de7">#00001de7</color>
+ <color name="i_am_color_1de8">#00001de8</color>
+ <color name="i_am_color_1de9">#00001de9</color>
+ <color name="i_am_color_1dea">#00001dea</color>
+ <color name="i_am_color_1deb">#00001deb</color>
+ <color name="i_am_color_1dec">#00001dec</color>
+ <color name="i_am_color_1ded">#00001ded</color>
+ <color name="i_am_color_1dee">#00001dee</color>
+ <color name="i_am_color_1def">#00001def</color>
+ <color name="i_am_color_1df0">#00001df0</color>
+ <color name="i_am_color_1df1">#00001df1</color>
+ <color name="i_am_color_1df2">#00001df2</color>
+ <color name="i_am_color_1df3">#00001df3</color>
+ <color name="i_am_color_1df4">#00001df4</color>
+ <color name="i_am_color_1df5">#00001df5</color>
+ <color name="i_am_color_1df6">#00001df6</color>
+ <color name="i_am_color_1df7">#00001df7</color>
+ <color name="i_am_color_1df8">#00001df8</color>
+ <color name="i_am_color_1df9">#00001df9</color>
+ <color name="i_am_color_1dfa">#00001dfa</color>
+ <color name="i_am_color_1dfb">#00001dfb</color>
+ <color name="i_am_color_1dfc">#00001dfc</color>
+ <color name="i_am_color_1dfd">#00001dfd</color>
+ <color name="i_am_color_1dfe">#00001dfe</color>
+ <color name="i_am_color_1dff">#00001dff</color>
+ <color name="i_am_color_1e00">#00001e00</color>
+ <color name="i_am_color_1e01">#00001e01</color>
+ <color name="i_am_color_1e02">#00001e02</color>
+ <color name="i_am_color_1e03">#00001e03</color>
+ <color name="i_am_color_1e04">#00001e04</color>
+ <color name="i_am_color_1e05">#00001e05</color>
+ <color name="i_am_color_1e06">#00001e06</color>
+ <color name="i_am_color_1e07">#00001e07</color>
+ <color name="i_am_color_1e08">#00001e08</color>
+ <color name="i_am_color_1e09">#00001e09</color>
+ <color name="i_am_color_1e0a">#00001e0a</color>
+ <color name="i_am_color_1e0b">#00001e0b</color>
+ <color name="i_am_color_1e0c">#00001e0c</color>
+ <color name="i_am_color_1e0d">#00001e0d</color>
+ <color name="i_am_color_1e0e">#00001e0e</color>
+ <color name="i_am_color_1e0f">#00001e0f</color>
+ <color name="i_am_color_1e10">#00001e10</color>
+ <color name="i_am_color_1e11">#00001e11</color>
+ <color name="i_am_color_1e12">#00001e12</color>
+ <color name="i_am_color_1e13">#00001e13</color>
+ <color name="i_am_color_1e14">#00001e14</color>
+ <color name="i_am_color_1e15">#00001e15</color>
+ <color name="i_am_color_1e16">#00001e16</color>
+ <color name="i_am_color_1e17">#00001e17</color>
+ <color name="i_am_color_1e18">#00001e18</color>
+ <color name="i_am_color_1e19">#00001e19</color>
+ <color name="i_am_color_1e1a">#00001e1a</color>
+ <color name="i_am_color_1e1b">#00001e1b</color>
+ <color name="i_am_color_1e1c">#00001e1c</color>
+ <color name="i_am_color_1e1d">#00001e1d</color>
+ <color name="i_am_color_1e1e">#00001e1e</color>
+ <color name="i_am_color_1e1f">#00001e1f</color>
+ <color name="i_am_color_1e20">#00001e20</color>
+ <color name="i_am_color_1e21">#00001e21</color>
+ <color name="i_am_color_1e22">#00001e22</color>
+ <color name="i_am_color_1e23">#00001e23</color>
+ <color name="i_am_color_1e24">#00001e24</color>
+ <color name="i_am_color_1e25">#00001e25</color>
+ <color name="i_am_color_1e26">#00001e26</color>
+ <color name="i_am_color_1e27">#00001e27</color>
+ <color name="i_am_color_1e28">#00001e28</color>
+ <color name="i_am_color_1e29">#00001e29</color>
+ <color name="i_am_color_1e2a">#00001e2a</color>
+ <color name="i_am_color_1e2b">#00001e2b</color>
+ <color name="i_am_color_1e2c">#00001e2c</color>
+ <color name="i_am_color_1e2d">#00001e2d</color>
+ <color name="i_am_color_1e2e">#00001e2e</color>
+ <color name="i_am_color_1e2f">#00001e2f</color>
+ <color name="i_am_color_1e30">#00001e30</color>
+ <color name="i_am_color_1e31">#00001e31</color>
+ <color name="i_am_color_1e32">#00001e32</color>
+ <color name="i_am_color_1e33">#00001e33</color>
+ <color name="i_am_color_1e34">#00001e34</color>
+ <color name="i_am_color_1e35">#00001e35</color>
+ <color name="i_am_color_1e36">#00001e36</color>
+ <color name="i_am_color_1e37">#00001e37</color>
+ <color name="i_am_color_1e38">#00001e38</color>
+ <color name="i_am_color_1e39">#00001e39</color>
+ <color name="i_am_color_1e3a">#00001e3a</color>
+ <color name="i_am_color_1e3b">#00001e3b</color>
+ <color name="i_am_color_1e3c">#00001e3c</color>
+ <color name="i_am_color_1e3d">#00001e3d</color>
+ <color name="i_am_color_1e3e">#00001e3e</color>
+ <color name="i_am_color_1e3f">#00001e3f</color>
+ <color name="i_am_color_1e40">#00001e40</color>
+ <color name="i_am_color_1e41">#00001e41</color>
+ <color name="i_am_color_1e42">#00001e42</color>
+ <color name="i_am_color_1e43">#00001e43</color>
+ <color name="i_am_color_1e44">#00001e44</color>
+ <color name="i_am_color_1e45">#00001e45</color>
+ <color name="i_am_color_1e46">#00001e46</color>
+ <color name="i_am_color_1e47">#00001e47</color>
+ <color name="i_am_color_1e48">#00001e48</color>
+ <color name="i_am_color_1e49">#00001e49</color>
+ <color name="i_am_color_1e4a">#00001e4a</color>
+ <color name="i_am_color_1e4b">#00001e4b</color>
+ <color name="i_am_color_1e4c">#00001e4c</color>
+ <color name="i_am_color_1e4d">#00001e4d</color>
+ <color name="i_am_color_1e4e">#00001e4e</color>
+ <color name="i_am_color_1e4f">#00001e4f</color>
+ <color name="i_am_color_1e50">#00001e50</color>
+ <color name="i_am_color_1e51">#00001e51</color>
+ <color name="i_am_color_1e52">#00001e52</color>
+ <color name="i_am_color_1e53">#00001e53</color>
+ <color name="i_am_color_1e54">#00001e54</color>
+ <color name="i_am_color_1e55">#00001e55</color>
+ <color name="i_am_color_1e56">#00001e56</color>
+ <color name="i_am_color_1e57">#00001e57</color>
+ <color name="i_am_color_1e58">#00001e58</color>
+ <color name="i_am_color_1e59">#00001e59</color>
+ <color name="i_am_color_1e5a">#00001e5a</color>
+ <color name="i_am_color_1e5b">#00001e5b</color>
+ <color name="i_am_color_1e5c">#00001e5c</color>
+ <color name="i_am_color_1e5d">#00001e5d</color>
+ <color name="i_am_color_1e5e">#00001e5e</color>
+ <color name="i_am_color_1e5f">#00001e5f</color>
+ <color name="i_am_color_1e60">#00001e60</color>
+ <color name="i_am_color_1e61">#00001e61</color>
+ <color name="i_am_color_1e62">#00001e62</color>
+ <color name="i_am_color_1e63">#00001e63</color>
+ <color name="i_am_color_1e64">#00001e64</color>
+ <color name="i_am_color_1e65">#00001e65</color>
+ <color name="i_am_color_1e66">#00001e66</color>
+ <color name="i_am_color_1e67">#00001e67</color>
+ <color name="i_am_color_1e68">#00001e68</color>
+ <color name="i_am_color_1e69">#00001e69</color>
+ <color name="i_am_color_1e6a">#00001e6a</color>
+ <color name="i_am_color_1e6b">#00001e6b</color>
+ <color name="i_am_color_1e6c">#00001e6c</color>
+ <color name="i_am_color_1e6d">#00001e6d</color>
+ <color name="i_am_color_1e6e">#00001e6e</color>
+ <color name="i_am_color_1e6f">#00001e6f</color>
+ <color name="i_am_color_1e70">#00001e70</color>
+ <color name="i_am_color_1e71">#00001e71</color>
+ <color name="i_am_color_1e72">#00001e72</color>
+ <color name="i_am_color_1e73">#00001e73</color>
+ <color name="i_am_color_1e74">#00001e74</color>
+ <color name="i_am_color_1e75">#00001e75</color>
+ <color name="i_am_color_1e76">#00001e76</color>
+ <color name="i_am_color_1e77">#00001e77</color>
+ <color name="i_am_color_1e78">#00001e78</color>
+ <color name="i_am_color_1e79">#00001e79</color>
+ <color name="i_am_color_1e7a">#00001e7a</color>
+ <color name="i_am_color_1e7b">#00001e7b</color>
+ <color name="i_am_color_1e7c">#00001e7c</color>
+ <color name="i_am_color_1e7d">#00001e7d</color>
+ <color name="i_am_color_1e7e">#00001e7e</color>
+ <color name="i_am_color_1e7f">#00001e7f</color>
+ <color name="i_am_color_1e80">#00001e80</color>
+ <color name="i_am_color_1e81">#00001e81</color>
+ <color name="i_am_color_1e82">#00001e82</color>
+ <color name="i_am_color_1e83">#00001e83</color>
+ <color name="i_am_color_1e84">#00001e84</color>
+ <color name="i_am_color_1e85">#00001e85</color>
+ <color name="i_am_color_1e86">#00001e86</color>
+ <color name="i_am_color_1e87">#00001e87</color>
+ <color name="i_am_color_1e88">#00001e88</color>
+ <color name="i_am_color_1e89">#00001e89</color>
+ <color name="i_am_color_1e8a">#00001e8a</color>
+ <color name="i_am_color_1e8b">#00001e8b</color>
+ <color name="i_am_color_1e8c">#00001e8c</color>
+ <color name="i_am_color_1e8d">#00001e8d</color>
+ <color name="i_am_color_1e8e">#00001e8e</color>
+ <color name="i_am_color_1e8f">#00001e8f</color>
+ <color name="i_am_color_1e90">#00001e90</color>
+ <color name="i_am_color_1e91">#00001e91</color>
+ <color name="i_am_color_1e92">#00001e92</color>
+ <color name="i_am_color_1e93">#00001e93</color>
+ <color name="i_am_color_1e94">#00001e94</color>
+ <color name="i_am_color_1e95">#00001e95</color>
+ <color name="i_am_color_1e96">#00001e96</color>
+ <color name="i_am_color_1e97">#00001e97</color>
+ <color name="i_am_color_1e98">#00001e98</color>
+ <color name="i_am_color_1e99">#00001e99</color>
+ <color name="i_am_color_1e9a">#00001e9a</color>
+ <color name="i_am_color_1e9b">#00001e9b</color>
+ <color name="i_am_color_1e9c">#00001e9c</color>
+ <color name="i_am_color_1e9d">#00001e9d</color>
+ <color name="i_am_color_1e9e">#00001e9e</color>
+ <color name="i_am_color_1e9f">#00001e9f</color>
+ <color name="i_am_color_1ea0">#00001ea0</color>
+ <color name="i_am_color_1ea1">#00001ea1</color>
+ <color name="i_am_color_1ea2">#00001ea2</color>
+ <color name="i_am_color_1ea3">#00001ea3</color>
+ <color name="i_am_color_1ea4">#00001ea4</color>
+ <color name="i_am_color_1ea5">#00001ea5</color>
+ <color name="i_am_color_1ea6">#00001ea6</color>
+ <color name="i_am_color_1ea7">#00001ea7</color>
+ <color name="i_am_color_1ea8">#00001ea8</color>
+ <color name="i_am_color_1ea9">#00001ea9</color>
+ <color name="i_am_color_1eaa">#00001eaa</color>
+ <color name="i_am_color_1eab">#00001eab</color>
+ <color name="i_am_color_1eac">#00001eac</color>
+ <color name="i_am_color_1ead">#00001ead</color>
+ <color name="i_am_color_1eae">#00001eae</color>
+ <color name="i_am_color_1eaf">#00001eaf</color>
+ <color name="i_am_color_1eb0">#00001eb0</color>
+ <color name="i_am_color_1eb1">#00001eb1</color>
+ <color name="i_am_color_1eb2">#00001eb2</color>
+ <color name="i_am_color_1eb3">#00001eb3</color>
+ <color name="i_am_color_1eb4">#00001eb4</color>
+ <color name="i_am_color_1eb5">#00001eb5</color>
+ <color name="i_am_color_1eb6">#00001eb6</color>
+ <color name="i_am_color_1eb7">#00001eb7</color>
+ <color name="i_am_color_1eb8">#00001eb8</color>
+ <color name="i_am_color_1eb9">#00001eb9</color>
+ <color name="i_am_color_1eba">#00001eba</color>
+ <color name="i_am_color_1ebb">#00001ebb</color>
+ <color name="i_am_color_1ebc">#00001ebc</color>
+ <color name="i_am_color_1ebd">#00001ebd</color>
+ <color name="i_am_color_1ebe">#00001ebe</color>
+ <color name="i_am_color_1ebf">#00001ebf</color>
+ <color name="i_am_color_1ec0">#00001ec0</color>
+ <color name="i_am_color_1ec1">#00001ec1</color>
+ <color name="i_am_color_1ec2">#00001ec2</color>
+ <color name="i_am_color_1ec3">#00001ec3</color>
+ <color name="i_am_color_1ec4">#00001ec4</color>
+ <color name="i_am_color_1ec5">#00001ec5</color>
+ <color name="i_am_color_1ec6">#00001ec6</color>
+ <color name="i_am_color_1ec7">#00001ec7</color>
+ <color name="i_am_color_1ec8">#00001ec8</color>
+ <color name="i_am_color_1ec9">#00001ec9</color>
+ <color name="i_am_color_1eca">#00001eca</color>
+ <color name="i_am_color_1ecb">#00001ecb</color>
+ <color name="i_am_color_1ecc">#00001ecc</color>
+ <color name="i_am_color_1ecd">#00001ecd</color>
+ <color name="i_am_color_1ece">#00001ece</color>
+ <color name="i_am_color_1ecf">#00001ecf</color>
+ <color name="i_am_color_1ed0">#00001ed0</color>
+ <color name="i_am_color_1ed1">#00001ed1</color>
+ <color name="i_am_color_1ed2">#00001ed2</color>
+ <color name="i_am_color_1ed3">#00001ed3</color>
+ <color name="i_am_color_1ed4">#00001ed4</color>
+ <color name="i_am_color_1ed5">#00001ed5</color>
+ <color name="i_am_color_1ed6">#00001ed6</color>
+ <color name="i_am_color_1ed7">#00001ed7</color>
+ <color name="i_am_color_1ed8">#00001ed8</color>
+ <color name="i_am_color_1ed9">#00001ed9</color>
+ <color name="i_am_color_1eda">#00001eda</color>
+ <color name="i_am_color_1edb">#00001edb</color>
+ <color name="i_am_color_1edc">#00001edc</color>
+ <color name="i_am_color_1edd">#00001edd</color>
+ <color name="i_am_color_1ede">#00001ede</color>
+ <color name="i_am_color_1edf">#00001edf</color>
+ <color name="i_am_color_1ee0">#00001ee0</color>
+ <color name="i_am_color_1ee1">#00001ee1</color>
+ <color name="i_am_color_1ee2">#00001ee2</color>
+ <color name="i_am_color_1ee3">#00001ee3</color>
+ <color name="i_am_color_1ee4">#00001ee4</color>
+ <color name="i_am_color_1ee5">#00001ee5</color>
+ <color name="i_am_color_1ee6">#00001ee6</color>
+ <color name="i_am_color_1ee7">#00001ee7</color>
+ <color name="i_am_color_1ee8">#00001ee8</color>
+ <color name="i_am_color_1ee9">#00001ee9</color>
+ <color name="i_am_color_1eea">#00001eea</color>
+ <color name="i_am_color_1eeb">#00001eeb</color>
+ <color name="i_am_color_1eec">#00001eec</color>
+ <color name="i_am_color_1eed">#00001eed</color>
+ <color name="i_am_color_1eee">#00001eee</color>
+ <color name="i_am_color_1eef">#00001eef</color>
+ <color name="i_am_color_1ef0">#00001ef0</color>
+ <color name="i_am_color_1ef1">#00001ef1</color>
+ <color name="i_am_color_1ef2">#00001ef2</color>
+ <color name="i_am_color_1ef3">#00001ef3</color>
+ <color name="i_am_color_1ef4">#00001ef4</color>
+ <color name="i_am_color_1ef5">#00001ef5</color>
+ <color name="i_am_color_1ef6">#00001ef6</color>
+ <color name="i_am_color_1ef7">#00001ef7</color>
+ <color name="i_am_color_1ef8">#00001ef8</color>
+ <color name="i_am_color_1ef9">#00001ef9</color>
+ <color name="i_am_color_1efa">#00001efa</color>
+ <color name="i_am_color_1efb">#00001efb</color>
+ <color name="i_am_color_1efc">#00001efc</color>
+ <color name="i_am_color_1efd">#00001efd</color>
+ <color name="i_am_color_1efe">#00001efe</color>
+ <color name="i_am_color_1eff">#00001eff</color>
+ <color name="i_am_color_1f00">#00001f00</color>
+ <color name="i_am_color_1f01">#00001f01</color>
+ <color name="i_am_color_1f02">#00001f02</color>
+ <color name="i_am_color_1f03">#00001f03</color>
+ <color name="i_am_color_1f04">#00001f04</color>
+ <color name="i_am_color_1f05">#00001f05</color>
+ <color name="i_am_color_1f06">#00001f06</color>
+ <color name="i_am_color_1f07">#00001f07</color>
+ <color name="i_am_color_1f08">#00001f08</color>
+ <color name="i_am_color_1f09">#00001f09</color>
+ <color name="i_am_color_1f0a">#00001f0a</color>
+ <color name="i_am_color_1f0b">#00001f0b</color>
+ <color name="i_am_color_1f0c">#00001f0c</color>
+ <color name="i_am_color_1f0d">#00001f0d</color>
+ <color name="i_am_color_1f0e">#00001f0e</color>
+ <color name="i_am_color_1f0f">#00001f0f</color>
+ <color name="i_am_color_1f10">#00001f10</color>
+ <color name="i_am_color_1f11">#00001f11</color>
+ <color name="i_am_color_1f12">#00001f12</color>
+ <color name="i_am_color_1f13">#00001f13</color>
+ <color name="i_am_color_1f14">#00001f14</color>
+ <color name="i_am_color_1f15">#00001f15</color>
+ <color name="i_am_color_1f16">#00001f16</color>
+ <color name="i_am_color_1f17">#00001f17</color>
+ <color name="i_am_color_1f18">#00001f18</color>
+ <color name="i_am_color_1f19">#00001f19</color>
+ <color name="i_am_color_1f1a">#00001f1a</color>
+ <color name="i_am_color_1f1b">#00001f1b</color>
+ <color name="i_am_color_1f1c">#00001f1c</color>
+ <color name="i_am_color_1f1d">#00001f1d</color>
+ <color name="i_am_color_1f1e">#00001f1e</color>
+ <color name="i_am_color_1f1f">#00001f1f</color>
+ <color name="i_am_color_1f20">#00001f20</color>
+ <color name="i_am_color_1f21">#00001f21</color>
+ <color name="i_am_color_1f22">#00001f22</color>
+ <color name="i_am_color_1f23">#00001f23</color>
+ <color name="i_am_color_1f24">#00001f24</color>
+ <color name="i_am_color_1f25">#00001f25</color>
+ <color name="i_am_color_1f26">#00001f26</color>
+ <color name="i_am_color_1f27">#00001f27</color>
+ <color name="i_am_color_1f28">#00001f28</color>
+ <color name="i_am_color_1f29">#00001f29</color>
+ <color name="i_am_color_1f2a">#00001f2a</color>
+ <color name="i_am_color_1f2b">#00001f2b</color>
+ <color name="i_am_color_1f2c">#00001f2c</color>
+ <color name="i_am_color_1f2d">#00001f2d</color>
+ <color name="i_am_color_1f2e">#00001f2e</color>
+ <color name="i_am_color_1f2f">#00001f2f</color>
+ <color name="i_am_color_1f30">#00001f30</color>
+ <color name="i_am_color_1f31">#00001f31</color>
+ <color name="i_am_color_1f32">#00001f32</color>
+ <color name="i_am_color_1f33">#00001f33</color>
+ <color name="i_am_color_1f34">#00001f34</color>
+ <color name="i_am_color_1f35">#00001f35</color>
+ <color name="i_am_color_1f36">#00001f36</color>
+ <color name="i_am_color_1f37">#00001f37</color>
+ <color name="i_am_color_1f38">#00001f38</color>
+ <color name="i_am_color_1f39">#00001f39</color>
+ <color name="i_am_color_1f3a">#00001f3a</color>
+ <color name="i_am_color_1f3b">#00001f3b</color>
+ <color name="i_am_color_1f3c">#00001f3c</color>
+ <color name="i_am_color_1f3d">#00001f3d</color>
+ <color name="i_am_color_1f3e">#00001f3e</color>
+ <color name="i_am_color_1f3f">#00001f3f</color>
+ <color name="i_am_color_1f40">#00001f40</color>
+ <color name="i_am_color_1f41">#00001f41</color>
+ <color name="i_am_color_1f42">#00001f42</color>
+ <color name="i_am_color_1f43">#00001f43</color>
+ <color name="i_am_color_1f44">#00001f44</color>
+ <color name="i_am_color_1f45">#00001f45</color>
+ <color name="i_am_color_1f46">#00001f46</color>
+ <color name="i_am_color_1f47">#00001f47</color>
+ <color name="i_am_color_1f48">#00001f48</color>
+ <color name="i_am_color_1f49">#00001f49</color>
+ <color name="i_am_color_1f4a">#00001f4a</color>
+ <color name="i_am_color_1f4b">#00001f4b</color>
+ <color name="i_am_color_1f4c">#00001f4c</color>
+ <color name="i_am_color_1f4d">#00001f4d</color>
+ <color name="i_am_color_1f4e">#00001f4e</color>
+ <color name="i_am_color_1f4f">#00001f4f</color>
+ <color name="i_am_color_1f50">#00001f50</color>
+ <color name="i_am_color_1f51">#00001f51</color>
+ <color name="i_am_color_1f52">#00001f52</color>
+ <color name="i_am_color_1f53">#00001f53</color>
+ <color name="i_am_color_1f54">#00001f54</color>
+ <color name="i_am_color_1f55">#00001f55</color>
+ <color name="i_am_color_1f56">#00001f56</color>
+ <color name="i_am_color_1f57">#00001f57</color>
+ <color name="i_am_color_1f58">#00001f58</color>
+ <color name="i_am_color_1f59">#00001f59</color>
+ <color name="i_am_color_1f5a">#00001f5a</color>
+ <color name="i_am_color_1f5b">#00001f5b</color>
+ <color name="i_am_color_1f5c">#00001f5c</color>
+ <color name="i_am_color_1f5d">#00001f5d</color>
+ <color name="i_am_color_1f5e">#00001f5e</color>
+ <color name="i_am_color_1f5f">#00001f5f</color>
+ <color name="i_am_color_1f60">#00001f60</color>
+ <color name="i_am_color_1f61">#00001f61</color>
+ <color name="i_am_color_1f62">#00001f62</color>
+ <color name="i_am_color_1f63">#00001f63</color>
+ <color name="i_am_color_1f64">#00001f64</color>
+ <color name="i_am_color_1f65">#00001f65</color>
+ <color name="i_am_color_1f66">#00001f66</color>
+ <color name="i_am_color_1f67">#00001f67</color>
+ <color name="i_am_color_1f68">#00001f68</color>
+ <color name="i_am_color_1f69">#00001f69</color>
+ <color name="i_am_color_1f6a">#00001f6a</color>
+ <color name="i_am_color_1f6b">#00001f6b</color>
+ <color name="i_am_color_1f6c">#00001f6c</color>
+ <color name="i_am_color_1f6d">#00001f6d</color>
+ <color name="i_am_color_1f6e">#00001f6e</color>
+ <color name="i_am_color_1f6f">#00001f6f</color>
+ <color name="i_am_color_1f70">#00001f70</color>
+ <color name="i_am_color_1f71">#00001f71</color>
+ <color name="i_am_color_1f72">#00001f72</color>
+ <color name="i_am_color_1f73">#00001f73</color>
+ <color name="i_am_color_1f74">#00001f74</color>
+ <color name="i_am_color_1f75">#00001f75</color>
+ <color name="i_am_color_1f76">#00001f76</color>
+ <color name="i_am_color_1f77">#00001f77</color>
+ <color name="i_am_color_1f78">#00001f78</color>
+ <color name="i_am_color_1f79">#00001f79</color>
+ <color name="i_am_color_1f7a">#00001f7a</color>
+ <color name="i_am_color_1f7b">#00001f7b</color>
+ <color name="i_am_color_1f7c">#00001f7c</color>
+ <color name="i_am_color_1f7d">#00001f7d</color>
+ <color name="i_am_color_1f7e">#00001f7e</color>
+ <color name="i_am_color_1f7f">#00001f7f</color>
+ <color name="i_am_color_1f80">#00001f80</color>
+ <color name="i_am_color_1f81">#00001f81</color>
+ <color name="i_am_color_1f82">#00001f82</color>
+ <color name="i_am_color_1f83">#00001f83</color>
+ <color name="i_am_color_1f84">#00001f84</color>
+ <color name="i_am_color_1f85">#00001f85</color>
+ <color name="i_am_color_1f86">#00001f86</color>
+ <color name="i_am_color_1f87">#00001f87</color>
+ <color name="i_am_color_1f88">#00001f88</color>
+ <color name="i_am_color_1f89">#00001f89</color>
+ <color name="i_am_color_1f8a">#00001f8a</color>
+ <color name="i_am_color_1f8b">#00001f8b</color>
+ <color name="i_am_color_1f8c">#00001f8c</color>
+ <color name="i_am_color_1f8d">#00001f8d</color>
+ <color name="i_am_color_1f8e">#00001f8e</color>
+ <color name="i_am_color_1f8f">#00001f8f</color>
+ <color name="i_am_color_1f90">#00001f90</color>
+ <color name="i_am_color_1f91">#00001f91</color>
+ <color name="i_am_color_1f92">#00001f92</color>
+ <color name="i_am_color_1f93">#00001f93</color>
+ <color name="i_am_color_1f94">#00001f94</color>
+ <color name="i_am_color_1f95">#00001f95</color>
+ <color name="i_am_color_1f96">#00001f96</color>
+ <color name="i_am_color_1f97">#00001f97</color>
+ <color name="i_am_color_1f98">#00001f98</color>
+ <color name="i_am_color_1f99">#00001f99</color>
+ <color name="i_am_color_1f9a">#00001f9a</color>
+ <color name="i_am_color_1f9b">#00001f9b</color>
+ <color name="i_am_color_1f9c">#00001f9c</color>
+ <color name="i_am_color_1f9d">#00001f9d</color>
+ <color name="i_am_color_1f9e">#00001f9e</color>
+ <color name="i_am_color_1f9f">#00001f9f</color>
+ <color name="i_am_color_1fa0">#00001fa0</color>
+ <color name="i_am_color_1fa1">#00001fa1</color>
+ <color name="i_am_color_1fa2">#00001fa2</color>
+ <color name="i_am_color_1fa3">#00001fa3</color>
+ <color name="i_am_color_1fa4">#00001fa4</color>
+ <color name="i_am_color_1fa5">#00001fa5</color>
+ <color name="i_am_color_1fa6">#00001fa6</color>
+ <color name="i_am_color_1fa7">#00001fa7</color>
+ <color name="i_am_color_1fa8">#00001fa8</color>
+ <color name="i_am_color_1fa9">#00001fa9</color>
+ <color name="i_am_color_1faa">#00001faa</color>
+ <color name="i_am_color_1fab">#00001fab</color>
+ <color name="i_am_color_1fac">#00001fac</color>
+ <color name="i_am_color_1fad">#00001fad</color>
+ <color name="i_am_color_1fae">#00001fae</color>
+ <color name="i_am_color_1faf">#00001faf</color>
+ <color name="i_am_color_1fb0">#00001fb0</color>
+ <color name="i_am_color_1fb1">#00001fb1</color>
+ <color name="i_am_color_1fb2">#00001fb2</color>
+ <color name="i_am_color_1fb3">#00001fb3</color>
+ <color name="i_am_color_1fb4">#00001fb4</color>
+ <color name="i_am_color_1fb5">#00001fb5</color>
+ <color name="i_am_color_1fb6">#00001fb6</color>
+ <color name="i_am_color_1fb7">#00001fb7</color>
+ <color name="i_am_color_1fb8">#00001fb8</color>
+ <color name="i_am_color_1fb9">#00001fb9</color>
+ <color name="i_am_color_1fba">#00001fba</color>
+ <color name="i_am_color_1fbb">#00001fbb</color>
+ <color name="i_am_color_1fbc">#00001fbc</color>
+ <color name="i_am_color_1fbd">#00001fbd</color>
+ <color name="i_am_color_1fbe">#00001fbe</color>
+ <color name="i_am_color_1fbf">#00001fbf</color>
+ <color name="i_am_color_1fc0">#00001fc0</color>
+ <color name="i_am_color_1fc1">#00001fc1</color>
+ <color name="i_am_color_1fc2">#00001fc2</color>
+ <color name="i_am_color_1fc3">#00001fc3</color>
+ <color name="i_am_color_1fc4">#00001fc4</color>
+ <color name="i_am_color_1fc5">#00001fc5</color>
+ <color name="i_am_color_1fc6">#00001fc6</color>
+ <color name="i_am_color_1fc7">#00001fc7</color>
+ <color name="i_am_color_1fc8">#00001fc8</color>
+ <color name="i_am_color_1fc9">#00001fc9</color>
+ <color name="i_am_color_1fca">#00001fca</color>
+ <color name="i_am_color_1fcb">#00001fcb</color>
+ <color name="i_am_color_1fcc">#00001fcc</color>
+ <color name="i_am_color_1fcd">#00001fcd</color>
+ <color name="i_am_color_1fce">#00001fce</color>
+ <color name="i_am_color_1fcf">#00001fcf</color>
+ <color name="i_am_color_1fd0">#00001fd0</color>
+ <color name="i_am_color_1fd1">#00001fd1</color>
+ <color name="i_am_color_1fd2">#00001fd2</color>
+ <color name="i_am_color_1fd3">#00001fd3</color>
+ <color name="i_am_color_1fd4">#00001fd4</color>
+ <color name="i_am_color_1fd5">#00001fd5</color>
+ <color name="i_am_color_1fd6">#00001fd6</color>
+ <color name="i_am_color_1fd7">#00001fd7</color>
+ <color name="i_am_color_1fd8">#00001fd8</color>
+ <color name="i_am_color_1fd9">#00001fd9</color>
+ <color name="i_am_color_1fda">#00001fda</color>
+ <color name="i_am_color_1fdb">#00001fdb</color>
+ <color name="i_am_color_1fdc">#00001fdc</color>
+ <color name="i_am_color_1fdd">#00001fdd</color>
+ <color name="i_am_color_1fde">#00001fde</color>
+ <color name="i_am_color_1fdf">#00001fdf</color>
+ <color name="i_am_color_1fe0">#00001fe0</color>
+ <color name="i_am_color_1fe1">#00001fe1</color>
+ <color name="i_am_color_1fe2">#00001fe2</color>
+ <color name="i_am_color_1fe3">#00001fe3</color>
+ <color name="i_am_color_1fe4">#00001fe4</color>
+ <color name="i_am_color_1fe5">#00001fe5</color>
+ <color name="i_am_color_1fe6">#00001fe6</color>
+ <color name="i_am_color_1fe7">#00001fe7</color>
+ <color name="i_am_color_1fe8">#00001fe8</color>
+ <color name="i_am_color_1fe9">#00001fe9</color>
+ <color name="i_am_color_1fea">#00001fea</color>
+ <color name="i_am_color_1feb">#00001feb</color>
+ <color name="i_am_color_1fec">#00001fec</color>
+ <color name="i_am_color_1fed">#00001fed</color>
+ <color name="i_am_color_1fee">#00001fee</color>
+ <color name="i_am_color_1fef">#00001fef</color>
+ <color name="i_am_color_1ff0">#00001ff0</color>
+ <color name="i_am_color_1ff1">#00001ff1</color>
+ <color name="i_am_color_1ff2">#00001ff2</color>
+ <color name="i_am_color_1ff3">#00001ff3</color>
+ <color name="i_am_color_1ff4">#00001ff4</color>
+ <color name="i_am_color_1ff5">#00001ff5</color>
+ <color name="i_am_color_1ff6">#00001ff6</color>
+ <color name="i_am_color_1ff7">#00001ff7</color>
+ <color name="i_am_color_1ff8">#00001ff8</color>
+ <color name="i_am_color_1ff9">#00001ff9</color>
+ <color name="i_am_color_1ffa">#00001ffa</color>
+ <color name="i_am_color_1ffb">#00001ffb</color>
+ <color name="i_am_color_1ffc">#00001ffc</color>
+ <color name="i_am_color_1ffd">#00001ffd</color>
+ <color name="i_am_color_1ffe">#00001ffe</color>
+ <color name="i_am_color_1fff">#00001fff</color>
+ <color name="i_am_color_2000">#00002000</color>
+ <color name="i_am_color_2001">#00002001</color>
+ <color name="i_am_color_2002">#00002002</color>
+ <color name="i_am_color_2003">#00002003</color>
+ <color name="i_am_color_2004">#00002004</color>
+ <color name="i_am_color_2005">#00002005</color>
+ <color name="i_am_color_2006">#00002006</color>
+ <color name="i_am_color_2007">#00002007</color>
+ <color name="i_am_color_2008">#00002008</color>
+ <color name="i_am_color_2009">#00002009</color>
+ <color name="i_am_color_200a">#0000200a</color>
+ <color name="i_am_color_200b">#0000200b</color>
+ <color name="i_am_color_200c">#0000200c</color>
+ <color name="i_am_color_200d">#0000200d</color>
+ <color name="i_am_color_200e">#0000200e</color>
+ <color name="i_am_color_200f">#0000200f</color>
+ <color name="i_am_color_2010">#00002010</color>
+ <color name="i_am_color_2011">#00002011</color>
+ <color name="i_am_color_2012">#00002012</color>
+ <color name="i_am_color_2013">#00002013</color>
+ <color name="i_am_color_2014">#00002014</color>
+ <color name="i_am_color_2015">#00002015</color>
+ <color name="i_am_color_2016">#00002016</color>
+ <color name="i_am_color_2017">#00002017</color>
+ <color name="i_am_color_2018">#00002018</color>
+ <color name="i_am_color_2019">#00002019</color>
+ <color name="i_am_color_201a">#0000201a</color>
+ <color name="i_am_color_201b">#0000201b</color>
+ <color name="i_am_color_201c">#0000201c</color>
+ <color name="i_am_color_201d">#0000201d</color>
+ <color name="i_am_color_201e">#0000201e</color>
+ <color name="i_am_color_201f">#0000201f</color>
+ <color name="i_am_color_2020">#00002020</color>
+ <color name="i_am_color_2021">#00002021</color>
+ <color name="i_am_color_2022">#00002022</color>
+ <color name="i_am_color_2023">#00002023</color>
+ <color name="i_am_color_2024">#00002024</color>
+ <color name="i_am_color_2025">#00002025</color>
+ <color name="i_am_color_2026">#00002026</color>
+ <color name="i_am_color_2027">#00002027</color>
+ <color name="i_am_color_2028">#00002028</color>
+ <color name="i_am_color_2029">#00002029</color>
+ <color name="i_am_color_202a">#0000202a</color>
+ <color name="i_am_color_202b">#0000202b</color>
+ <color name="i_am_color_202c">#0000202c</color>
+ <color name="i_am_color_202d">#0000202d</color>
+ <color name="i_am_color_202e">#0000202e</color>
+ <color name="i_am_color_202f">#0000202f</color>
+ <color name="i_am_color_2030">#00002030</color>
+ <color name="i_am_color_2031">#00002031</color>
+ <color name="i_am_color_2032">#00002032</color>
+ <color name="i_am_color_2033">#00002033</color>
+ <color name="i_am_color_2034">#00002034</color>
+ <color name="i_am_color_2035">#00002035</color>
+ <color name="i_am_color_2036">#00002036</color>
+ <color name="i_am_color_2037">#00002037</color>
+ <color name="i_am_color_2038">#00002038</color>
+ <color name="i_am_color_2039">#00002039</color>
+ <color name="i_am_color_203a">#0000203a</color>
+ <color name="i_am_color_203b">#0000203b</color>
+ <color name="i_am_color_203c">#0000203c</color>
+ <color name="i_am_color_203d">#0000203d</color>
+ <color name="i_am_color_203e">#0000203e</color>
+ <color name="i_am_color_203f">#0000203f</color>
+ <color name="i_am_color_2040">#00002040</color>
+ <color name="i_am_color_2041">#00002041</color>
+ <color name="i_am_color_2042">#00002042</color>
+ <color name="i_am_color_2043">#00002043</color>
+ <color name="i_am_color_2044">#00002044</color>
+ <color name="i_am_color_2045">#00002045</color>
+ <color name="i_am_color_2046">#00002046</color>
+ <color name="i_am_color_2047">#00002047</color>
+ <color name="i_am_color_2048">#00002048</color>
+ <color name="i_am_color_2049">#00002049</color>
+ <color name="i_am_color_204a">#0000204a</color>
+ <color name="i_am_color_204b">#0000204b</color>
+ <color name="i_am_color_204c">#0000204c</color>
+ <color name="i_am_color_204d">#0000204d</color>
+ <color name="i_am_color_204e">#0000204e</color>
+ <color name="i_am_color_204f">#0000204f</color>
+ <color name="i_am_color_2050">#00002050</color>
+ <color name="i_am_color_2051">#00002051</color>
+ <color name="i_am_color_2052">#00002052</color>
+ <color name="i_am_color_2053">#00002053</color>
+ <color name="i_am_color_2054">#00002054</color>
+ <color name="i_am_color_2055">#00002055</color>
+ <color name="i_am_color_2056">#00002056</color>
+ <color name="i_am_color_2057">#00002057</color>
+ <color name="i_am_color_2058">#00002058</color>
+ <color name="i_am_color_2059">#00002059</color>
+ <color name="i_am_color_205a">#0000205a</color>
+ <color name="i_am_color_205b">#0000205b</color>
+ <color name="i_am_color_205c">#0000205c</color>
+ <color name="i_am_color_205d">#0000205d</color>
+ <color name="i_am_color_205e">#0000205e</color>
+ <color name="i_am_color_205f">#0000205f</color>
+ <color name="i_am_color_2060">#00002060</color>
+ <color name="i_am_color_2061">#00002061</color>
+ <color name="i_am_color_2062">#00002062</color>
+ <color name="i_am_color_2063">#00002063</color>
+ <color name="i_am_color_2064">#00002064</color>
+ <color name="i_am_color_2065">#00002065</color>
+ <color name="i_am_color_2066">#00002066</color>
+ <color name="i_am_color_2067">#00002067</color>
+ <color name="i_am_color_2068">#00002068</color>
+ <color name="i_am_color_2069">#00002069</color>
+ <color name="i_am_color_206a">#0000206a</color>
+ <color name="i_am_color_206b">#0000206b</color>
+ <color name="i_am_color_206c">#0000206c</color>
+ <color name="i_am_color_206d">#0000206d</color>
+ <color name="i_am_color_206e">#0000206e</color>
+ <color name="i_am_color_206f">#0000206f</color>
+ <color name="i_am_color_2070">#00002070</color>
+ <color name="i_am_color_2071">#00002071</color>
+ <color name="i_am_color_2072">#00002072</color>
+ <color name="i_am_color_2073">#00002073</color>
+ <color name="i_am_color_2074">#00002074</color>
+ <color name="i_am_color_2075">#00002075</color>
+ <color name="i_am_color_2076">#00002076</color>
+ <color name="i_am_color_2077">#00002077</color>
+ <color name="i_am_color_2078">#00002078</color>
+ <color name="i_am_color_2079">#00002079</color>
+ <color name="i_am_color_207a">#0000207a</color>
+ <color name="i_am_color_207b">#0000207b</color>
+ <color name="i_am_color_207c">#0000207c</color>
+ <color name="i_am_color_207d">#0000207d</color>
+ <color name="i_am_color_207e">#0000207e</color>
+ <color name="i_am_color_207f">#0000207f</color>
+ <color name="i_am_color_2080">#00002080</color>
+ <color name="i_am_color_2081">#00002081</color>
+ <color name="i_am_color_2082">#00002082</color>
+ <color name="i_am_color_2083">#00002083</color>
+ <color name="i_am_color_2084">#00002084</color>
+ <color name="i_am_color_2085">#00002085</color>
+ <color name="i_am_color_2086">#00002086</color>
+ <color name="i_am_color_2087">#00002087</color>
+ <color name="i_am_color_2088">#00002088</color>
+ <color name="i_am_color_2089">#00002089</color>
+ <color name="i_am_color_208a">#0000208a</color>
+ <color name="i_am_color_208b">#0000208b</color>
+ <color name="i_am_color_208c">#0000208c</color>
+ <color name="i_am_color_208d">#0000208d</color>
+ <color name="i_am_color_208e">#0000208e</color>
+ <color name="i_am_color_208f">#0000208f</color>
+ <color name="i_am_color_2090">#00002090</color>
+ <color name="i_am_color_2091">#00002091</color>
+ <color name="i_am_color_2092">#00002092</color>
+ <color name="i_am_color_2093">#00002093</color>
+ <color name="i_am_color_2094">#00002094</color>
+ <color name="i_am_color_2095">#00002095</color>
+ <color name="i_am_color_2096">#00002096</color>
+ <color name="i_am_color_2097">#00002097</color>
+ <color name="i_am_color_2098">#00002098</color>
+ <color name="i_am_color_2099">#00002099</color>
+ <color name="i_am_color_209a">#0000209a</color>
+ <color name="i_am_color_209b">#0000209b</color>
+ <color name="i_am_color_209c">#0000209c</color>
+ <color name="i_am_color_209d">#0000209d</color>
+ <color name="i_am_color_209e">#0000209e</color>
+ <color name="i_am_color_209f">#0000209f</color>
+ <color name="i_am_color_20a0">#000020a0</color>
+ <color name="i_am_color_20a1">#000020a1</color>
+ <color name="i_am_color_20a2">#000020a2</color>
+ <color name="i_am_color_20a3">#000020a3</color>
+ <color name="i_am_color_20a4">#000020a4</color>
+ <color name="i_am_color_20a5">#000020a5</color>
+ <color name="i_am_color_20a6">#000020a6</color>
+ <color name="i_am_color_20a7">#000020a7</color>
+ <color name="i_am_color_20a8">#000020a8</color>
+ <color name="i_am_color_20a9">#000020a9</color>
+ <color name="i_am_color_20aa">#000020aa</color>
+ <color name="i_am_color_20ab">#000020ab</color>
+ <color name="i_am_color_20ac">#000020ac</color>
+ <color name="i_am_color_20ad">#000020ad</color>
+ <color name="i_am_color_20ae">#000020ae</color>
+ <color name="i_am_color_20af">#000020af</color>
+ <color name="i_am_color_20b0">#000020b0</color>
+ <color name="i_am_color_20b1">#000020b1</color>
+ <color name="i_am_color_20b2">#000020b2</color>
+ <color name="i_am_color_20b3">#000020b3</color>
+ <color name="i_am_color_20b4">#000020b4</color>
+ <color name="i_am_color_20b5">#000020b5</color>
+ <color name="i_am_color_20b6">#000020b6</color>
+ <color name="i_am_color_20b7">#000020b7</color>
+ <color name="i_am_color_20b8">#000020b8</color>
+ <color name="i_am_color_20b9">#000020b9</color>
+ <color name="i_am_color_20ba">#000020ba</color>
+ <color name="i_am_color_20bb">#000020bb</color>
+ <color name="i_am_color_20bc">#000020bc</color>
+ <color name="i_am_color_20bd">#000020bd</color>
+ <color name="i_am_color_20be">#000020be</color>
+ <color name="i_am_color_20bf">#000020bf</color>
+ <color name="i_am_color_20c0">#000020c0</color>
+ <color name="i_am_color_20c1">#000020c1</color>
+ <color name="i_am_color_20c2">#000020c2</color>
+ <color name="i_am_color_20c3">#000020c3</color>
+ <color name="i_am_color_20c4">#000020c4</color>
+ <color name="i_am_color_20c5">#000020c5</color>
+ <color name="i_am_color_20c6">#000020c6</color>
+ <color name="i_am_color_20c7">#000020c7</color>
+ <color name="i_am_color_20c8">#000020c8</color>
+ <color name="i_am_color_20c9">#000020c9</color>
+ <color name="i_am_color_20ca">#000020ca</color>
+ <color name="i_am_color_20cb">#000020cb</color>
+ <color name="i_am_color_20cc">#000020cc</color>
+ <color name="i_am_color_20cd">#000020cd</color>
+ <color name="i_am_color_20ce">#000020ce</color>
+ <color name="i_am_color_20cf">#000020cf</color>
+ <color name="i_am_color_20d0">#000020d0</color>
+ <color name="i_am_color_20d1">#000020d1</color>
+ <color name="i_am_color_20d2">#000020d2</color>
+ <color name="i_am_color_20d3">#000020d3</color>
+ <color name="i_am_color_20d4">#000020d4</color>
+ <color name="i_am_color_20d5">#000020d5</color>
+ <color name="i_am_color_20d6">#000020d6</color>
+ <color name="i_am_color_20d7">#000020d7</color>
+ <color name="i_am_color_20d8">#000020d8</color>
+ <color name="i_am_color_20d9">#000020d9</color>
+ <color name="i_am_color_20da">#000020da</color>
+ <color name="i_am_color_20db">#000020db</color>
+ <color name="i_am_color_20dc">#000020dc</color>
+ <color name="i_am_color_20dd">#000020dd</color>
+ <color name="i_am_color_20de">#000020de</color>
+ <color name="i_am_color_20df">#000020df</color>
+ <color name="i_am_color_20e0">#000020e0</color>
+ <color name="i_am_color_20e1">#000020e1</color>
+ <color name="i_am_color_20e2">#000020e2</color>
+ <color name="i_am_color_20e3">#000020e3</color>
+ <color name="i_am_color_20e4">#000020e4</color>
+ <color name="i_am_color_20e5">#000020e5</color>
+ <color name="i_am_color_20e6">#000020e6</color>
+ <color name="i_am_color_20e7">#000020e7</color>
+ <color name="i_am_color_20e8">#000020e8</color>
+ <color name="i_am_color_20e9">#000020e9</color>
+ <color name="i_am_color_20ea">#000020ea</color>
+ <color name="i_am_color_20eb">#000020eb</color>
+ <color name="i_am_color_20ec">#000020ec</color>
+ <color name="i_am_color_20ed">#000020ed</color>
+ <color name="i_am_color_20ee">#000020ee</color>
+ <color name="i_am_color_20ef">#000020ef</color>
+ <color name="i_am_color_20f0">#000020f0</color>
+ <color name="i_am_color_20f1">#000020f1</color>
+ <color name="i_am_color_20f2">#000020f2</color>
+ <color name="i_am_color_20f3">#000020f3</color>
+ <color name="i_am_color_20f4">#000020f4</color>
+ <color name="i_am_color_20f5">#000020f5</color>
+ <color name="i_am_color_20f6">#000020f6</color>
+ <color name="i_am_color_20f7">#000020f7</color>
+ <color name="i_am_color_20f8">#000020f8</color>
+ <color name="i_am_color_20f9">#000020f9</color>
+ <color name="i_am_color_20fa">#000020fa</color>
+ <color name="i_am_color_20fb">#000020fb</color>
+ <color name="i_am_color_20fc">#000020fc</color>
+ <color name="i_am_color_20fd">#000020fd</color>
+ <color name="i_am_color_20fe">#000020fe</color>
+ <color name="i_am_color_20ff">#000020ff</color>
+ <color name="i_am_color_2100">#00002100</color>
+ <color name="i_am_color_2101">#00002101</color>
+ <color name="i_am_color_2102">#00002102</color>
+ <color name="i_am_color_2103">#00002103</color>
+ <color name="i_am_color_2104">#00002104</color>
+ <color name="i_am_color_2105">#00002105</color>
+ <color name="i_am_color_2106">#00002106</color>
+ <color name="i_am_color_2107">#00002107</color>
+ <color name="i_am_color_2108">#00002108</color>
+ <color name="i_am_color_2109">#00002109</color>
+ <color name="i_am_color_210a">#0000210a</color>
+ <color name="i_am_color_210b">#0000210b</color>
+ <color name="i_am_color_210c">#0000210c</color>
+ <color name="i_am_color_210d">#0000210d</color>
+ <color name="i_am_color_210e">#0000210e</color>
+ <color name="i_am_color_210f">#0000210f</color>
+ <color name="i_am_color_2110">#00002110</color>
+ <color name="i_am_color_2111">#00002111</color>
+ <color name="i_am_color_2112">#00002112</color>
+ <color name="i_am_color_2113">#00002113</color>
+ <color name="i_am_color_2114">#00002114</color>
+ <color name="i_am_color_2115">#00002115</color>
+ <color name="i_am_color_2116">#00002116</color>
+ <color name="i_am_color_2117">#00002117</color>
+ <color name="i_am_color_2118">#00002118</color>
+ <color name="i_am_color_2119">#00002119</color>
+ <color name="i_am_color_211a">#0000211a</color>
+ <color name="i_am_color_211b">#0000211b</color>
+ <color name="i_am_color_211c">#0000211c</color>
+ <color name="i_am_color_211d">#0000211d</color>
+ <color name="i_am_color_211e">#0000211e</color>
+ <color name="i_am_color_211f">#0000211f</color>
+ <color name="i_am_color_2120">#00002120</color>
+ <color name="i_am_color_2121">#00002121</color>
+ <color name="i_am_color_2122">#00002122</color>
+ <color name="i_am_color_2123">#00002123</color>
+ <color name="i_am_color_2124">#00002124</color>
+ <color name="i_am_color_2125">#00002125</color>
+ <color name="i_am_color_2126">#00002126</color>
+ <color name="i_am_color_2127">#00002127</color>
+ <color name="i_am_color_2128">#00002128</color>
+ <color name="i_am_color_2129">#00002129</color>
+ <color name="i_am_color_212a">#0000212a</color>
+ <color name="i_am_color_212b">#0000212b</color>
+ <color name="i_am_color_212c">#0000212c</color>
+ <color name="i_am_color_212d">#0000212d</color>
+ <color name="i_am_color_212e">#0000212e</color>
+ <color name="i_am_color_212f">#0000212f</color>
+ <color name="i_am_color_2130">#00002130</color>
+ <color name="i_am_color_2131">#00002131</color>
+ <color name="i_am_color_2132">#00002132</color>
+ <color name="i_am_color_2133">#00002133</color>
+ <color name="i_am_color_2134">#00002134</color>
+ <color name="i_am_color_2135">#00002135</color>
+ <color name="i_am_color_2136">#00002136</color>
+ <color name="i_am_color_2137">#00002137</color>
+ <color name="i_am_color_2138">#00002138</color>
+ <color name="i_am_color_2139">#00002139</color>
+ <color name="i_am_color_213a">#0000213a</color>
+ <color name="i_am_color_213b">#0000213b</color>
+ <color name="i_am_color_213c">#0000213c</color>
+ <color name="i_am_color_213d">#0000213d</color>
+ <color name="i_am_color_213e">#0000213e</color>
+ <color name="i_am_color_213f">#0000213f</color>
+ <color name="i_am_color_2140">#00002140</color>
+ <color name="i_am_color_2141">#00002141</color>
+ <color name="i_am_color_2142">#00002142</color>
+ <color name="i_am_color_2143">#00002143</color>
+ <color name="i_am_color_2144">#00002144</color>
+ <color name="i_am_color_2145">#00002145</color>
+ <color name="i_am_color_2146">#00002146</color>
+ <color name="i_am_color_2147">#00002147</color>
+ <color name="i_am_color_2148">#00002148</color>
+ <color name="i_am_color_2149">#00002149</color>
+ <color name="i_am_color_214a">#0000214a</color>
+ <color name="i_am_color_214b">#0000214b</color>
+ <color name="i_am_color_214c">#0000214c</color>
+ <color name="i_am_color_214d">#0000214d</color>
+ <color name="i_am_color_214e">#0000214e</color>
+ <color name="i_am_color_214f">#0000214f</color>
+ <color name="i_am_color_2150">#00002150</color>
+ <color name="i_am_color_2151">#00002151</color>
+ <color name="i_am_color_2152">#00002152</color>
+ <color name="i_am_color_2153">#00002153</color>
+ <color name="i_am_color_2154">#00002154</color>
+ <color name="i_am_color_2155">#00002155</color>
+ <color name="i_am_color_2156">#00002156</color>
+ <color name="i_am_color_2157">#00002157</color>
+ <color name="i_am_color_2158">#00002158</color>
+ <color name="i_am_color_2159">#00002159</color>
+ <color name="i_am_color_215a">#0000215a</color>
+ <color name="i_am_color_215b">#0000215b</color>
+ <color name="i_am_color_215c">#0000215c</color>
+ <color name="i_am_color_215d">#0000215d</color>
+ <color name="i_am_color_215e">#0000215e</color>
+ <color name="i_am_color_215f">#0000215f</color>
+ <color name="i_am_color_2160">#00002160</color>
+ <color name="i_am_color_2161">#00002161</color>
+ <color name="i_am_color_2162">#00002162</color>
+ <color name="i_am_color_2163">#00002163</color>
+ <color name="i_am_color_2164">#00002164</color>
+ <color name="i_am_color_2165">#00002165</color>
+ <color name="i_am_color_2166">#00002166</color>
+ <color name="i_am_color_2167">#00002167</color>
+ <color name="i_am_color_2168">#00002168</color>
+ <color name="i_am_color_2169">#00002169</color>
+ <color name="i_am_color_216a">#0000216a</color>
+ <color name="i_am_color_216b">#0000216b</color>
+ <color name="i_am_color_216c">#0000216c</color>
+ <color name="i_am_color_216d">#0000216d</color>
+ <color name="i_am_color_216e">#0000216e</color>
+ <color name="i_am_color_216f">#0000216f</color>
+ <color name="i_am_color_2170">#00002170</color>
+ <color name="i_am_color_2171">#00002171</color>
+ <color name="i_am_color_2172">#00002172</color>
+ <color name="i_am_color_2173">#00002173</color>
+ <color name="i_am_color_2174">#00002174</color>
+ <color name="i_am_color_2175">#00002175</color>
+ <color name="i_am_color_2176">#00002176</color>
+ <color name="i_am_color_2177">#00002177</color>
+ <color name="i_am_color_2178">#00002178</color>
+ <color name="i_am_color_2179">#00002179</color>
+ <color name="i_am_color_217a">#0000217a</color>
+ <color name="i_am_color_217b">#0000217b</color>
+ <color name="i_am_color_217c">#0000217c</color>
+ <color name="i_am_color_217d">#0000217d</color>
+ <color name="i_am_color_217e">#0000217e</color>
+ <color name="i_am_color_217f">#0000217f</color>
+ <color name="i_am_color_2180">#00002180</color>
+ <color name="i_am_color_2181">#00002181</color>
+ <color name="i_am_color_2182">#00002182</color>
+ <color name="i_am_color_2183">#00002183</color>
+ <color name="i_am_color_2184">#00002184</color>
+ <color name="i_am_color_2185">#00002185</color>
+ <color name="i_am_color_2186">#00002186</color>
+ <color name="i_am_color_2187">#00002187</color>
+ <color name="i_am_color_2188">#00002188</color>
+ <color name="i_am_color_2189">#00002189</color>
+ <color name="i_am_color_218a">#0000218a</color>
+ <color name="i_am_color_218b">#0000218b</color>
+ <color name="i_am_color_218c">#0000218c</color>
+ <color name="i_am_color_218d">#0000218d</color>
+ <color name="i_am_color_218e">#0000218e</color>
+ <color name="i_am_color_218f">#0000218f</color>
+ <color name="i_am_color_2190">#00002190</color>
+ <color name="i_am_color_2191">#00002191</color>
+ <color name="i_am_color_2192">#00002192</color>
+ <color name="i_am_color_2193">#00002193</color>
+ <color name="i_am_color_2194">#00002194</color>
+ <color name="i_am_color_2195">#00002195</color>
+ <color name="i_am_color_2196">#00002196</color>
+ <color name="i_am_color_2197">#00002197</color>
+ <color name="i_am_color_2198">#00002198</color>
+ <color name="i_am_color_2199">#00002199</color>
+ <color name="i_am_color_219a">#0000219a</color>
+ <color name="i_am_color_219b">#0000219b</color>
+ <color name="i_am_color_219c">#0000219c</color>
+ <color name="i_am_color_219d">#0000219d</color>
+ <color name="i_am_color_219e">#0000219e</color>
+ <color name="i_am_color_219f">#0000219f</color>
+ <color name="i_am_color_21a0">#000021a0</color>
+ <color name="i_am_color_21a1">#000021a1</color>
+ <color name="i_am_color_21a2">#000021a2</color>
+ <color name="i_am_color_21a3">#000021a3</color>
+ <color name="i_am_color_21a4">#000021a4</color>
+ <color name="i_am_color_21a5">#000021a5</color>
+ <color name="i_am_color_21a6">#000021a6</color>
+ <color name="i_am_color_21a7">#000021a7</color>
+ <color name="i_am_color_21a8">#000021a8</color>
+ <color name="i_am_color_21a9">#000021a9</color>
+ <color name="i_am_color_21aa">#000021aa</color>
+ <color name="i_am_color_21ab">#000021ab</color>
+ <color name="i_am_color_21ac">#000021ac</color>
+ <color name="i_am_color_21ad">#000021ad</color>
+ <color name="i_am_color_21ae">#000021ae</color>
+ <color name="i_am_color_21af">#000021af</color>
+ <color name="i_am_color_21b0">#000021b0</color>
+ <color name="i_am_color_21b1">#000021b1</color>
+ <color name="i_am_color_21b2">#000021b2</color>
+ <color name="i_am_color_21b3">#000021b3</color>
+ <color name="i_am_color_21b4">#000021b4</color>
+ <color name="i_am_color_21b5">#000021b5</color>
+ <color name="i_am_color_21b6">#000021b6</color>
+ <color name="i_am_color_21b7">#000021b7</color>
+ <color name="i_am_color_21b8">#000021b8</color>
+ <color name="i_am_color_21b9">#000021b9</color>
+ <color name="i_am_color_21ba">#000021ba</color>
+ <color name="i_am_color_21bb">#000021bb</color>
+ <color name="i_am_color_21bc">#000021bc</color>
+ <color name="i_am_color_21bd">#000021bd</color>
+ <color name="i_am_color_21be">#000021be</color>
+ <color name="i_am_color_21bf">#000021bf</color>
+ <color name="i_am_color_21c0">#000021c0</color>
+ <color name="i_am_color_21c1">#000021c1</color>
+ <color name="i_am_color_21c2">#000021c2</color>
+ <color name="i_am_color_21c3">#000021c3</color>
+ <color name="i_am_color_21c4">#000021c4</color>
+ <color name="i_am_color_21c5">#000021c5</color>
+ <color name="i_am_color_21c6">#000021c6</color>
+ <color name="i_am_color_21c7">#000021c7</color>
+ <color name="i_am_color_21c8">#000021c8</color>
+ <color name="i_am_color_21c9">#000021c9</color>
+ <color name="i_am_color_21ca">#000021ca</color>
+ <color name="i_am_color_21cb">#000021cb</color>
+ <color name="i_am_color_21cc">#000021cc</color>
+ <color name="i_am_color_21cd">#000021cd</color>
+ <color name="i_am_color_21ce">#000021ce</color>
+ <color name="i_am_color_21cf">#000021cf</color>
+ <color name="i_am_color_21d0">#000021d0</color>
+ <color name="i_am_color_21d1">#000021d1</color>
+ <color name="i_am_color_21d2">#000021d2</color>
+ <color name="i_am_color_21d3">#000021d3</color>
+ <color name="i_am_color_21d4">#000021d4</color>
+ <color name="i_am_color_21d5">#000021d5</color>
+ <color name="i_am_color_21d6">#000021d6</color>
+ <color name="i_am_color_21d7">#000021d7</color>
+ <color name="i_am_color_21d8">#000021d8</color>
+ <color name="i_am_color_21d9">#000021d9</color>
+ <color name="i_am_color_21da">#000021da</color>
+ <color name="i_am_color_21db">#000021db</color>
+ <color name="i_am_color_21dc">#000021dc</color>
+ <color name="i_am_color_21dd">#000021dd</color>
+ <color name="i_am_color_21de">#000021de</color>
+ <color name="i_am_color_21df">#000021df</color>
+ <color name="i_am_color_21e0">#000021e0</color>
+ <color name="i_am_color_21e1">#000021e1</color>
+ <color name="i_am_color_21e2">#000021e2</color>
+ <color name="i_am_color_21e3">#000021e3</color>
+ <color name="i_am_color_21e4">#000021e4</color>
+ <color name="i_am_color_21e5">#000021e5</color>
+ <color name="i_am_color_21e6">#000021e6</color>
+ <color name="i_am_color_21e7">#000021e7</color>
+ <color name="i_am_color_21e8">#000021e8</color>
+ <color name="i_am_color_21e9">#000021e9</color>
+ <color name="i_am_color_21ea">#000021ea</color>
+ <color name="i_am_color_21eb">#000021eb</color>
+ <color name="i_am_color_21ec">#000021ec</color>
+ <color name="i_am_color_21ed">#000021ed</color>
+ <color name="i_am_color_21ee">#000021ee</color>
+ <color name="i_am_color_21ef">#000021ef</color>
+ <color name="i_am_color_21f0">#000021f0</color>
+ <color name="i_am_color_21f1">#000021f1</color>
+ <color name="i_am_color_21f2">#000021f2</color>
+ <color name="i_am_color_21f3">#000021f3</color>
+ <color name="i_am_color_21f4">#000021f4</color>
+ <color name="i_am_color_21f5">#000021f5</color>
+ <color name="i_am_color_21f6">#000021f6</color>
+ <color name="i_am_color_21f7">#000021f7</color>
+ <color name="i_am_color_21f8">#000021f8</color>
+ <color name="i_am_color_21f9">#000021f9</color>
+ <color name="i_am_color_21fa">#000021fa</color>
+ <color name="i_am_color_21fb">#000021fb</color>
+ <color name="i_am_color_21fc">#000021fc</color>
+ <color name="i_am_color_21fd">#000021fd</color>
+ <color name="i_am_color_21fe">#000021fe</color>
+ <color name="i_am_color_21ff">#000021ff</color>
+ <color name="i_am_color_2200">#00002200</color>
+ <color name="i_am_color_2201">#00002201</color>
+ <color name="i_am_color_2202">#00002202</color>
+ <color name="i_am_color_2203">#00002203</color>
+ <color name="i_am_color_2204">#00002204</color>
+ <color name="i_am_color_2205">#00002205</color>
+ <color name="i_am_color_2206">#00002206</color>
+ <color name="i_am_color_2207">#00002207</color>
+ <color name="i_am_color_2208">#00002208</color>
+ <color name="i_am_color_2209">#00002209</color>
+ <color name="i_am_color_220a">#0000220a</color>
+ <color name="i_am_color_220b">#0000220b</color>
+ <color name="i_am_color_220c">#0000220c</color>
+ <color name="i_am_color_220d">#0000220d</color>
+ <color name="i_am_color_220e">#0000220e</color>
+ <color name="i_am_color_220f">#0000220f</color>
+ <color name="i_am_color_2210">#00002210</color>
+ <color name="i_am_color_2211">#00002211</color>
+ <color name="i_am_color_2212">#00002212</color>
+ <color name="i_am_color_2213">#00002213</color>
+ <color name="i_am_color_2214">#00002214</color>
+ <color name="i_am_color_2215">#00002215</color>
+ <color name="i_am_color_2216">#00002216</color>
+ <color name="i_am_color_2217">#00002217</color>
+ <color name="i_am_color_2218">#00002218</color>
+ <color name="i_am_color_2219">#00002219</color>
+ <color name="i_am_color_221a">#0000221a</color>
+ <color name="i_am_color_221b">#0000221b</color>
+ <color name="i_am_color_221c">#0000221c</color>
+ <color name="i_am_color_221d">#0000221d</color>
+ <color name="i_am_color_221e">#0000221e</color>
+ <color name="i_am_color_221f">#0000221f</color>
+ <color name="i_am_color_2220">#00002220</color>
+ <color name="i_am_color_2221">#00002221</color>
+ <color name="i_am_color_2222">#00002222</color>
+ <color name="i_am_color_2223">#00002223</color>
+ <color name="i_am_color_2224">#00002224</color>
+ <color name="i_am_color_2225">#00002225</color>
+ <color name="i_am_color_2226">#00002226</color>
+ <color name="i_am_color_2227">#00002227</color>
+ <color name="i_am_color_2228">#00002228</color>
+ <color name="i_am_color_2229">#00002229</color>
+ <color name="i_am_color_222a">#0000222a</color>
+ <color name="i_am_color_222b">#0000222b</color>
+ <color name="i_am_color_222c">#0000222c</color>
+ <color name="i_am_color_222d">#0000222d</color>
+ <color name="i_am_color_222e">#0000222e</color>
+ <color name="i_am_color_222f">#0000222f</color>
+ <color name="i_am_color_2230">#00002230</color>
+ <color name="i_am_color_2231">#00002231</color>
+ <color name="i_am_color_2232">#00002232</color>
+ <color name="i_am_color_2233">#00002233</color>
+ <color name="i_am_color_2234">#00002234</color>
+ <color name="i_am_color_2235">#00002235</color>
+ <color name="i_am_color_2236">#00002236</color>
+ <color name="i_am_color_2237">#00002237</color>
+ <color name="i_am_color_2238">#00002238</color>
+ <color name="i_am_color_2239">#00002239</color>
+ <color name="i_am_color_223a">#0000223a</color>
+ <color name="i_am_color_223b">#0000223b</color>
+ <color name="i_am_color_223c">#0000223c</color>
+ <color name="i_am_color_223d">#0000223d</color>
+ <color name="i_am_color_223e">#0000223e</color>
+ <color name="i_am_color_223f">#0000223f</color>
+ <color name="i_am_color_2240">#00002240</color>
+ <color name="i_am_color_2241">#00002241</color>
+ <color name="i_am_color_2242">#00002242</color>
+ <color name="i_am_color_2243">#00002243</color>
+ <color name="i_am_color_2244">#00002244</color>
+ <color name="i_am_color_2245">#00002245</color>
+ <color name="i_am_color_2246">#00002246</color>
+ <color name="i_am_color_2247">#00002247</color>
+ <color name="i_am_color_2248">#00002248</color>
+ <color name="i_am_color_2249">#00002249</color>
+ <color name="i_am_color_224a">#0000224a</color>
+ <color name="i_am_color_224b">#0000224b</color>
+ <color name="i_am_color_224c">#0000224c</color>
+ <color name="i_am_color_224d">#0000224d</color>
+ <color name="i_am_color_224e">#0000224e</color>
+ <color name="i_am_color_224f">#0000224f</color>
+ <color name="i_am_color_2250">#00002250</color>
+ <color name="i_am_color_2251">#00002251</color>
+ <color name="i_am_color_2252">#00002252</color>
+ <color name="i_am_color_2253">#00002253</color>
+ <color name="i_am_color_2254">#00002254</color>
+ <color name="i_am_color_2255">#00002255</color>
+ <color name="i_am_color_2256">#00002256</color>
+ <color name="i_am_color_2257">#00002257</color>
+ <color name="i_am_color_2258">#00002258</color>
+ <color name="i_am_color_2259">#00002259</color>
+ <color name="i_am_color_225a">#0000225a</color>
+ <color name="i_am_color_225b">#0000225b</color>
+ <color name="i_am_color_225c">#0000225c</color>
+ <color name="i_am_color_225d">#0000225d</color>
+ <color name="i_am_color_225e">#0000225e</color>
+ <color name="i_am_color_225f">#0000225f</color>
+ <color name="i_am_color_2260">#00002260</color>
+ <color name="i_am_color_2261">#00002261</color>
+ <color name="i_am_color_2262">#00002262</color>
+ <color name="i_am_color_2263">#00002263</color>
+ <color name="i_am_color_2264">#00002264</color>
+ <color name="i_am_color_2265">#00002265</color>
+ <color name="i_am_color_2266">#00002266</color>
+ <color name="i_am_color_2267">#00002267</color>
+ <color name="i_am_color_2268">#00002268</color>
+ <color name="i_am_color_2269">#00002269</color>
+ <color name="i_am_color_226a">#0000226a</color>
+ <color name="i_am_color_226b">#0000226b</color>
+ <color name="i_am_color_226c">#0000226c</color>
+ <color name="i_am_color_226d">#0000226d</color>
+ <color name="i_am_color_226e">#0000226e</color>
+ <color name="i_am_color_226f">#0000226f</color>
+ <color name="i_am_color_2270">#00002270</color>
+ <color name="i_am_color_2271">#00002271</color>
+ <color name="i_am_color_2272">#00002272</color>
+ <color name="i_am_color_2273">#00002273</color>
+ <color name="i_am_color_2274">#00002274</color>
+ <color name="i_am_color_2275">#00002275</color>
+ <color name="i_am_color_2276">#00002276</color>
+ <color name="i_am_color_2277">#00002277</color>
+ <color name="i_am_color_2278">#00002278</color>
+ <color name="i_am_color_2279">#00002279</color>
+ <color name="i_am_color_227a">#0000227a</color>
+ <color name="i_am_color_227b">#0000227b</color>
+ <color name="i_am_color_227c">#0000227c</color>
+ <color name="i_am_color_227d">#0000227d</color>
+ <color name="i_am_color_227e">#0000227e</color>
+ <color name="i_am_color_227f">#0000227f</color>
+ <color name="i_am_color_2280">#00002280</color>
+ <color name="i_am_color_2281">#00002281</color>
+ <color name="i_am_color_2282">#00002282</color>
+ <color name="i_am_color_2283">#00002283</color>
+ <color name="i_am_color_2284">#00002284</color>
+ <color name="i_am_color_2285">#00002285</color>
+ <color name="i_am_color_2286">#00002286</color>
+ <color name="i_am_color_2287">#00002287</color>
+ <color name="i_am_color_2288">#00002288</color>
+ <color name="i_am_color_2289">#00002289</color>
+ <color name="i_am_color_228a">#0000228a</color>
+ <color name="i_am_color_228b">#0000228b</color>
+ <color name="i_am_color_228c">#0000228c</color>
+ <color name="i_am_color_228d">#0000228d</color>
+ <color name="i_am_color_228e">#0000228e</color>
+ <color name="i_am_color_228f">#0000228f</color>
+ <color name="i_am_color_2290">#00002290</color>
+ <color name="i_am_color_2291">#00002291</color>
+ <color name="i_am_color_2292">#00002292</color>
+ <color name="i_am_color_2293">#00002293</color>
+ <color name="i_am_color_2294">#00002294</color>
+ <color name="i_am_color_2295">#00002295</color>
+ <color name="i_am_color_2296">#00002296</color>
+ <color name="i_am_color_2297">#00002297</color>
+ <color name="i_am_color_2298">#00002298</color>
+ <color name="i_am_color_2299">#00002299</color>
+ <color name="i_am_color_229a">#0000229a</color>
+ <color name="i_am_color_229b">#0000229b</color>
+ <color name="i_am_color_229c">#0000229c</color>
+ <color name="i_am_color_229d">#0000229d</color>
+ <color name="i_am_color_229e">#0000229e</color>
+ <color name="i_am_color_229f">#0000229f</color>
+ <color name="i_am_color_22a0">#000022a0</color>
+ <color name="i_am_color_22a1">#000022a1</color>
+ <color name="i_am_color_22a2">#000022a2</color>
+ <color name="i_am_color_22a3">#000022a3</color>
+ <color name="i_am_color_22a4">#000022a4</color>
+ <color name="i_am_color_22a5">#000022a5</color>
+ <color name="i_am_color_22a6">#000022a6</color>
+ <color name="i_am_color_22a7">#000022a7</color>
+ <color name="i_am_color_22a8">#000022a8</color>
+ <color name="i_am_color_22a9">#000022a9</color>
+ <color name="i_am_color_22aa">#000022aa</color>
+ <color name="i_am_color_22ab">#000022ab</color>
+ <color name="i_am_color_22ac">#000022ac</color>
+ <color name="i_am_color_22ad">#000022ad</color>
+ <color name="i_am_color_22ae">#000022ae</color>
+ <color name="i_am_color_22af">#000022af</color>
+ <color name="i_am_color_22b0">#000022b0</color>
+ <color name="i_am_color_22b1">#000022b1</color>
+ <color name="i_am_color_22b2">#000022b2</color>
+ <color name="i_am_color_22b3">#000022b3</color>
+ <color name="i_am_color_22b4">#000022b4</color>
+ <color name="i_am_color_22b5">#000022b5</color>
+ <color name="i_am_color_22b6">#000022b6</color>
+ <color name="i_am_color_22b7">#000022b7</color>
+ <color name="i_am_color_22b8">#000022b8</color>
+ <color name="i_am_color_22b9">#000022b9</color>
+ <color name="i_am_color_22ba">#000022ba</color>
+ <color name="i_am_color_22bb">#000022bb</color>
+ <color name="i_am_color_22bc">#000022bc</color>
+ <color name="i_am_color_22bd">#000022bd</color>
+ <color name="i_am_color_22be">#000022be</color>
+ <color name="i_am_color_22bf">#000022bf</color>
+ <color name="i_am_color_22c0">#000022c0</color>
+ <color name="i_am_color_22c1">#000022c1</color>
+ <color name="i_am_color_22c2">#000022c2</color>
+ <color name="i_am_color_22c3">#000022c3</color>
+ <color name="i_am_color_22c4">#000022c4</color>
+ <color name="i_am_color_22c5">#000022c5</color>
+ <color name="i_am_color_22c6">#000022c6</color>
+ <color name="i_am_color_22c7">#000022c7</color>
+ <color name="i_am_color_22c8">#000022c8</color>
+ <color name="i_am_color_22c9">#000022c9</color>
+ <color name="i_am_color_22ca">#000022ca</color>
+ <color name="i_am_color_22cb">#000022cb</color>
+ <color name="i_am_color_22cc">#000022cc</color>
+ <color name="i_am_color_22cd">#000022cd</color>
+ <color name="i_am_color_22ce">#000022ce</color>
+ <color name="i_am_color_22cf">#000022cf</color>
+ <color name="i_am_color_22d0">#000022d0</color>
+ <color name="i_am_color_22d1">#000022d1</color>
+ <color name="i_am_color_22d2">#000022d2</color>
+ <color name="i_am_color_22d3">#000022d3</color>
+ <color name="i_am_color_22d4">#000022d4</color>
+ <color name="i_am_color_22d5">#000022d5</color>
+ <color name="i_am_color_22d6">#000022d6</color>
+ <color name="i_am_color_22d7">#000022d7</color>
+ <color name="i_am_color_22d8">#000022d8</color>
+ <color name="i_am_color_22d9">#000022d9</color>
+ <color name="i_am_color_22da">#000022da</color>
+ <color name="i_am_color_22db">#000022db</color>
+ <color name="i_am_color_22dc">#000022dc</color>
+ <color name="i_am_color_22dd">#000022dd</color>
+ <color name="i_am_color_22de">#000022de</color>
+ <color name="i_am_color_22df">#000022df</color>
+ <color name="i_am_color_22e0">#000022e0</color>
+ <color name="i_am_color_22e1">#000022e1</color>
+ <color name="i_am_color_22e2">#000022e2</color>
+ <color name="i_am_color_22e3">#000022e3</color>
+ <color name="i_am_color_22e4">#000022e4</color>
+ <color name="i_am_color_22e5">#000022e5</color>
+ <color name="i_am_color_22e6">#000022e6</color>
+ <color name="i_am_color_22e7">#000022e7</color>
+ <color name="i_am_color_22e8">#000022e8</color>
+ <color name="i_am_color_22e9">#000022e9</color>
+ <color name="i_am_color_22ea">#000022ea</color>
+ <color name="i_am_color_22eb">#000022eb</color>
+ <color name="i_am_color_22ec">#000022ec</color>
+ <color name="i_am_color_22ed">#000022ed</color>
+ <color name="i_am_color_22ee">#000022ee</color>
+ <color name="i_am_color_22ef">#000022ef</color>
+ <color name="i_am_color_22f0">#000022f0</color>
+ <color name="i_am_color_22f1">#000022f1</color>
+ <color name="i_am_color_22f2">#000022f2</color>
+ <color name="i_am_color_22f3">#000022f3</color>
+ <color name="i_am_color_22f4">#000022f4</color>
+ <color name="i_am_color_22f5">#000022f5</color>
+ <color name="i_am_color_22f6">#000022f6</color>
+ <color name="i_am_color_22f7">#000022f7</color>
+ <color name="i_am_color_22f8">#000022f8</color>
+ <color name="i_am_color_22f9">#000022f9</color>
+ <color name="i_am_color_22fa">#000022fa</color>
+ <color name="i_am_color_22fb">#000022fb</color>
+ <color name="i_am_color_22fc">#000022fc</color>
+ <color name="i_am_color_22fd">#000022fd</color>
+ <color name="i_am_color_22fe">#000022fe</color>
+ <color name="i_am_color_22ff">#000022ff</color>
+ <color name="i_am_color_2300">#00002300</color>
+ <color name="i_am_color_2301">#00002301</color>
+ <color name="i_am_color_2302">#00002302</color>
+ <color name="i_am_color_2303">#00002303</color>
+ <color name="i_am_color_2304">#00002304</color>
+ <color name="i_am_color_2305">#00002305</color>
+ <color name="i_am_color_2306">#00002306</color>
+ <color name="i_am_color_2307">#00002307</color>
+ <color name="i_am_color_2308">#00002308</color>
+ <color name="i_am_color_2309">#00002309</color>
+ <color name="i_am_color_230a">#0000230a</color>
+ <color name="i_am_color_230b">#0000230b</color>
+ <color name="i_am_color_230c">#0000230c</color>
+ <color name="i_am_color_230d">#0000230d</color>
+ <color name="i_am_color_230e">#0000230e</color>
+ <color name="i_am_color_230f">#0000230f</color>
+ <color name="i_am_color_2310">#00002310</color>
+ <color name="i_am_color_2311">#00002311</color>
+ <color name="i_am_color_2312">#00002312</color>
+ <color name="i_am_color_2313">#00002313</color>
+ <color name="i_am_color_2314">#00002314</color>
+ <color name="i_am_color_2315">#00002315</color>
+ <color name="i_am_color_2316">#00002316</color>
+ <color name="i_am_color_2317">#00002317</color>
+ <color name="i_am_color_2318">#00002318</color>
+ <color name="i_am_color_2319">#00002319</color>
+ <color name="i_am_color_231a">#0000231a</color>
+ <color name="i_am_color_231b">#0000231b</color>
+ <color name="i_am_color_231c">#0000231c</color>
+ <color name="i_am_color_231d">#0000231d</color>
+ <color name="i_am_color_231e">#0000231e</color>
+ <color name="i_am_color_231f">#0000231f</color>
+ <color name="i_am_color_2320">#00002320</color>
+ <color name="i_am_color_2321">#00002321</color>
+ <color name="i_am_color_2322">#00002322</color>
+ <color name="i_am_color_2323">#00002323</color>
+ <color name="i_am_color_2324">#00002324</color>
+ <color name="i_am_color_2325">#00002325</color>
+ <color name="i_am_color_2326">#00002326</color>
+ <color name="i_am_color_2327">#00002327</color>
+ <color name="i_am_color_2328">#00002328</color>
+ <color name="i_am_color_2329">#00002329</color>
+ <color name="i_am_color_232a">#0000232a</color>
+ <color name="i_am_color_232b">#0000232b</color>
+ <color name="i_am_color_232c">#0000232c</color>
+ <color name="i_am_color_232d">#0000232d</color>
+ <color name="i_am_color_232e">#0000232e</color>
+ <color name="i_am_color_232f">#0000232f</color>
+ <color name="i_am_color_2330">#00002330</color>
+ <color name="i_am_color_2331">#00002331</color>
+ <color name="i_am_color_2332">#00002332</color>
+ <color name="i_am_color_2333">#00002333</color>
+ <color name="i_am_color_2334">#00002334</color>
+ <color name="i_am_color_2335">#00002335</color>
+ <color name="i_am_color_2336">#00002336</color>
+ <color name="i_am_color_2337">#00002337</color>
+ <color name="i_am_color_2338">#00002338</color>
+ <color name="i_am_color_2339">#00002339</color>
+ <color name="i_am_color_233a">#0000233a</color>
+ <color name="i_am_color_233b">#0000233b</color>
+ <color name="i_am_color_233c">#0000233c</color>
+ <color name="i_am_color_233d">#0000233d</color>
+ <color name="i_am_color_233e">#0000233e</color>
+ <color name="i_am_color_233f">#0000233f</color>
+ <color name="i_am_color_2340">#00002340</color>
+ <color name="i_am_color_2341">#00002341</color>
+ <color name="i_am_color_2342">#00002342</color>
+ <color name="i_am_color_2343">#00002343</color>
+ <color name="i_am_color_2344">#00002344</color>
+ <color name="i_am_color_2345">#00002345</color>
+ <color name="i_am_color_2346">#00002346</color>
+ <color name="i_am_color_2347">#00002347</color>
+ <color name="i_am_color_2348">#00002348</color>
+ <color name="i_am_color_2349">#00002349</color>
+ <color name="i_am_color_234a">#0000234a</color>
+ <color name="i_am_color_234b">#0000234b</color>
+ <color name="i_am_color_234c">#0000234c</color>
+ <color name="i_am_color_234d">#0000234d</color>
+ <color name="i_am_color_234e">#0000234e</color>
+ <color name="i_am_color_234f">#0000234f</color>
+ <color name="i_am_color_2350">#00002350</color>
+ <color name="i_am_color_2351">#00002351</color>
+ <color name="i_am_color_2352">#00002352</color>
+ <color name="i_am_color_2353">#00002353</color>
+ <color name="i_am_color_2354">#00002354</color>
+ <color name="i_am_color_2355">#00002355</color>
+ <color name="i_am_color_2356">#00002356</color>
+ <color name="i_am_color_2357">#00002357</color>
+ <color name="i_am_color_2358">#00002358</color>
+ <color name="i_am_color_2359">#00002359</color>
+ <color name="i_am_color_235a">#0000235a</color>
+ <color name="i_am_color_235b">#0000235b</color>
+ <color name="i_am_color_235c">#0000235c</color>
+ <color name="i_am_color_235d">#0000235d</color>
+ <color name="i_am_color_235e">#0000235e</color>
+ <color name="i_am_color_235f">#0000235f</color>
+ <color name="i_am_color_2360">#00002360</color>
+ <color name="i_am_color_2361">#00002361</color>
+ <color name="i_am_color_2362">#00002362</color>
+ <color name="i_am_color_2363">#00002363</color>
+ <color name="i_am_color_2364">#00002364</color>
+ <color name="i_am_color_2365">#00002365</color>
+ <color name="i_am_color_2366">#00002366</color>
+ <color name="i_am_color_2367">#00002367</color>
+ <color name="i_am_color_2368">#00002368</color>
+ <color name="i_am_color_2369">#00002369</color>
+ <color name="i_am_color_236a">#0000236a</color>
+ <color name="i_am_color_236b">#0000236b</color>
+ <color name="i_am_color_236c">#0000236c</color>
+ <color name="i_am_color_236d">#0000236d</color>
+ <color name="i_am_color_236e">#0000236e</color>
+ <color name="i_am_color_236f">#0000236f</color>
+ <color name="i_am_color_2370">#00002370</color>
+ <color name="i_am_color_2371">#00002371</color>
+ <color name="i_am_color_2372">#00002372</color>
+ <color name="i_am_color_2373">#00002373</color>
+ <color name="i_am_color_2374">#00002374</color>
+ <color name="i_am_color_2375">#00002375</color>
+ <color name="i_am_color_2376">#00002376</color>
+ <color name="i_am_color_2377">#00002377</color>
+ <color name="i_am_color_2378">#00002378</color>
+ <color name="i_am_color_2379">#00002379</color>
+ <color name="i_am_color_237a">#0000237a</color>
+ <color name="i_am_color_237b">#0000237b</color>
+ <color name="i_am_color_237c">#0000237c</color>
+ <color name="i_am_color_237d">#0000237d</color>
+ <color name="i_am_color_237e">#0000237e</color>
+ <color name="i_am_color_237f">#0000237f</color>
+ <color name="i_am_color_2380">#00002380</color>
+ <color name="i_am_color_2381">#00002381</color>
+ <color name="i_am_color_2382">#00002382</color>
+ <color name="i_am_color_2383">#00002383</color>
+ <color name="i_am_color_2384">#00002384</color>
+ <color name="i_am_color_2385">#00002385</color>
+ <color name="i_am_color_2386">#00002386</color>
+ <color name="i_am_color_2387">#00002387</color>
+ <color name="i_am_color_2388">#00002388</color>
+ <color name="i_am_color_2389">#00002389</color>
+ <color name="i_am_color_238a">#0000238a</color>
+ <color name="i_am_color_238b">#0000238b</color>
+ <color name="i_am_color_238c">#0000238c</color>
+ <color name="i_am_color_238d">#0000238d</color>
+ <color name="i_am_color_238e">#0000238e</color>
+ <color name="i_am_color_238f">#0000238f</color>
+ <color name="i_am_color_2390">#00002390</color>
+ <color name="i_am_color_2391">#00002391</color>
+ <color name="i_am_color_2392">#00002392</color>
+ <color name="i_am_color_2393">#00002393</color>
+ <color name="i_am_color_2394">#00002394</color>
+ <color name="i_am_color_2395">#00002395</color>
+ <color name="i_am_color_2396">#00002396</color>
+ <color name="i_am_color_2397">#00002397</color>
+ <color name="i_am_color_2398">#00002398</color>
+ <color name="i_am_color_2399">#00002399</color>
+ <color name="i_am_color_239a">#0000239a</color>
+ <color name="i_am_color_239b">#0000239b</color>
+ <color name="i_am_color_239c">#0000239c</color>
+ <color name="i_am_color_239d">#0000239d</color>
+ <color name="i_am_color_239e">#0000239e</color>
+ <color name="i_am_color_239f">#0000239f</color>
+ <color name="i_am_color_23a0">#000023a0</color>
+ <color name="i_am_color_23a1">#000023a1</color>
+ <color name="i_am_color_23a2">#000023a2</color>
+ <color name="i_am_color_23a3">#000023a3</color>
+ <color name="i_am_color_23a4">#000023a4</color>
+ <color name="i_am_color_23a5">#000023a5</color>
+ <color name="i_am_color_23a6">#000023a6</color>
+ <color name="i_am_color_23a7">#000023a7</color>
+ <color name="i_am_color_23a8">#000023a8</color>
+ <color name="i_am_color_23a9">#000023a9</color>
+ <color name="i_am_color_23aa">#000023aa</color>
+ <color name="i_am_color_23ab">#000023ab</color>
+ <color name="i_am_color_23ac">#000023ac</color>
+ <color name="i_am_color_23ad">#000023ad</color>
+ <color name="i_am_color_23ae">#000023ae</color>
+ <color name="i_am_color_23af">#000023af</color>
+ <color name="i_am_color_23b0">#000023b0</color>
+ <color name="i_am_color_23b1">#000023b1</color>
+ <color name="i_am_color_23b2">#000023b2</color>
+ <color name="i_am_color_23b3">#000023b3</color>
+ <color name="i_am_color_23b4">#000023b4</color>
+ <color name="i_am_color_23b5">#000023b5</color>
+ <color name="i_am_color_23b6">#000023b6</color>
+ <color name="i_am_color_23b7">#000023b7</color>
+ <color name="i_am_color_23b8">#000023b8</color>
+ <color name="i_am_color_23b9">#000023b9</color>
+ <color name="i_am_color_23ba">#000023ba</color>
+ <color name="i_am_color_23bb">#000023bb</color>
+ <color name="i_am_color_23bc">#000023bc</color>
+ <color name="i_am_color_23bd">#000023bd</color>
+ <color name="i_am_color_23be">#000023be</color>
+ <color name="i_am_color_23bf">#000023bf</color>
+ <color name="i_am_color_23c0">#000023c0</color>
+ <color name="i_am_color_23c1">#000023c1</color>
+ <color name="i_am_color_23c2">#000023c2</color>
+ <color name="i_am_color_23c3">#000023c3</color>
+ <color name="i_am_color_23c4">#000023c4</color>
+ <color name="i_am_color_23c5">#000023c5</color>
+ <color name="i_am_color_23c6">#000023c6</color>
+ <color name="i_am_color_23c7">#000023c7</color>
+ <color name="i_am_color_23c8">#000023c8</color>
+ <color name="i_am_color_23c9">#000023c9</color>
+ <color name="i_am_color_23ca">#000023ca</color>
+ <color name="i_am_color_23cb">#000023cb</color>
+ <color name="i_am_color_23cc">#000023cc</color>
+ <color name="i_am_color_23cd">#000023cd</color>
+ <color name="i_am_color_23ce">#000023ce</color>
+ <color name="i_am_color_23cf">#000023cf</color>
+ <color name="i_am_color_23d0">#000023d0</color>
+ <color name="i_am_color_23d1">#000023d1</color>
+ <color name="i_am_color_23d2">#000023d2</color>
+ <color name="i_am_color_23d3">#000023d3</color>
+ <color name="i_am_color_23d4">#000023d4</color>
+ <color name="i_am_color_23d5">#000023d5</color>
+ <color name="i_am_color_23d6">#000023d6</color>
+ <color name="i_am_color_23d7">#000023d7</color>
+ <color name="i_am_color_23d8">#000023d8</color>
+ <color name="i_am_color_23d9">#000023d9</color>
+ <color name="i_am_color_23da">#000023da</color>
+ <color name="i_am_color_23db">#000023db</color>
+ <color name="i_am_color_23dc">#000023dc</color>
+ <color name="i_am_color_23dd">#000023dd</color>
+ <color name="i_am_color_23de">#000023de</color>
+ <color name="i_am_color_23df">#000023df</color>
+ <color name="i_am_color_23e0">#000023e0</color>
+ <color name="i_am_color_23e1">#000023e1</color>
+ <color name="i_am_color_23e2">#000023e2</color>
+ <color name="i_am_color_23e3">#000023e3</color>
+ <color name="i_am_color_23e4">#000023e4</color>
+ <color name="i_am_color_23e5">#000023e5</color>
+ <color name="i_am_color_23e6">#000023e6</color>
+ <color name="i_am_color_23e7">#000023e7</color>
+ <color name="i_am_color_23e8">#000023e8</color>
+ <color name="i_am_color_23e9">#000023e9</color>
+ <color name="i_am_color_23ea">#000023ea</color>
+ <color name="i_am_color_23eb">#000023eb</color>
+ <color name="i_am_color_23ec">#000023ec</color>
+ <color name="i_am_color_23ed">#000023ed</color>
+ <color name="i_am_color_23ee">#000023ee</color>
+ <color name="i_am_color_23ef">#000023ef</color>
+ <color name="i_am_color_23f0">#000023f0</color>
+ <color name="i_am_color_23f1">#000023f1</color>
+ <color name="i_am_color_23f2">#000023f2</color>
+ <color name="i_am_color_23f3">#000023f3</color>
+ <color name="i_am_color_23f4">#000023f4</color>
+ <color name="i_am_color_23f5">#000023f5</color>
+ <color name="i_am_color_23f6">#000023f6</color>
+ <color name="i_am_color_23f7">#000023f7</color>
+ <color name="i_am_color_23f8">#000023f8</color>
+ <color name="i_am_color_23f9">#000023f9</color>
+ <color name="i_am_color_23fa">#000023fa</color>
+ <color name="i_am_color_23fb">#000023fb</color>
+ <color name="i_am_color_23fc">#000023fc</color>
+ <color name="i_am_color_23fd">#000023fd</color>
+ <color name="i_am_color_23fe">#000023fe</color>
+ <color name="i_am_color_23ff">#000023ff</color>
+ <color name="i_am_color_2400">#00002400</color>
+ <color name="i_am_color_2401">#00002401</color>
+ <color name="i_am_color_2402">#00002402</color>
+ <color name="i_am_color_2403">#00002403</color>
+ <color name="i_am_color_2404">#00002404</color>
+ <color name="i_am_color_2405">#00002405</color>
+ <color name="i_am_color_2406">#00002406</color>
+ <color name="i_am_color_2407">#00002407</color>
+ <color name="i_am_color_2408">#00002408</color>
+ <color name="i_am_color_2409">#00002409</color>
+ <color name="i_am_color_240a">#0000240a</color>
+ <color name="i_am_color_240b">#0000240b</color>
+ <color name="i_am_color_240c">#0000240c</color>
+ <color name="i_am_color_240d">#0000240d</color>
+ <color name="i_am_color_240e">#0000240e</color>
+ <color name="i_am_color_240f">#0000240f</color>
+ <color name="i_am_color_2410">#00002410</color>
+ <color name="i_am_color_2411">#00002411</color>
+ <color name="i_am_color_2412">#00002412</color>
+ <color name="i_am_color_2413">#00002413</color>
+ <color name="i_am_color_2414">#00002414</color>
+ <color name="i_am_color_2415">#00002415</color>
+ <color name="i_am_color_2416">#00002416</color>
+ <color name="i_am_color_2417">#00002417</color>
+ <color name="i_am_color_2418">#00002418</color>
+ <color name="i_am_color_2419">#00002419</color>
+ <color name="i_am_color_241a">#0000241a</color>
+ <color name="i_am_color_241b">#0000241b</color>
+ <color name="i_am_color_241c">#0000241c</color>
+ <color name="i_am_color_241d">#0000241d</color>
+ <color name="i_am_color_241e">#0000241e</color>
+ <color name="i_am_color_241f">#0000241f</color>
+ <color name="i_am_color_2420">#00002420</color>
+ <color name="i_am_color_2421">#00002421</color>
+ <color name="i_am_color_2422">#00002422</color>
+ <color name="i_am_color_2423">#00002423</color>
+ <color name="i_am_color_2424">#00002424</color>
+ <color name="i_am_color_2425">#00002425</color>
+ <color name="i_am_color_2426">#00002426</color>
+ <color name="i_am_color_2427">#00002427</color>
+ <color name="i_am_color_2428">#00002428</color>
+ <color name="i_am_color_2429">#00002429</color>
+ <color name="i_am_color_242a">#0000242a</color>
+ <color name="i_am_color_242b">#0000242b</color>
+ <color name="i_am_color_242c">#0000242c</color>
+ <color name="i_am_color_242d">#0000242d</color>
+ <color name="i_am_color_242e">#0000242e</color>
+ <color name="i_am_color_242f">#0000242f</color>
+ <color name="i_am_color_2430">#00002430</color>
+ <color name="i_am_color_2431">#00002431</color>
+ <color name="i_am_color_2432">#00002432</color>
+ <color name="i_am_color_2433">#00002433</color>
+ <color name="i_am_color_2434">#00002434</color>
+ <color name="i_am_color_2435">#00002435</color>
+ <color name="i_am_color_2436">#00002436</color>
+ <color name="i_am_color_2437">#00002437</color>
+ <color name="i_am_color_2438">#00002438</color>
+ <color name="i_am_color_2439">#00002439</color>
+ <color name="i_am_color_243a">#0000243a</color>
+ <color name="i_am_color_243b">#0000243b</color>
+ <color name="i_am_color_243c">#0000243c</color>
+ <color name="i_am_color_243d">#0000243d</color>
+ <color name="i_am_color_243e">#0000243e</color>
+ <color name="i_am_color_243f">#0000243f</color>
+ <color name="i_am_color_2440">#00002440</color>
+ <color name="i_am_color_2441">#00002441</color>
+ <color name="i_am_color_2442">#00002442</color>
+ <color name="i_am_color_2443">#00002443</color>
+ <color name="i_am_color_2444">#00002444</color>
+ <color name="i_am_color_2445">#00002445</color>
+ <color name="i_am_color_2446">#00002446</color>
+ <color name="i_am_color_2447">#00002447</color>
+ <color name="i_am_color_2448">#00002448</color>
+ <color name="i_am_color_2449">#00002449</color>
+ <color name="i_am_color_244a">#0000244a</color>
+ <color name="i_am_color_244b">#0000244b</color>
+ <color name="i_am_color_244c">#0000244c</color>
+ <color name="i_am_color_244d">#0000244d</color>
+ <color name="i_am_color_244e">#0000244e</color>
+ <color name="i_am_color_244f">#0000244f</color>
+ <color name="i_am_color_2450">#00002450</color>
+ <color name="i_am_color_2451">#00002451</color>
+ <color name="i_am_color_2452">#00002452</color>
+ <color name="i_am_color_2453">#00002453</color>
+ <color name="i_am_color_2454">#00002454</color>
+ <color name="i_am_color_2455">#00002455</color>
+ <color name="i_am_color_2456">#00002456</color>
+ <color name="i_am_color_2457">#00002457</color>
+ <color name="i_am_color_2458">#00002458</color>
+ <color name="i_am_color_2459">#00002459</color>
+ <color name="i_am_color_245a">#0000245a</color>
+ <color name="i_am_color_245b">#0000245b</color>
+ <color name="i_am_color_245c">#0000245c</color>
+ <color name="i_am_color_245d">#0000245d</color>
+ <color name="i_am_color_245e">#0000245e</color>
+ <color name="i_am_color_245f">#0000245f</color>
+ <color name="i_am_color_2460">#00002460</color>
+ <color name="i_am_color_2461">#00002461</color>
+ <color name="i_am_color_2462">#00002462</color>
+ <color name="i_am_color_2463">#00002463</color>
+ <color name="i_am_color_2464">#00002464</color>
+ <color name="i_am_color_2465">#00002465</color>
+ <color name="i_am_color_2466">#00002466</color>
+ <color name="i_am_color_2467">#00002467</color>
+ <color name="i_am_color_2468">#00002468</color>
+ <color name="i_am_color_2469">#00002469</color>
+ <color name="i_am_color_246a">#0000246a</color>
+ <color name="i_am_color_246b">#0000246b</color>
+ <color name="i_am_color_246c">#0000246c</color>
+ <color name="i_am_color_246d">#0000246d</color>
+ <color name="i_am_color_246e">#0000246e</color>
+ <color name="i_am_color_246f">#0000246f</color>
+ <color name="i_am_color_2470">#00002470</color>
+ <color name="i_am_color_2471">#00002471</color>
+ <color name="i_am_color_2472">#00002472</color>
+ <color name="i_am_color_2473">#00002473</color>
+ <color name="i_am_color_2474">#00002474</color>
+ <color name="i_am_color_2475">#00002475</color>
+ <color name="i_am_color_2476">#00002476</color>
+ <color name="i_am_color_2477">#00002477</color>
+ <color name="i_am_color_2478">#00002478</color>
+ <color name="i_am_color_2479">#00002479</color>
+ <color name="i_am_color_247a">#0000247a</color>
+ <color name="i_am_color_247b">#0000247b</color>
+ <color name="i_am_color_247c">#0000247c</color>
+ <color name="i_am_color_247d">#0000247d</color>
+ <color name="i_am_color_247e">#0000247e</color>
+ <color name="i_am_color_247f">#0000247f</color>
+ <color name="i_am_color_2480">#00002480</color>
+ <color name="i_am_color_2481">#00002481</color>
+ <color name="i_am_color_2482">#00002482</color>
+ <color name="i_am_color_2483">#00002483</color>
+ <color name="i_am_color_2484">#00002484</color>
+ <color name="i_am_color_2485">#00002485</color>
+ <color name="i_am_color_2486">#00002486</color>
+ <color name="i_am_color_2487">#00002487</color>
+ <color name="i_am_color_2488">#00002488</color>
+ <color name="i_am_color_2489">#00002489</color>
+ <color name="i_am_color_248a">#0000248a</color>
+ <color name="i_am_color_248b">#0000248b</color>
+ <color name="i_am_color_248c">#0000248c</color>
+ <color name="i_am_color_248d">#0000248d</color>
+ <color name="i_am_color_248e">#0000248e</color>
+ <color name="i_am_color_248f">#0000248f</color>
+ <color name="i_am_color_2490">#00002490</color>
+ <color name="i_am_color_2491">#00002491</color>
+ <color name="i_am_color_2492">#00002492</color>
+ <color name="i_am_color_2493">#00002493</color>
+ <color name="i_am_color_2494">#00002494</color>
+ <color name="i_am_color_2495">#00002495</color>
+ <color name="i_am_color_2496">#00002496</color>
+ <color name="i_am_color_2497">#00002497</color>
+ <color name="i_am_color_2498">#00002498</color>
+ <color name="i_am_color_2499">#00002499</color>
+ <color name="i_am_color_249a">#0000249a</color>
+ <color name="i_am_color_249b">#0000249b</color>
+ <color name="i_am_color_249c">#0000249c</color>
+ <color name="i_am_color_249d">#0000249d</color>
+ <color name="i_am_color_249e">#0000249e</color>
+ <color name="i_am_color_249f">#0000249f</color>
+ <color name="i_am_color_24a0">#000024a0</color>
+ <color name="i_am_color_24a1">#000024a1</color>
+ <color name="i_am_color_24a2">#000024a2</color>
+ <color name="i_am_color_24a3">#000024a3</color>
+ <color name="i_am_color_24a4">#000024a4</color>
+ <color name="i_am_color_24a5">#000024a5</color>
+ <color name="i_am_color_24a6">#000024a6</color>
+ <color name="i_am_color_24a7">#000024a7</color>
+ <color name="i_am_color_24a8">#000024a8</color>
+ <color name="i_am_color_24a9">#000024a9</color>
+ <color name="i_am_color_24aa">#000024aa</color>
+ <color name="i_am_color_24ab">#000024ab</color>
+ <color name="i_am_color_24ac">#000024ac</color>
+ <color name="i_am_color_24ad">#000024ad</color>
+ <color name="i_am_color_24ae">#000024ae</color>
+ <color name="i_am_color_24af">#000024af</color>
+ <color name="i_am_color_24b0">#000024b0</color>
+ <color name="i_am_color_24b1">#000024b1</color>
+ <color name="i_am_color_24b2">#000024b2</color>
+ <color name="i_am_color_24b3">#000024b3</color>
+ <color name="i_am_color_24b4">#000024b4</color>
+ <color name="i_am_color_24b5">#000024b5</color>
+ <color name="i_am_color_24b6">#000024b6</color>
+ <color name="i_am_color_24b7">#000024b7</color>
+ <color name="i_am_color_24b8">#000024b8</color>
+ <color name="i_am_color_24b9">#000024b9</color>
+ <color name="i_am_color_24ba">#000024ba</color>
+ <color name="i_am_color_24bb">#000024bb</color>
+ <color name="i_am_color_24bc">#000024bc</color>
+ <color name="i_am_color_24bd">#000024bd</color>
+ <color name="i_am_color_24be">#000024be</color>
+ <color name="i_am_color_24bf">#000024bf</color>
+ <color name="i_am_color_24c0">#000024c0</color>
+ <color name="i_am_color_24c1">#000024c1</color>
+ <color name="i_am_color_24c2">#000024c2</color>
+ <color name="i_am_color_24c3">#000024c3</color>
+ <color name="i_am_color_24c4">#000024c4</color>
+ <color name="i_am_color_24c5">#000024c5</color>
+ <color name="i_am_color_24c6">#000024c6</color>
+ <color name="i_am_color_24c7">#000024c7</color>
+ <color name="i_am_color_24c8">#000024c8</color>
+ <color name="i_am_color_24c9">#000024c9</color>
+ <color name="i_am_color_24ca">#000024ca</color>
+ <color name="i_am_color_24cb">#000024cb</color>
+ <color name="i_am_color_24cc">#000024cc</color>
+ <color name="i_am_color_24cd">#000024cd</color>
+ <color name="i_am_color_24ce">#000024ce</color>
+ <color name="i_am_color_24cf">#000024cf</color>
+ <color name="i_am_color_24d0">#000024d0</color>
+ <color name="i_am_color_24d1">#000024d1</color>
+ <color name="i_am_color_24d2">#000024d2</color>
+ <color name="i_am_color_24d3">#000024d3</color>
+ <color name="i_am_color_24d4">#000024d4</color>
+ <color name="i_am_color_24d5">#000024d5</color>
+ <color name="i_am_color_24d6">#000024d6</color>
+ <color name="i_am_color_24d7">#000024d7</color>
+ <color name="i_am_color_24d8">#000024d8</color>
+ <color name="i_am_color_24d9">#000024d9</color>
+ <color name="i_am_color_24da">#000024da</color>
+ <color name="i_am_color_24db">#000024db</color>
+ <color name="i_am_color_24dc">#000024dc</color>
+ <color name="i_am_color_24dd">#000024dd</color>
+ <color name="i_am_color_24de">#000024de</color>
+ <color name="i_am_color_24df">#000024df</color>
+ <color name="i_am_color_24e0">#000024e0</color>
+ <color name="i_am_color_24e1">#000024e1</color>
+ <color name="i_am_color_24e2">#000024e2</color>
+ <color name="i_am_color_24e3">#000024e3</color>
+ <color name="i_am_color_24e4">#000024e4</color>
+ <color name="i_am_color_24e5">#000024e5</color>
+ <color name="i_am_color_24e6">#000024e6</color>
+ <color name="i_am_color_24e7">#000024e7</color>
+ <color name="i_am_color_24e8">#000024e8</color>
+ <color name="i_am_color_24e9">#000024e9</color>
+ <color name="i_am_color_24ea">#000024ea</color>
+ <color name="i_am_color_24eb">#000024eb</color>
+ <color name="i_am_color_24ec">#000024ec</color>
+ <color name="i_am_color_24ed">#000024ed</color>
+ <color name="i_am_color_24ee">#000024ee</color>
+ <color name="i_am_color_24ef">#000024ef</color>
+ <color name="i_am_color_24f0">#000024f0</color>
+ <color name="i_am_color_24f1">#000024f1</color>
+ <color name="i_am_color_24f2">#000024f2</color>
+ <color name="i_am_color_24f3">#000024f3</color>
+ <color name="i_am_color_24f4">#000024f4</color>
+ <color name="i_am_color_24f5">#000024f5</color>
+ <color name="i_am_color_24f6">#000024f6</color>
+ <color name="i_am_color_24f7">#000024f7</color>
+ <color name="i_am_color_24f8">#000024f8</color>
+ <color name="i_am_color_24f9">#000024f9</color>
+ <color name="i_am_color_24fa">#000024fa</color>
+ <color name="i_am_color_24fb">#000024fb</color>
+ <color name="i_am_color_24fc">#000024fc</color>
+ <color name="i_am_color_24fd">#000024fd</color>
+ <color name="i_am_color_24fe">#000024fe</color>
+ <color name="i_am_color_24ff">#000024ff</color>
+ <color name="i_am_color_2500">#00002500</color>
+ <color name="i_am_color_2501">#00002501</color>
+ <color name="i_am_color_2502">#00002502</color>
+ <color name="i_am_color_2503">#00002503</color>
+ <color name="i_am_color_2504">#00002504</color>
+ <color name="i_am_color_2505">#00002505</color>
+ <color name="i_am_color_2506">#00002506</color>
+ <color name="i_am_color_2507">#00002507</color>
+ <color name="i_am_color_2508">#00002508</color>
+ <color name="i_am_color_2509">#00002509</color>
+ <color name="i_am_color_250a">#0000250a</color>
+ <color name="i_am_color_250b">#0000250b</color>
+ <color name="i_am_color_250c">#0000250c</color>
+ <color name="i_am_color_250d">#0000250d</color>
+ <color name="i_am_color_250e">#0000250e</color>
+ <color name="i_am_color_250f">#0000250f</color>
+ <color name="i_am_color_2510">#00002510</color>
+ <color name="i_am_color_2511">#00002511</color>
+ <color name="i_am_color_2512">#00002512</color>
+ <color name="i_am_color_2513">#00002513</color>
+ <color name="i_am_color_2514">#00002514</color>
+ <color name="i_am_color_2515">#00002515</color>
+ <color name="i_am_color_2516">#00002516</color>
+ <color name="i_am_color_2517">#00002517</color>
+ <color name="i_am_color_2518">#00002518</color>
+ <color name="i_am_color_2519">#00002519</color>
+ <color name="i_am_color_251a">#0000251a</color>
+ <color name="i_am_color_251b">#0000251b</color>
+ <color name="i_am_color_251c">#0000251c</color>
+ <color name="i_am_color_251d">#0000251d</color>
+ <color name="i_am_color_251e">#0000251e</color>
+ <color name="i_am_color_251f">#0000251f</color>
+ <color name="i_am_color_2520">#00002520</color>
+ <color name="i_am_color_2521">#00002521</color>
+ <color name="i_am_color_2522">#00002522</color>
+ <color name="i_am_color_2523">#00002523</color>
+ <color name="i_am_color_2524">#00002524</color>
+ <color name="i_am_color_2525">#00002525</color>
+ <color name="i_am_color_2526">#00002526</color>
+ <color name="i_am_color_2527">#00002527</color>
+ <color name="i_am_color_2528">#00002528</color>
+ <color name="i_am_color_2529">#00002529</color>
+ <color name="i_am_color_252a">#0000252a</color>
+ <color name="i_am_color_252b">#0000252b</color>
+ <color name="i_am_color_252c">#0000252c</color>
+ <color name="i_am_color_252d">#0000252d</color>
+ <color name="i_am_color_252e">#0000252e</color>
+ <color name="i_am_color_252f">#0000252f</color>
+ <color name="i_am_color_2530">#00002530</color>
+ <color name="i_am_color_2531">#00002531</color>
+ <color name="i_am_color_2532">#00002532</color>
+ <color name="i_am_color_2533">#00002533</color>
+ <color name="i_am_color_2534">#00002534</color>
+ <color name="i_am_color_2535">#00002535</color>
+ <color name="i_am_color_2536">#00002536</color>
+ <color name="i_am_color_2537">#00002537</color>
+ <color name="i_am_color_2538">#00002538</color>
+ <color name="i_am_color_2539">#00002539</color>
+ <color name="i_am_color_253a">#0000253a</color>
+ <color name="i_am_color_253b">#0000253b</color>
+ <color name="i_am_color_253c">#0000253c</color>
+ <color name="i_am_color_253d">#0000253d</color>
+ <color name="i_am_color_253e">#0000253e</color>
+ <color name="i_am_color_253f">#0000253f</color>
+ <color name="i_am_color_2540">#00002540</color>
+ <color name="i_am_color_2541">#00002541</color>
+ <color name="i_am_color_2542">#00002542</color>
+ <color name="i_am_color_2543">#00002543</color>
+ <color name="i_am_color_2544">#00002544</color>
+ <color name="i_am_color_2545">#00002545</color>
+ <color name="i_am_color_2546">#00002546</color>
+ <color name="i_am_color_2547">#00002547</color>
+ <color name="i_am_color_2548">#00002548</color>
+ <color name="i_am_color_2549">#00002549</color>
+ <color name="i_am_color_254a">#0000254a</color>
+ <color name="i_am_color_254b">#0000254b</color>
+ <color name="i_am_color_254c">#0000254c</color>
+ <color name="i_am_color_254d">#0000254d</color>
+ <color name="i_am_color_254e">#0000254e</color>
+ <color name="i_am_color_254f">#0000254f</color>
+ <color name="i_am_color_2550">#00002550</color>
+ <color name="i_am_color_2551">#00002551</color>
+ <color name="i_am_color_2552">#00002552</color>
+ <color name="i_am_color_2553">#00002553</color>
+ <color name="i_am_color_2554">#00002554</color>
+ <color name="i_am_color_2555">#00002555</color>
+ <color name="i_am_color_2556">#00002556</color>
+ <color name="i_am_color_2557">#00002557</color>
+ <color name="i_am_color_2558">#00002558</color>
+ <color name="i_am_color_2559">#00002559</color>
+ <color name="i_am_color_255a">#0000255a</color>
+ <color name="i_am_color_255b">#0000255b</color>
+ <color name="i_am_color_255c">#0000255c</color>
+ <color name="i_am_color_255d">#0000255d</color>
+ <color name="i_am_color_255e">#0000255e</color>
+ <color name="i_am_color_255f">#0000255f</color>
+ <color name="i_am_color_2560">#00002560</color>
+ <color name="i_am_color_2561">#00002561</color>
+ <color name="i_am_color_2562">#00002562</color>
+ <color name="i_am_color_2563">#00002563</color>
+ <color name="i_am_color_2564">#00002564</color>
+ <color name="i_am_color_2565">#00002565</color>
+ <color name="i_am_color_2566">#00002566</color>
+ <color name="i_am_color_2567">#00002567</color>
+ <color name="i_am_color_2568">#00002568</color>
+ <color name="i_am_color_2569">#00002569</color>
+ <color name="i_am_color_256a">#0000256a</color>
+ <color name="i_am_color_256b">#0000256b</color>
+ <color name="i_am_color_256c">#0000256c</color>
+ <color name="i_am_color_256d">#0000256d</color>
+ <color name="i_am_color_256e">#0000256e</color>
+ <color name="i_am_color_256f">#0000256f</color>
+ <color name="i_am_color_2570">#00002570</color>
+ <color name="i_am_color_2571">#00002571</color>
+ <color name="i_am_color_2572">#00002572</color>
+ <color name="i_am_color_2573">#00002573</color>
+ <color name="i_am_color_2574">#00002574</color>
+ <color name="i_am_color_2575">#00002575</color>
+ <color name="i_am_color_2576">#00002576</color>
+ <color name="i_am_color_2577">#00002577</color>
+ <color name="i_am_color_2578">#00002578</color>
+ <color name="i_am_color_2579">#00002579</color>
+ <color name="i_am_color_257a">#0000257a</color>
+ <color name="i_am_color_257b">#0000257b</color>
+ <color name="i_am_color_257c">#0000257c</color>
+ <color name="i_am_color_257d">#0000257d</color>
+ <color name="i_am_color_257e">#0000257e</color>
+ <color name="i_am_color_257f">#0000257f</color>
+ <color name="i_am_color_2580">#00002580</color>
+ <color name="i_am_color_2581">#00002581</color>
+ <color name="i_am_color_2582">#00002582</color>
+ <color name="i_am_color_2583">#00002583</color>
+ <color name="i_am_color_2584">#00002584</color>
+ <color name="i_am_color_2585">#00002585</color>
+ <color name="i_am_color_2586">#00002586</color>
+ <color name="i_am_color_2587">#00002587</color>
+ <color name="i_am_color_2588">#00002588</color>
+ <color name="i_am_color_2589">#00002589</color>
+ <color name="i_am_color_258a">#0000258a</color>
+ <color name="i_am_color_258b">#0000258b</color>
+ <color name="i_am_color_258c">#0000258c</color>
+ <color name="i_am_color_258d">#0000258d</color>
+ <color name="i_am_color_258e">#0000258e</color>
+ <color name="i_am_color_258f">#0000258f</color>
+ <color name="i_am_color_2590">#00002590</color>
+ <color name="i_am_color_2591">#00002591</color>
+ <color name="i_am_color_2592">#00002592</color>
+ <color name="i_am_color_2593">#00002593</color>
+ <color name="i_am_color_2594">#00002594</color>
+ <color name="i_am_color_2595">#00002595</color>
+ <color name="i_am_color_2596">#00002596</color>
+ <color name="i_am_color_2597">#00002597</color>
+ <color name="i_am_color_2598">#00002598</color>
+ <color name="i_am_color_2599">#00002599</color>
+ <color name="i_am_color_259a">#0000259a</color>
+ <color name="i_am_color_259b">#0000259b</color>
+ <color name="i_am_color_259c">#0000259c</color>
+ <color name="i_am_color_259d">#0000259d</color>
+ <color name="i_am_color_259e">#0000259e</color>
+ <color name="i_am_color_259f">#0000259f</color>
+ <color name="i_am_color_25a0">#000025a0</color>
+ <color name="i_am_color_25a1">#000025a1</color>
+ <color name="i_am_color_25a2">#000025a2</color>
+ <color name="i_am_color_25a3">#000025a3</color>
+ <color name="i_am_color_25a4">#000025a4</color>
+ <color name="i_am_color_25a5">#000025a5</color>
+ <color name="i_am_color_25a6">#000025a6</color>
+ <color name="i_am_color_25a7">#000025a7</color>
+ <color name="i_am_color_25a8">#000025a8</color>
+ <color name="i_am_color_25a9">#000025a9</color>
+ <color name="i_am_color_25aa">#000025aa</color>
+ <color name="i_am_color_25ab">#000025ab</color>
+ <color name="i_am_color_25ac">#000025ac</color>
+ <color name="i_am_color_25ad">#000025ad</color>
+ <color name="i_am_color_25ae">#000025ae</color>
+ <color name="i_am_color_25af">#000025af</color>
+ <color name="i_am_color_25b0">#000025b0</color>
+ <color name="i_am_color_25b1">#000025b1</color>
+ <color name="i_am_color_25b2">#000025b2</color>
+ <color name="i_am_color_25b3">#000025b3</color>
+ <color name="i_am_color_25b4">#000025b4</color>
+ <color name="i_am_color_25b5">#000025b5</color>
+ <color name="i_am_color_25b6">#000025b6</color>
+ <color name="i_am_color_25b7">#000025b7</color>
+ <color name="i_am_color_25b8">#000025b8</color>
+ <color name="i_am_color_25b9">#000025b9</color>
+ <color name="i_am_color_25ba">#000025ba</color>
+ <color name="i_am_color_25bb">#000025bb</color>
+ <color name="i_am_color_25bc">#000025bc</color>
+ <color name="i_am_color_25bd">#000025bd</color>
+ <color name="i_am_color_25be">#000025be</color>
+ <color name="i_am_color_25bf">#000025bf</color>
+ <color name="i_am_color_25c0">#000025c0</color>
+ <color name="i_am_color_25c1">#000025c1</color>
+ <color name="i_am_color_25c2">#000025c2</color>
+ <color name="i_am_color_25c3">#000025c3</color>
+ <color name="i_am_color_25c4">#000025c4</color>
+ <color name="i_am_color_25c5">#000025c5</color>
+ <color name="i_am_color_25c6">#000025c6</color>
+ <color name="i_am_color_25c7">#000025c7</color>
+ <color name="i_am_color_25c8">#000025c8</color>
+ <color name="i_am_color_25c9">#000025c9</color>
+ <color name="i_am_color_25ca">#000025ca</color>
+ <color name="i_am_color_25cb">#000025cb</color>
+ <color name="i_am_color_25cc">#000025cc</color>
+ <color name="i_am_color_25cd">#000025cd</color>
+ <color name="i_am_color_25ce">#000025ce</color>
+ <color name="i_am_color_25cf">#000025cf</color>
+ <color name="i_am_color_25d0">#000025d0</color>
+ <color name="i_am_color_25d1">#000025d1</color>
+ <color name="i_am_color_25d2">#000025d2</color>
+ <color name="i_am_color_25d3">#000025d3</color>
+ <color name="i_am_color_25d4">#000025d4</color>
+ <color name="i_am_color_25d5">#000025d5</color>
+ <color name="i_am_color_25d6">#000025d6</color>
+ <color name="i_am_color_25d7">#000025d7</color>
+ <color name="i_am_color_25d8">#000025d8</color>
+ <color name="i_am_color_25d9">#000025d9</color>
+ <color name="i_am_color_25da">#000025da</color>
+ <color name="i_am_color_25db">#000025db</color>
+ <color name="i_am_color_25dc">#000025dc</color>
+ <color name="i_am_color_25dd">#000025dd</color>
+ <color name="i_am_color_25de">#000025de</color>
+ <color name="i_am_color_25df">#000025df</color>
+ <color name="i_am_color_25e0">#000025e0</color>
+ <color name="i_am_color_25e1">#000025e1</color>
+ <color name="i_am_color_25e2">#000025e2</color>
+ <color name="i_am_color_25e3">#000025e3</color>
+ <color name="i_am_color_25e4">#000025e4</color>
+ <color name="i_am_color_25e5">#000025e5</color>
+ <color name="i_am_color_25e6">#000025e6</color>
+ <color name="i_am_color_25e7">#000025e7</color>
+ <color name="i_am_color_25e8">#000025e8</color>
+ <color name="i_am_color_25e9">#000025e9</color>
+ <color name="i_am_color_25ea">#000025ea</color>
+ <color name="i_am_color_25eb">#000025eb</color>
+ <color name="i_am_color_25ec">#000025ec</color>
+ <color name="i_am_color_25ed">#000025ed</color>
+ <color name="i_am_color_25ee">#000025ee</color>
+ <color name="i_am_color_25ef">#000025ef</color>
+ <color name="i_am_color_25f0">#000025f0</color>
+ <color name="i_am_color_25f1">#000025f1</color>
+ <color name="i_am_color_25f2">#000025f2</color>
+ <color name="i_am_color_25f3">#000025f3</color>
+ <color name="i_am_color_25f4">#000025f4</color>
+ <color name="i_am_color_25f5">#000025f5</color>
+ <color name="i_am_color_25f6">#000025f6</color>
+ <color name="i_am_color_25f7">#000025f7</color>
+ <color name="i_am_color_25f8">#000025f8</color>
+ <color name="i_am_color_25f9">#000025f9</color>
+ <color name="i_am_color_25fa">#000025fa</color>
+ <color name="i_am_color_25fb">#000025fb</color>
+ <color name="i_am_color_25fc">#000025fc</color>
+ <color name="i_am_color_25fd">#000025fd</color>
+ <color name="i_am_color_25fe">#000025fe</color>
+ <color name="i_am_color_25ff">#000025ff</color>
+ <color name="i_am_color_2600">#00002600</color>
+ <color name="i_am_color_2601">#00002601</color>
+ <color name="i_am_color_2602">#00002602</color>
+ <color name="i_am_color_2603">#00002603</color>
+ <color name="i_am_color_2604">#00002604</color>
+ <color name="i_am_color_2605">#00002605</color>
+ <color name="i_am_color_2606">#00002606</color>
+ <color name="i_am_color_2607">#00002607</color>
+ <color name="i_am_color_2608">#00002608</color>
+ <color name="i_am_color_2609">#00002609</color>
+ <color name="i_am_color_260a">#0000260a</color>
+ <color name="i_am_color_260b">#0000260b</color>
+ <color name="i_am_color_260c">#0000260c</color>
+ <color name="i_am_color_260d">#0000260d</color>
+ <color name="i_am_color_260e">#0000260e</color>
+ <color name="i_am_color_260f">#0000260f</color>
+ <color name="i_am_color_2610">#00002610</color>
+ <color name="i_am_color_2611">#00002611</color>
+ <color name="i_am_color_2612">#00002612</color>
+ <color name="i_am_color_2613">#00002613</color>
+ <color name="i_am_color_2614">#00002614</color>
+ <color name="i_am_color_2615">#00002615</color>
+ <color name="i_am_color_2616">#00002616</color>
+ <color name="i_am_color_2617">#00002617</color>
+ <color name="i_am_color_2618">#00002618</color>
+ <color name="i_am_color_2619">#00002619</color>
+ <color name="i_am_color_261a">#0000261a</color>
+ <color name="i_am_color_261b">#0000261b</color>
+ <color name="i_am_color_261c">#0000261c</color>
+ <color name="i_am_color_261d">#0000261d</color>
+ <color name="i_am_color_261e">#0000261e</color>
+ <color name="i_am_color_261f">#0000261f</color>
+ <color name="i_am_color_2620">#00002620</color>
+ <color name="i_am_color_2621">#00002621</color>
+ <color name="i_am_color_2622">#00002622</color>
+ <color name="i_am_color_2623">#00002623</color>
+ <color name="i_am_color_2624">#00002624</color>
+ <color name="i_am_color_2625">#00002625</color>
+ <color name="i_am_color_2626">#00002626</color>
+ <color name="i_am_color_2627">#00002627</color>
+ <color name="i_am_color_2628">#00002628</color>
+ <color name="i_am_color_2629">#00002629</color>
+ <color name="i_am_color_262a">#0000262a</color>
+ <color name="i_am_color_262b">#0000262b</color>
+ <color name="i_am_color_262c">#0000262c</color>
+ <color name="i_am_color_262d">#0000262d</color>
+ <color name="i_am_color_262e">#0000262e</color>
+ <color name="i_am_color_262f">#0000262f</color>
+ <color name="i_am_color_2630">#00002630</color>
+ <color name="i_am_color_2631">#00002631</color>
+ <color name="i_am_color_2632">#00002632</color>
+ <color name="i_am_color_2633">#00002633</color>
+ <color name="i_am_color_2634">#00002634</color>
+ <color name="i_am_color_2635">#00002635</color>
+ <color name="i_am_color_2636">#00002636</color>
+ <color name="i_am_color_2637">#00002637</color>
+ <color name="i_am_color_2638">#00002638</color>
+ <color name="i_am_color_2639">#00002639</color>
+ <color name="i_am_color_263a">#0000263a</color>
+ <color name="i_am_color_263b">#0000263b</color>
+ <color name="i_am_color_263c">#0000263c</color>
+ <color name="i_am_color_263d">#0000263d</color>
+ <color name="i_am_color_263e">#0000263e</color>
+ <color name="i_am_color_263f">#0000263f</color>
+ <color name="i_am_color_2640">#00002640</color>
+ <color name="i_am_color_2641">#00002641</color>
+ <color name="i_am_color_2642">#00002642</color>
+ <color name="i_am_color_2643">#00002643</color>
+ <color name="i_am_color_2644">#00002644</color>
+ <color name="i_am_color_2645">#00002645</color>
+ <color name="i_am_color_2646">#00002646</color>
+ <color name="i_am_color_2647">#00002647</color>
+ <color name="i_am_color_2648">#00002648</color>
+ <color name="i_am_color_2649">#00002649</color>
+ <color name="i_am_color_264a">#0000264a</color>
+ <color name="i_am_color_264b">#0000264b</color>
+ <color name="i_am_color_264c">#0000264c</color>
+ <color name="i_am_color_264d">#0000264d</color>
+ <color name="i_am_color_264e">#0000264e</color>
+ <color name="i_am_color_264f">#0000264f</color>
+ <color name="i_am_color_2650">#00002650</color>
+ <color name="i_am_color_2651">#00002651</color>
+ <color name="i_am_color_2652">#00002652</color>
+ <color name="i_am_color_2653">#00002653</color>
+ <color name="i_am_color_2654">#00002654</color>
+ <color name="i_am_color_2655">#00002655</color>
+ <color name="i_am_color_2656">#00002656</color>
+ <color name="i_am_color_2657">#00002657</color>
+ <color name="i_am_color_2658">#00002658</color>
+ <color name="i_am_color_2659">#00002659</color>
+ <color name="i_am_color_265a">#0000265a</color>
+ <color name="i_am_color_265b">#0000265b</color>
+ <color name="i_am_color_265c">#0000265c</color>
+ <color name="i_am_color_265d">#0000265d</color>
+ <color name="i_am_color_265e">#0000265e</color>
+ <color name="i_am_color_265f">#0000265f</color>
+ <color name="i_am_color_2660">#00002660</color>
+ <color name="i_am_color_2661">#00002661</color>
+ <color name="i_am_color_2662">#00002662</color>
+ <color name="i_am_color_2663">#00002663</color>
+ <color name="i_am_color_2664">#00002664</color>
+ <color name="i_am_color_2665">#00002665</color>
+ <color name="i_am_color_2666">#00002666</color>
+ <color name="i_am_color_2667">#00002667</color>
+ <color name="i_am_color_2668">#00002668</color>
+ <color name="i_am_color_2669">#00002669</color>
+ <color name="i_am_color_266a">#0000266a</color>
+ <color name="i_am_color_266b">#0000266b</color>
+ <color name="i_am_color_266c">#0000266c</color>
+ <color name="i_am_color_266d">#0000266d</color>
+ <color name="i_am_color_266e">#0000266e</color>
+ <color name="i_am_color_266f">#0000266f</color>
+ <color name="i_am_color_2670">#00002670</color>
+ <color name="i_am_color_2671">#00002671</color>
+ <color name="i_am_color_2672">#00002672</color>
+ <color name="i_am_color_2673">#00002673</color>
+ <color name="i_am_color_2674">#00002674</color>
+ <color name="i_am_color_2675">#00002675</color>
+ <color name="i_am_color_2676">#00002676</color>
+ <color name="i_am_color_2677">#00002677</color>
+ <color name="i_am_color_2678">#00002678</color>
+ <color name="i_am_color_2679">#00002679</color>
+ <color name="i_am_color_267a">#0000267a</color>
+ <color name="i_am_color_267b">#0000267b</color>
+ <color name="i_am_color_267c">#0000267c</color>
+ <color name="i_am_color_267d">#0000267d</color>
+ <color name="i_am_color_267e">#0000267e</color>
+ <color name="i_am_color_267f">#0000267f</color>
+ <color name="i_am_color_2680">#00002680</color>
+ <color name="i_am_color_2681">#00002681</color>
+ <color name="i_am_color_2682">#00002682</color>
+ <color name="i_am_color_2683">#00002683</color>
+ <color name="i_am_color_2684">#00002684</color>
+ <color name="i_am_color_2685">#00002685</color>
+ <color name="i_am_color_2686">#00002686</color>
+ <color name="i_am_color_2687">#00002687</color>
+ <color name="i_am_color_2688">#00002688</color>
+ <color name="i_am_color_2689">#00002689</color>
+ <color name="i_am_color_268a">#0000268a</color>
+ <color name="i_am_color_268b">#0000268b</color>
+ <color name="i_am_color_268c">#0000268c</color>
+ <color name="i_am_color_268d">#0000268d</color>
+ <color name="i_am_color_268e">#0000268e</color>
+ <color name="i_am_color_268f">#0000268f</color>
+ <color name="i_am_color_2690">#00002690</color>
+ <color name="i_am_color_2691">#00002691</color>
+ <color name="i_am_color_2692">#00002692</color>
+ <color name="i_am_color_2693">#00002693</color>
+ <color name="i_am_color_2694">#00002694</color>
+ <color name="i_am_color_2695">#00002695</color>
+ <color name="i_am_color_2696">#00002696</color>
+ <color name="i_am_color_2697">#00002697</color>
+ <color name="i_am_color_2698">#00002698</color>
+ <color name="i_am_color_2699">#00002699</color>
+ <color name="i_am_color_269a">#0000269a</color>
+ <color name="i_am_color_269b">#0000269b</color>
+ <color name="i_am_color_269c">#0000269c</color>
+ <color name="i_am_color_269d">#0000269d</color>
+ <color name="i_am_color_269e">#0000269e</color>
+ <color name="i_am_color_269f">#0000269f</color>
+ <color name="i_am_color_26a0">#000026a0</color>
+ <color name="i_am_color_26a1">#000026a1</color>
+ <color name="i_am_color_26a2">#000026a2</color>
+ <color name="i_am_color_26a3">#000026a3</color>
+ <color name="i_am_color_26a4">#000026a4</color>
+ <color name="i_am_color_26a5">#000026a5</color>
+ <color name="i_am_color_26a6">#000026a6</color>
+ <color name="i_am_color_26a7">#000026a7</color>
+ <color name="i_am_color_26a8">#000026a8</color>
+ <color name="i_am_color_26a9">#000026a9</color>
+ <color name="i_am_color_26aa">#000026aa</color>
+ <color name="i_am_color_26ab">#000026ab</color>
+ <color name="i_am_color_26ac">#000026ac</color>
+ <color name="i_am_color_26ad">#000026ad</color>
+ <color name="i_am_color_26ae">#000026ae</color>
+ <color name="i_am_color_26af">#000026af</color>
+ <color name="i_am_color_26b0">#000026b0</color>
+ <color name="i_am_color_26b1">#000026b1</color>
+ <color name="i_am_color_26b2">#000026b2</color>
+ <color name="i_am_color_26b3">#000026b3</color>
+ <color name="i_am_color_26b4">#000026b4</color>
+ <color name="i_am_color_26b5">#000026b5</color>
+ <color name="i_am_color_26b6">#000026b6</color>
+ <color name="i_am_color_26b7">#000026b7</color>
+ <color name="i_am_color_26b8">#000026b8</color>
+ <color name="i_am_color_26b9">#000026b9</color>
+ <color name="i_am_color_26ba">#000026ba</color>
+ <color name="i_am_color_26bb">#000026bb</color>
+ <color name="i_am_color_26bc">#000026bc</color>
+ <color name="i_am_color_26bd">#000026bd</color>
+ <color name="i_am_color_26be">#000026be</color>
+ <color name="i_am_color_26bf">#000026bf</color>
+ <color name="i_am_color_26c0">#000026c0</color>
+ <color name="i_am_color_26c1">#000026c1</color>
+ <color name="i_am_color_26c2">#000026c2</color>
+ <color name="i_am_color_26c3">#000026c3</color>
+ <color name="i_am_color_26c4">#000026c4</color>
+ <color name="i_am_color_26c5">#000026c5</color>
+ <color name="i_am_color_26c6">#000026c6</color>
+ <color name="i_am_color_26c7">#000026c7</color>
+ <color name="i_am_color_26c8">#000026c8</color>
+ <color name="i_am_color_26c9">#000026c9</color>
+ <color name="i_am_color_26ca">#000026ca</color>
+ <color name="i_am_color_26cb">#000026cb</color>
+ <color name="i_am_color_26cc">#000026cc</color>
+ <color name="i_am_color_26cd">#000026cd</color>
+ <color name="i_am_color_26ce">#000026ce</color>
+ <color name="i_am_color_26cf">#000026cf</color>
+ <color name="i_am_color_26d0">#000026d0</color>
+ <color name="i_am_color_26d1">#000026d1</color>
+ <color name="i_am_color_26d2">#000026d2</color>
+ <color name="i_am_color_26d3">#000026d3</color>
+ <color name="i_am_color_26d4">#000026d4</color>
+ <color name="i_am_color_26d5">#000026d5</color>
+ <color name="i_am_color_26d6">#000026d6</color>
+ <color name="i_am_color_26d7">#000026d7</color>
+ <color name="i_am_color_26d8">#000026d8</color>
+ <color name="i_am_color_26d9">#000026d9</color>
+ <color name="i_am_color_26da">#000026da</color>
+ <color name="i_am_color_26db">#000026db</color>
+ <color name="i_am_color_26dc">#000026dc</color>
+ <color name="i_am_color_26dd">#000026dd</color>
+ <color name="i_am_color_26de">#000026de</color>
+ <color name="i_am_color_26df">#000026df</color>
+ <color name="i_am_color_26e0">#000026e0</color>
+ <color name="i_am_color_26e1">#000026e1</color>
+ <color name="i_am_color_26e2">#000026e2</color>
+ <color name="i_am_color_26e3">#000026e3</color>
+ <color name="i_am_color_26e4">#000026e4</color>
+ <color name="i_am_color_26e5">#000026e5</color>
+ <color name="i_am_color_26e6">#000026e6</color>
+ <color name="i_am_color_26e7">#000026e7</color>
+ <color name="i_am_color_26e8">#000026e8</color>
+ <color name="i_am_color_26e9">#000026e9</color>
+ <color name="i_am_color_26ea">#000026ea</color>
+ <color name="i_am_color_26eb">#000026eb</color>
+ <color name="i_am_color_26ec">#000026ec</color>
+ <color name="i_am_color_26ed">#000026ed</color>
+ <color name="i_am_color_26ee">#000026ee</color>
+ <color name="i_am_color_26ef">#000026ef</color>
+ <color name="i_am_color_26f0">#000026f0</color>
+ <color name="i_am_color_26f1">#000026f1</color>
+ <color name="i_am_color_26f2">#000026f2</color>
+ <color name="i_am_color_26f3">#000026f3</color>
+ <color name="i_am_color_26f4">#000026f4</color>
+ <color name="i_am_color_26f5">#000026f5</color>
+ <color name="i_am_color_26f6">#000026f6</color>
+ <color name="i_am_color_26f7">#000026f7</color>
+ <color name="i_am_color_26f8">#000026f8</color>
+ <color name="i_am_color_26f9">#000026f9</color>
+ <color name="i_am_color_26fa">#000026fa</color>
+ <color name="i_am_color_26fb">#000026fb</color>
+ <color name="i_am_color_26fc">#000026fc</color>
+ <color name="i_am_color_26fd">#000026fd</color>
+ <color name="i_am_color_26fe">#000026fe</color>
+ <color name="i_am_color_26ff">#000026ff</color>
+ <color name="i_am_color_2700">#00002700</color>
+ <color name="i_am_color_2701">#00002701</color>
+ <color name="i_am_color_2702">#00002702</color>
+ <color name="i_am_color_2703">#00002703</color>
+ <color name="i_am_color_2704">#00002704</color>
+ <color name="i_am_color_2705">#00002705</color>
+ <color name="i_am_color_2706">#00002706</color>
+ <color name="i_am_color_2707">#00002707</color>
+ <color name="i_am_color_2708">#00002708</color>
+ <color name="i_am_color_2709">#00002709</color>
+ <color name="i_am_color_270a">#0000270a</color>
+ <color name="i_am_color_270b">#0000270b</color>
+ <color name="i_am_color_270c">#0000270c</color>
+ <color name="i_am_color_270d">#0000270d</color>
+ <color name="i_am_color_270e">#0000270e</color>
+ <color name="i_am_color_270f">#0000270f</color>
+ <color name="i_am_color_2710">#00002710</color>
+</resources>
diff --git a/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java b/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java
index 7216244..54b79b4 100644
--- a/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java
+++ b/apct-tests/perftests/core/src/android/app/ResourcesPerfTest.java
@@ -37,6 +37,7 @@
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.util.Random;
/**
* Benchmarks for {@link android.content.res.Resources}.
@@ -222,4 +223,24 @@
state.resumeTiming();
}
}
-}
\ No newline at end of file
+
+ @Test
+ public void getIdentifier() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final Random random = new Random(System.currentTimeMillis());
+ final Context context = InstrumentationRegistry.getTargetContext();
+ final String packageName = context.getPackageName();
+ while (state.keepRunning()) {
+ state.pauseTiming();
+ final int expectedInteger = random.nextInt(10001);
+ final String expectedString = Integer.toHexString(expectedInteger);
+ final String entryName = "i_am_color_" + expectedString;
+ state.resumeTiming();
+
+ final int resIdentifier = mRes.getIdentifier(entryName, "color", packageName);
+ if (resIdentifier == 0) {
+ fail("Color \"" + entryName + "\" is not found");
+ }
+ }
+ }
+}
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index a5c2bcc..90ec700 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -149,6 +149,8 @@
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
+import dalvik.annotation.optimization.NeverCompile;
+
import libcore.util.EmptyArray;
import java.io.FileDescriptor;
@@ -2869,6 +2871,7 @@
packageName, UserHandle.of(userId));
}
+ @NeverCompile // Avoid size overhead of debugging code.
void dumpImpl(IndentingPrintWriter pw) {
synchronized (mLock) {
pw.println("Current Alarm Manager state:");
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index bdfdd55..4e73b02 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -127,6 +127,8 @@
import com.android.server.utils.quota.Category;
import com.android.server.utils.quota.CountQuotaTracker;
+import dalvik.annotation.optimization.NeverCompile;
+
import libcore.util.EmptyArray;
import java.io.FileDescriptor;
@@ -3821,6 +3823,7 @@
});
}
+ @NeverCompile // Avoid size overhead of debugging code.
void dumpInternal(final IndentingPrintWriter pw, int filterUid) {
final int filterAppId = UserHandle.getAppId(filterUid);
final long now = sSystemClock.millis();
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
index 649aa39..efcf14f 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
@@ -56,6 +56,8 @@
import com.android.server.job.JobStatusDumpProto;
import com.android.server.job.JobStatusShortInfoProto;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -1971,6 +1973,7 @@
}
// Dumpsys infrastructure
+ @NeverCompile // Avoid size overhead of debugging code.
public void dump(IndentingPrintWriter pw, boolean full, long nowElapsed) {
UserHandle.formatUid(pw, callingUid);
pw.print(" tag="); pw.println(tag);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index b96055f..48f8581 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -76,6 +76,8 @@
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import com.android.server.utils.AlarmQueue;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
@@ -4358,6 +4360,7 @@
//////////////////////////// DATA DUMP //////////////////////////////
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
public void dumpControllerStateLocked(final IndentingPrintWriter pw,
final Predicate<JobStatus> predicate) {
diff --git a/apex/media/Android.bp b/apex/media/Android.bp
deleted file mode 100644
index 1a710a98b..0000000
--- a/apex/media/Android.bp
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2020 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package {
- default_visibility: [
- ":__subpackages__",
- "//frameworks/av/apex",
- "//frameworks/av/apex/testing",
- ],
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-sdk {
- name: "media-module-sdk",
- bootclasspath_fragments: ["com.android.media-bootclasspath-fragment"],
- systemserverclasspath_fragments: ["com.android.media-systemserverclasspath-fragment"],
- java_sdk_libs: [
- "framework-media",
- ],
-}
diff --git a/apex/media/OWNERS b/apex/media/OWNERS
deleted file mode 100644
index 2c5965c..0000000
--- a/apex/media/OWNERS
+++ /dev/null
@@ -1,12 +0,0 @@
-# Bug component: 1344
-hdmoon@google.com
-jinpark@google.com
-klhyun@google.com
-lnilsson@google.com
-sungsoo@google.com
-
-# go/android-fwk-media-solutions for info on areas of ownership.
-include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
-
-# media reliability team packages/delivers the media mainline builds.
-include platform/frameworks/av:/media/janitors/reliability_mainline_OWNERS
diff --git a/apex/media/aidl/Android.bp b/apex/media/aidl/Android.bp
deleted file mode 100644
index 545a0cd..0000000
--- a/apex/media/aidl/Android.bp
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Copyright 2020 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-filegroup {
- name: "stable-media-aidl-srcs",
- srcs: ["stable/**/*.aidl"],
- path: "stable",
-}
-
-filegroup {
- name: "private-media-aidl-srcs",
- srcs: ["private/**/I*.aidl"],
- path: "private",
-}
-
-filegroup {
- name: "media-aidl-srcs",
- srcs: [
- ":private-media-aidl-srcs",
- ":stable-media-aidl-srcs",
- ],
-}
diff --git a/apex/media/aidl/private/android/media/Controller2Link.aidl b/apex/media/aidl/private/android/media/Controller2Link.aidl
deleted file mode 100644
index 64edafc..0000000
--- a/apex/media/aidl/private/android/media/Controller2Link.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-parcelable Controller2Link;
diff --git a/apex/media/aidl/private/android/media/IMediaCommunicationService.aidl b/apex/media/aidl/private/android/media/IMediaCommunicationService.aidl
deleted file mode 100644
index e1c89e9..0000000
--- a/apex/media/aidl/private/android/media/IMediaCommunicationService.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.media;
-
-import android.media.Session2Token;
-import android.media.IMediaCommunicationServiceCallback;
-import android.media.MediaParceledListSlice;
-import android.view.KeyEvent;
-
-/** {@hide} */
-interface IMediaCommunicationService {
- void notifySession2Created(in Session2Token sessionToken);
- boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid);
- MediaParceledListSlice getSession2Tokens(int userId);
-
- void dispatchMediaKeyEvent(String packageName, in KeyEvent keyEvent, boolean asSystemService);
-
- void registerCallback(IMediaCommunicationServiceCallback callback, String packageName);
- void unregisterCallback(IMediaCommunicationServiceCallback callback);
-}
-
diff --git a/apex/media/aidl/private/android/media/IMediaCommunicationServiceCallback.aidl b/apex/media/aidl/private/android/media/IMediaCommunicationServiceCallback.aidl
deleted file mode 100644
index e347ebf..0000000
--- a/apex/media/aidl/private/android/media/IMediaCommunicationServiceCallback.aidl
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright 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 android.media;
-
-import android.media.Session2Token;
-import android.media.MediaParceledListSlice;
-
-/** {@hide} */
-oneway interface IMediaCommunicationServiceCallback {
- void onSession2Created(in Session2Token token);
- void onSession2Changed(in MediaParceledListSlice tokens);
-}
-
diff --git a/apex/media/aidl/private/android/media/IMediaController2.aidl b/apex/media/aidl/private/android/media/IMediaController2.aidl
deleted file mode 100644
index 42c6e70..0000000
--- a/apex/media/aidl/private/android/media/IMediaController2.aidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.media.Session2Command;
-
-/**
- * Interface from MediaSession2 to MediaController2.
- * <p>
- * Keep this interface oneway. Otherwise a malicious app may implement fake version of this,
- * and holds calls from session to make session owner(s) frozen.
- * @hide
- */
- // Code for AML only
-oneway interface IMediaController2 {
- void notifyConnected(int seq, in Bundle connectionResult) = 0;
- void notifyDisconnected(int seq) = 1;
- void notifyPlaybackActiveChanged(int seq, boolean playbackActive) = 2;
- void sendSessionCommand(int seq, in Session2Command command, in Bundle args,
- in ResultReceiver resultReceiver) = 3;
- void cancelSessionCommand(int seq) = 4;
- // Next Id : 5
-}
diff --git a/apex/media/aidl/private/android/media/IMediaSession2.aidl b/apex/media/aidl/private/android/media/IMediaSession2.aidl
deleted file mode 100644
index 26e717b..0000000
--- a/apex/media/aidl/private/android/media/IMediaSession2.aidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.media.Controller2Link;
-import android.media.Session2Command;
-
-/**
- * Interface from MediaController2 to MediaSession2.
- * <p>
- * Keep this interface oneway. Otherwise a malicious app may implement fake version of this,
- * and holds calls from session to make session owner(s) frozen.
- * @hide
- */
- // Code for AML only
-oneway interface IMediaSession2 {
- void connect(in Controller2Link caller, int seq, in Bundle connectionRequest) = 0;
- void disconnect(in Controller2Link caller, int seq) = 1;
- void sendSessionCommand(in Controller2Link caller, int seq, in Session2Command sessionCommand,
- in Bundle args, in ResultReceiver resultReceiver) = 2;
- void cancelSessionCommand(in Controller2Link caller, int seq) = 3;
- // Next Id : 4
-}
diff --git a/apex/media/aidl/private/android/media/IMediaSession2Service.aidl b/apex/media/aidl/private/android/media/IMediaSession2Service.aidl
deleted file mode 100644
index 10ac1be..0000000
--- a/apex/media/aidl/private/android/media/IMediaSession2Service.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.os.Bundle;
-import android.media.Controller2Link;
-
-/**
- * Interface from MediaController2 to MediaSession2Service.
- * <p>
- * Keep this interface oneway. Otherwise a malicious app may implement fake version of this,
- * and holds calls from controller to make controller owner(s) frozen.
- * @hide
- */
-oneway interface IMediaSession2Service {
- void connect(in Controller2Link caller, int seq, in Bundle connectionRequest) = 0;
- // Next Id : 1
-}
diff --git a/apex/media/aidl/private/android/media/Session2Command.aidl b/apex/media/aidl/private/android/media/Session2Command.aidl
deleted file mode 100644
index 43a7b12..0000000
--- a/apex/media/aidl/private/android/media/Session2Command.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-parcelable Session2Command;
diff --git a/apex/media/aidl/stable/android/media/MediaParceledListSlice.aidl b/apex/media/aidl/stable/android/media/MediaParceledListSlice.aidl
deleted file mode 100644
index 92d673f..0000000
--- a/apex/media/aidl/stable/android/media/MediaParceledListSlice.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2020, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-parcelable MediaParceledListSlice<T>;
diff --git a/apex/media/aidl/stable/android/media/Session2Token.aidl b/apex/media/aidl/stable/android/media/Session2Token.aidl
deleted file mode 100644
index c5980e9..0000000
--- a/apex/media/aidl/stable/android/media/Session2Token.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-parcelable Session2Token;
diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp
deleted file mode 100644
index 2c2af28..0000000
--- a/apex/media/framework/Android.bp
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (C) 2020 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-java_library {
- name: "updatable-media",
-
- srcs: [
- ":updatable-media-srcs",
- ],
-
- permitted_packages: [
- "android.media",
- ],
-
- optimize: {
- enabled: true,
- shrink: true,
- proguard_flags_files: ["updatable-media-proguard.flags"],
- },
-
- installable: true,
-
- sdk_version: "module_current",
- libs: [
- "androidx.annotation_annotation",
- "framework-annotations-lib",
- ],
- static_libs: [
- "exoplayer2-extractor",
- "mediatranscoding_aidl_interface-java",
- "modules-annotation-minsdk",
- "modules-utils-build",
- ],
- jarjar_rules: "jarjar_rules.txt",
-
- plugins: ["java_api_finder"],
-
- hostdex: true, // for hiddenapi check
- apex_available: [
- "com.android.media",
- "test_com.android.media",
- ],
- min_sdk_version: "29",
- lint: {
- strict_updatability_linting: true,
- },
- visibility: [
- "//frameworks/av/apex:__subpackages__",
- "//frameworks/base/apex/media/service",
- "//frameworks/base/api", // For framework-all
- ],
-}
-
-filegroup {
- name: "updatable-media-srcs",
- srcs: [
- "java/android/media/MediaFrameworkInitializer.java",
- ":media-aidl-srcs",
- ":mediaparceledlistslice-java-srcs",
- ":mediaparser-srcs",
- ":mediasession2-java-srcs",
- ":mediatranscoding-srcs",
- ],
- visibility: ["//frameworks/base"],
-}
-
-filegroup {
- name: "mediasession2-java-srcs",
- srcs: [
- "java/android/media/Controller2Link.java",
- "java/android/media/MediaConstants.java",
- "java/android/media/MediaController2.java",
- "java/android/media/MediaSession2.java",
- "java/android/media/MediaSession2Service.java",
- "java/android/media/Session2Command.java",
- "java/android/media/Session2CommandGroup.java",
- "java/android/media/Session2Link.java",
- "java/android/media/Session2Token.java",
- "java/android/media/MediaCommunicationManager.java",
- ],
- path: "java",
-}
-
-filegroup {
- name: "mediaparceledlistslice-java-srcs",
- srcs: [
- "java/android/media/MediaParceledListSlice.java",
- "java/android/media/BaseMediaParceledListSlice.java",
- ],
- path: "java",
-}
-
-filegroup {
- name: "mediaparser-srcs",
- srcs: [
- "java/android/media/MediaParser.java",
- ],
- path: "java",
-}
-
-filegroup {
- name: "mediatranscoding-srcs",
- srcs: [
- "java/android/media/ApplicationMediaCapabilities.java",
- "java/android/media/MediaFeature.java",
- "java/android/media/MediaTranscodingManager.java",
- ],
- path: "java",
-}
-
-java_sdk_library {
- name: "framework-media",
- defaults: ["framework-module-defaults"],
-
- // This is only used to define the APIs for updatable-media.
- api_only: true,
-
- srcs: [
- ":updatable-media-srcs",
- ],
-
- impl_library_visibility: ["//frameworks/av/apex:__subpackages__"],
-}
-
-cc_library_shared {
- name: "libmediaparser-jni",
- srcs: [
- "jni/android_media_MediaParserJNI.cpp",
- ],
- header_libs: ["jni_headers"],
- shared_libs: [
- "libandroid",
- "liblog",
- "libmediametrics",
- ],
- cflags: [
- "-Wall",
- "-Werror",
- "-Wno-unused-parameter",
- "-Wunreachable-code",
- "-Wunused",
- ],
- apex_available: [
- "com.android.media",
- ],
- min_sdk_version: "29",
-}
diff --git a/apex/media/framework/TEST_MAPPING b/apex/media/framework/TEST_MAPPING
deleted file mode 100644
index 3d21914..0000000
--- a/apex/media/framework/TEST_MAPPING
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "presubmit": [
- {
- "name": "CtsMediaParserTestCases"
- },
- {
- "name": "CtsMediaParserHostTestCases"
- }
- ]
-}
diff --git a/apex/media/framework/api/current.txt b/apex/media/framework/api/current.txt
deleted file mode 100644
index b7d7ed8..0000000
--- a/apex/media/framework/api/current.txt
+++ /dev/null
@@ -1,267 +0,0 @@
-// Signature format: 2.0
-package android.media {
-
- public final class ApplicationMediaCapabilities implements android.os.Parcelable {
- method @NonNull public static android.media.ApplicationMediaCapabilities createFromXml(@NonNull org.xmlpull.v1.XmlPullParser);
- method public int describeContents();
- method @NonNull public java.util.List<java.lang.String> getSupportedHdrTypes();
- method @NonNull public java.util.List<java.lang.String> getSupportedVideoMimeTypes();
- method @NonNull public java.util.List<java.lang.String> getUnsupportedHdrTypes();
- method @NonNull public java.util.List<java.lang.String> getUnsupportedVideoMimeTypes();
- method public boolean isFormatSpecified(@NonNull String);
- method public boolean isHdrTypeSupported(@NonNull String);
- method public boolean isVideoMimeTypeSupported(@NonNull String);
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.media.ApplicationMediaCapabilities> CREATOR;
- }
-
- public static final class ApplicationMediaCapabilities.Builder {
- ctor public ApplicationMediaCapabilities.Builder();
- method @NonNull public android.media.ApplicationMediaCapabilities.Builder addSupportedHdrType(@NonNull String);
- method @NonNull public android.media.ApplicationMediaCapabilities.Builder addSupportedVideoMimeType(@NonNull String);
- method @NonNull public android.media.ApplicationMediaCapabilities.Builder addUnsupportedHdrType(@NonNull String);
- method @NonNull public android.media.ApplicationMediaCapabilities.Builder addUnsupportedVideoMimeType(@NonNull String);
- method @NonNull public android.media.ApplicationMediaCapabilities build();
- }
-
- public class MediaCommunicationManager {
- method @NonNull public java.util.List<android.media.Session2Token> getSession2Tokens();
- method @IntRange(from=1) public int getVersion();
- }
-
- public class MediaController2 implements java.lang.AutoCloseable {
- method public void cancelSessionCommand(@NonNull Object);
- method public void close();
- method @Nullable public android.media.Session2Token getConnectedToken();
- method public boolean isPlaybackActive();
- method @NonNull public Object sendSessionCommand(@NonNull android.media.Session2Command, @Nullable android.os.Bundle);
- }
-
- public static final class MediaController2.Builder {
- ctor public MediaController2.Builder(@NonNull android.content.Context, @NonNull android.media.Session2Token);
- method @NonNull public android.media.MediaController2 build();
- method @NonNull public android.media.MediaController2.Builder setConnectionHints(@NonNull android.os.Bundle);
- method @NonNull public android.media.MediaController2.Builder setControllerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaController2.ControllerCallback);
- }
-
- public abstract static class MediaController2.ControllerCallback {
- ctor public MediaController2.ControllerCallback();
- method public void onCommandResult(@NonNull android.media.MediaController2, @NonNull Object, @NonNull android.media.Session2Command, @NonNull android.media.Session2Command.Result);
- method public void onConnected(@NonNull android.media.MediaController2, @NonNull android.media.Session2CommandGroup);
- method public void onDisconnected(@NonNull android.media.MediaController2);
- method public void onPlaybackActiveChanged(@NonNull android.media.MediaController2, boolean);
- method @Nullable public android.media.Session2Command.Result onSessionCommand(@NonNull android.media.MediaController2, @NonNull android.media.Session2Command, @Nullable android.os.Bundle);
- }
-
- public final class MediaFeature {
- ctor public MediaFeature();
- }
-
- public static final class MediaFeature.HdrType {
- field public static final String DOLBY_VISION = "android.media.feature.hdr.dolby_vision";
- field public static final String HDR10 = "android.media.feature.hdr.hdr10";
- field public static final String HDR10_PLUS = "android.media.feature.hdr.hdr10_plus";
- field public static final String HLG = "android.media.feature.hdr.hlg";
- }
-
- public final class MediaParser {
- method public boolean advance(@NonNull android.media.MediaParser.SeekableInputReader) throws java.io.IOException;
- method @NonNull public static android.media.MediaParser create(@NonNull android.media.MediaParser.OutputConsumer, @NonNull java.lang.String...);
- method @NonNull public static android.media.MediaParser createByName(@NonNull String, @NonNull android.media.MediaParser.OutputConsumer);
- method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
- method @NonNull public String getParserName();
- method @NonNull public static java.util.List<java.lang.String> getParserNames(@NonNull android.media.MediaFormat);
- method public void release();
- method public void seek(@NonNull android.media.MediaParser.SeekPoint);
- method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId);
- method @NonNull public android.media.MediaParser setParameter(@NonNull String, @NonNull Object);
- method public boolean supportsParameter(@NonNull String);
- field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "android.media.mediaparser.adts.enableCbrSeeking";
- field public static final String PARAMETER_AMR_ENABLE_CBR_SEEKING = "android.media.mediaparser.amr.enableCbrSeeking";
- field public static final String PARAMETER_FLAC_DISABLE_ID3 = "android.media.mediaparser.flac.disableId3";
- field public static final String PARAMETER_MATROSKA_DISABLE_CUES_SEEKING = "android.media.mediaparser.matroska.disableCuesSeeking";
- field public static final String PARAMETER_MP3_DISABLE_ID3 = "android.media.mediaparser.mp3.disableId3";
- field public static final String PARAMETER_MP3_ENABLE_CBR_SEEKING = "android.media.mediaparser.mp3.enableCbrSeeking";
- field public static final String PARAMETER_MP3_ENABLE_INDEX_SEEKING = "android.media.mediaparser.mp3.enableIndexSeeking";
- field public static final String PARAMETER_MP4_IGNORE_EDIT_LISTS = "android.media.mediaparser.mp4.ignoreEditLists";
- field public static final String PARAMETER_MP4_IGNORE_TFDT_BOX = "android.media.mediaparser.mp4.ignoreTfdtBox";
- field public static final String PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES = "android.media.mediaparser.mp4.treatVideoFramesAsKeyframes";
- field public static final String PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES = "android.media.mediaparser.ts.allowNonIdrAvcKeyframes";
- field public static final String PARAMETER_TS_DETECT_ACCESS_UNITS = "android.media.mediaparser.ts.ignoreDetectAccessUnits";
- field public static final String PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS = "android.media.mediaparser.ts.enableHdmvDtsAudioStreams";
- field public static final String PARAMETER_TS_IGNORE_AAC_STREAM = "android.media.mediaparser.ts.ignoreAacStream";
- field public static final String PARAMETER_TS_IGNORE_AVC_STREAM = "android.media.mediaparser.ts.ignoreAvcStream";
- field public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM = "android.media.mediaparser.ts.ignoreSpliceInfoStream";
- field public static final String PARAMETER_TS_MODE = "android.media.mediaparser.ts.mode";
- field public static final String PARSER_NAME_AC3 = "android.media.mediaparser.Ac3Parser";
- field public static final String PARSER_NAME_AC4 = "android.media.mediaparser.Ac4Parser";
- field public static final String PARSER_NAME_ADTS = "android.media.mediaparser.AdtsParser";
- field public static final String PARSER_NAME_AMR = "android.media.mediaparser.AmrParser";
- field public static final String PARSER_NAME_FLAC = "android.media.mediaparser.FlacParser";
- field public static final String PARSER_NAME_FLV = "android.media.mediaparser.FlvParser";
- field public static final String PARSER_NAME_FMP4 = "android.media.mediaparser.FragmentedMp4Parser";
- field public static final String PARSER_NAME_MATROSKA = "android.media.mediaparser.MatroskaParser";
- field public static final String PARSER_NAME_MP3 = "android.media.mediaparser.Mp3Parser";
- field public static final String PARSER_NAME_MP4 = "android.media.mediaparser.Mp4Parser";
- field public static final String PARSER_NAME_OGG = "android.media.mediaparser.OggParser";
- field public static final String PARSER_NAME_PS = "android.media.mediaparser.PsParser";
- field public static final String PARSER_NAME_TS = "android.media.mediaparser.TsParser";
- field public static final String PARSER_NAME_UNKNOWN = "android.media.mediaparser.UNKNOWN";
- field public static final String PARSER_NAME_WAV = "android.media.mediaparser.WavParser";
- field public static final int SAMPLE_FLAG_DECODE_ONLY = -2147483648; // 0x80000000
- field public static final int SAMPLE_FLAG_ENCRYPTED = 1073741824; // 0x40000000
- field public static final int SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA = 268435456; // 0x10000000
- field public static final int SAMPLE_FLAG_KEY_FRAME = 1; // 0x1
- field public static final int SAMPLE_FLAG_LAST_SAMPLE = 536870912; // 0x20000000
- }
-
- public static interface MediaParser.InputReader {
- method public long getLength();
- method public long getPosition();
- method public int read(@NonNull byte[], int, int) throws java.io.IOException;
- }
-
- public static interface MediaParser.OutputConsumer {
- method public void onSampleCompleted(int, long, int, int, int, @Nullable android.media.MediaCodec.CryptoInfo);
- method public void onSampleDataFound(int, @NonNull android.media.MediaParser.InputReader) throws java.io.IOException;
- method public void onSeekMapFound(@NonNull android.media.MediaParser.SeekMap);
- method public void onTrackCountFound(int);
- method public void onTrackDataFound(int, @NonNull android.media.MediaParser.TrackData);
- }
-
- public static final class MediaParser.ParsingException extends java.io.IOException {
- }
-
- public static final class MediaParser.SeekMap {
- method public long getDurationMicros();
- method @NonNull public android.util.Pair<android.media.MediaParser.SeekPoint,android.media.MediaParser.SeekPoint> getSeekPoints(long);
- method public boolean isSeekable();
- field public static final int UNKNOWN_DURATION = -2147483648; // 0x80000000
- }
-
- public static final class MediaParser.SeekPoint {
- field @NonNull public static final android.media.MediaParser.SeekPoint START;
- field public final long position;
- field public final long timeMicros;
- }
-
- public static interface MediaParser.SeekableInputReader extends android.media.MediaParser.InputReader {
- method public void seekToPosition(long);
- }
-
- public static final class MediaParser.TrackData {
- field @Nullable public final android.media.DrmInitData drmInitData;
- field @NonNull public final android.media.MediaFormat mediaFormat;
- }
-
- public static final class MediaParser.UnrecognizedInputFormatException extends java.io.IOException {
- }
-
- public class MediaSession2 implements java.lang.AutoCloseable {
- method public void broadcastSessionCommand(@NonNull android.media.Session2Command, @Nullable android.os.Bundle);
- method public void cancelSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull Object);
- method public void close();
- method @NonNull public java.util.List<android.media.MediaSession2.ControllerInfo> getConnectedControllers();
- method @NonNull public String getId();
- method @NonNull public android.media.Session2Token getToken();
- method public boolean isPlaybackActive();
- method @NonNull public Object sendSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull android.media.Session2Command, @Nullable android.os.Bundle);
- method public void setPlaybackActive(boolean);
- }
-
- public static final class MediaSession2.Builder {
- ctor public MediaSession2.Builder(@NonNull android.content.Context);
- method @NonNull public android.media.MediaSession2 build();
- method @NonNull public android.media.MediaSession2.Builder setExtras(@NonNull android.os.Bundle);
- method @NonNull public android.media.MediaSession2.Builder setId(@NonNull String);
- method @NonNull public android.media.MediaSession2.Builder setSessionActivity(@Nullable android.app.PendingIntent);
- method @NonNull public android.media.MediaSession2.Builder setSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaSession2.SessionCallback);
- }
-
- public static final class MediaSession2.ControllerInfo {
- method @NonNull public android.os.Bundle getConnectionHints();
- method @NonNull public String getPackageName();
- method @NonNull public android.media.session.MediaSessionManager.RemoteUserInfo getRemoteUserInfo();
- method public int getUid();
- }
-
- public abstract static class MediaSession2.SessionCallback {
- ctor public MediaSession2.SessionCallback();
- method public void onCommandResult(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo, @NonNull Object, @NonNull android.media.Session2Command, @NonNull android.media.Session2Command.Result);
- method @Nullable public android.media.Session2CommandGroup onConnect(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo);
- method public void onDisconnected(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo);
- method public void onPostConnect(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo);
- method @Nullable public android.media.Session2Command.Result onSessionCommand(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo, @NonNull android.media.Session2Command, @Nullable android.os.Bundle);
- }
-
- public abstract class MediaSession2Service extends android.app.Service {
- ctor public MediaSession2Service();
- method public final void addSession(@NonNull android.media.MediaSession2);
- method @NonNull public final java.util.List<android.media.MediaSession2> getSessions();
- method @CallSuper @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);
- method @Nullable public abstract android.media.MediaSession2 onGetSession(@NonNull android.media.MediaSession2.ControllerInfo);
- method @Nullable public abstract android.media.MediaSession2Service.MediaNotification onUpdateNotification(@NonNull android.media.MediaSession2);
- method public final void removeSession(@NonNull android.media.MediaSession2);
- field public static final String SERVICE_INTERFACE = "android.media.MediaSession2Service";
- }
-
- public static class MediaSession2Service.MediaNotification {
- ctor public MediaSession2Service.MediaNotification(int, @NonNull android.app.Notification);
- method @NonNull public android.app.Notification getNotification();
- method public int getNotificationId();
- }
-
- public final class Session2Command implements android.os.Parcelable {
- ctor public Session2Command(int);
- ctor public Session2Command(@NonNull String, @Nullable android.os.Bundle);
- method public int describeContents();
- method public int getCommandCode();
- method @Nullable public String getCustomAction();
- method @Nullable public android.os.Bundle getCustomExtras();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field public static final int COMMAND_CODE_CUSTOM = 0; // 0x0
- field @NonNull public static final android.os.Parcelable.Creator<android.media.Session2Command> CREATOR;
- }
-
- public static final class Session2Command.Result {
- ctor public Session2Command.Result(int, @Nullable android.os.Bundle);
- method public int getResultCode();
- method @Nullable public android.os.Bundle getResultData();
- field public static final int RESULT_ERROR_UNKNOWN_ERROR = -1; // 0xffffffff
- field public static final int RESULT_INFO_SKIPPED = 1; // 0x1
- field public static final int RESULT_SUCCESS = 0; // 0x0
- }
-
- public final class Session2CommandGroup implements android.os.Parcelable {
- method public int describeContents();
- method @NonNull public java.util.Set<android.media.Session2Command> getCommands();
- method public boolean hasCommand(@NonNull android.media.Session2Command);
- method public boolean hasCommand(int);
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.media.Session2CommandGroup> CREATOR;
- }
-
- public static final class Session2CommandGroup.Builder {
- ctor public Session2CommandGroup.Builder();
- ctor public Session2CommandGroup.Builder(@NonNull android.media.Session2CommandGroup);
- method @NonNull public android.media.Session2CommandGroup.Builder addCommand(@NonNull android.media.Session2Command);
- method @NonNull public android.media.Session2CommandGroup build();
- method @NonNull public android.media.Session2CommandGroup.Builder removeCommand(@NonNull android.media.Session2Command);
- }
-
- public final class Session2Token implements android.os.Parcelable {
- ctor public Session2Token(@NonNull android.content.Context, @NonNull android.content.ComponentName);
- method public int describeContents();
- method @NonNull public android.os.Bundle getExtras();
- method @NonNull public String getPackageName();
- method @Nullable public String getServiceName();
- method public int getType();
- method public int getUid();
- method public void writeToParcel(android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.media.Session2Token> CREATOR;
- field public static final int TYPE_SESSION = 0; // 0x0
- field public static final int TYPE_SESSION_SERVICE = 1; // 0x1
- }
-
-}
-
diff --git a/apex/media/framework/api/module-lib-current.txt b/apex/media/framework/api/module-lib-current.txt
deleted file mode 100644
index 7317f14..0000000
--- a/apex/media/framework/api/module-lib-current.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-// Signature format: 2.0
-package android.media {
-
- public class MediaCommunicationManager {
- method public void dispatchMediaKeyEvent(@NonNull android.view.KeyEvent, boolean);
- method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void registerSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaCommunicationManager.SessionCallback);
- method public void unregisterSessionCallback(@NonNull android.media.MediaCommunicationManager.SessionCallback);
- }
-
- public static interface MediaCommunicationManager.SessionCallback {
- method public default void onSession2TokenCreated(@NonNull android.media.Session2Token);
- method public default void onSession2TokensChanged(@NonNull java.util.List<android.media.Session2Token>);
- }
-
- public class MediaFrameworkInitializer {
- method public static void registerServiceWrappers();
- method public static void setMediaServiceManager(@NonNull android.media.MediaServiceManager);
- }
-
- @Deprecated public final class MediaParceledListSlice<T extends android.os.Parcelable> implements android.os.Parcelable {
- ctor @Deprecated public MediaParceledListSlice(@NonNull java.util.List<T>);
- method @Deprecated public int describeContents();
- method @Deprecated @NonNull public static <T extends android.os.Parcelable> android.media.MediaParceledListSlice<T> emptyList();
- method @Deprecated public java.util.List<T> getList();
- method @Deprecated public void setInlineCountLimit(int);
- method @Deprecated public void writeToParcel(android.os.Parcel, int);
- field @Deprecated @NonNull public static final android.os.Parcelable.ClassLoaderCreator<android.media.MediaParceledListSlice> CREATOR;
- }
-
-}
-
diff --git a/apex/media/framework/api/module-lib-removed.txt b/apex/media/framework/api/module-lib-removed.txt
deleted file mode 100644
index d802177..0000000
--- a/apex/media/framework/api/module-lib-removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/apex/media/framework/api/removed.txt b/apex/media/framework/api/removed.txt
deleted file mode 100644
index d802177..0000000
--- a/apex/media/framework/api/removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/apex/media/framework/api/system-current.txt b/apex/media/framework/api/system-current.txt
deleted file mode 100644
index 6eea769..0000000
--- a/apex/media/framework/api/system-current.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// Signature format: 2.0
-package android.media {
-
- public final class MediaTranscodingManager {
- method @Nullable public android.media.MediaTranscodingManager.TranscodingSession enqueueRequest(@NonNull android.media.MediaTranscodingManager.TranscodingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.media.MediaTranscodingManager.OnTranscodingFinishedListener);
- }
-
- @java.lang.FunctionalInterface public static interface MediaTranscodingManager.OnTranscodingFinishedListener {
- method public void onTranscodingFinished(@NonNull android.media.MediaTranscodingManager.TranscodingSession);
- }
-
- public abstract static class MediaTranscodingManager.TranscodingRequest {
- method public int getClientPid();
- method public int getClientUid();
- method @Nullable public android.os.ParcelFileDescriptor getDestinationFileDescriptor();
- method @NonNull public android.net.Uri getDestinationUri();
- method @Nullable public android.os.ParcelFileDescriptor getSourceFileDescriptor();
- method @NonNull public android.net.Uri getSourceUri();
- }
-
- public static class MediaTranscodingManager.TranscodingRequest.VideoFormatResolver {
- ctor public MediaTranscodingManager.TranscodingRequest.VideoFormatResolver(@NonNull android.media.ApplicationMediaCapabilities, @NonNull android.media.MediaFormat);
- method @Nullable public android.media.MediaFormat resolveVideoFormat();
- method public boolean shouldTranscode();
- }
-
- public static final class MediaTranscodingManager.TranscodingSession {
- method public boolean addClientUid(int);
- method public void cancel();
- method @NonNull public java.util.List<java.lang.Integer> getClientUids();
- method public int getErrorCode();
- method @IntRange(from=0, to=100) public int getProgress();
- method public int getResult();
- method public int getSessionId();
- method public int getStatus();
- method public void setOnProgressUpdateListener(@NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodingManager.TranscodingSession.OnProgressUpdateListener);
- field public static final int ERROR_DROPPED_BY_SERVICE = 1; // 0x1
- field public static final int ERROR_NONE = 0; // 0x0
- field public static final int ERROR_SERVICE_DIED = 2; // 0x2
- field public static final int RESULT_CANCELED = 4; // 0x4
- field public static final int RESULT_ERROR = 3; // 0x3
- field public static final int RESULT_NONE = 1; // 0x1
- field public static final int RESULT_SUCCESS = 2; // 0x2
- field public static final int STATUS_FINISHED = 3; // 0x3
- field public static final int STATUS_PAUSED = 4; // 0x4
- field public static final int STATUS_PENDING = 1; // 0x1
- field public static final int STATUS_RUNNING = 2; // 0x2
- }
-
- @java.lang.FunctionalInterface public static interface MediaTranscodingManager.TranscodingSession.OnProgressUpdateListener {
- method public void onProgressUpdate(@NonNull android.media.MediaTranscodingManager.TranscodingSession, @IntRange(from=0, to=100) int);
- }
-
- public static final class MediaTranscodingManager.VideoTranscodingRequest extends android.media.MediaTranscodingManager.TranscodingRequest {
- method @NonNull public android.media.MediaFormat getVideoTrackFormat();
- }
-
- public static final class MediaTranscodingManager.VideoTranscodingRequest.Builder {
- ctor public MediaTranscodingManager.VideoTranscodingRequest.Builder(@NonNull android.net.Uri, @NonNull android.net.Uri, @NonNull android.media.MediaFormat);
- method @NonNull public android.media.MediaTranscodingManager.VideoTranscodingRequest build();
- method @NonNull public android.media.MediaTranscodingManager.VideoTranscodingRequest.Builder setClientPid(int);
- method @NonNull public android.media.MediaTranscodingManager.VideoTranscodingRequest.Builder setClientUid(int);
- method @NonNull public android.media.MediaTranscodingManager.VideoTranscodingRequest.Builder setDestinationFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
- method @NonNull public android.media.MediaTranscodingManager.VideoTranscodingRequest.Builder setSourceFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
- }
-
-}
-
diff --git a/apex/media/framework/api/system-removed.txt b/apex/media/framework/api/system-removed.txt
deleted file mode 100644
index d802177..0000000
--- a/apex/media/framework/api/system-removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/apex/media/framework/jarjar_rules.txt b/apex/media/framework/jarjar_rules.txt
deleted file mode 100644
index 91489dc..0000000
--- a/apex/media/framework/jarjar_rules.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-rule com.android.modules.** android.media.internal.@1
-rule com.google.android.exoplayer2.** android.media.internal.exo.@1
diff --git a/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java b/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
deleted file mode 100644
index 97fa0ec..0000000
--- a/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.NonNull;
-import android.content.ContentResolver;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.Log;
-
-import com.android.modules.annotation.MinSdk;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- ApplicationMediaCapabilities is an immutable class that encapsulates an application's capabilities
- for handling newer video codec format and media features.
-
- <p>
- Android 12 introduces Compatible media transcoding feature. See
- <a href="https://developer.android.com/about/versions/12/features#compatible_media_transcoding">
- Compatible media transcoding</a>. By default, Android assumes apps can support playback of all
- media formats. Apps that would like to request that media be transcoded into a more compatible
- format should declare their media capabilities in a media_capabilities.xml resource file and add it
- as a property tag in the AndroidManifest.xml file. Here is a example:
- <pre>
- {@code
- <media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
- <format android:name="HEVC" supported="true"/>
- <format android:name="HDR10" supported="false"/>
- <format android:name="HDR10Plus" supported="false"/>
- </media-capabilities>
- }
- </pre>
- The ApplicationMediaCapabilities class is generated from this xml and used by the platform to
- represent an application's media capabilities in order to determine whether modern media files need
- to be transcoded for that application.
- </p>
-
- <p>
- ApplicationMediaCapabilities objects can also be built by applications at runtime for use with
- {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)} to provide more
- control over the transcoding that is built into the platform. ApplicationMediaCapabilities
- provided by applications at runtime like this override the default manifest capabilities for that
- media access.The object could be build either through {@link #createFromXml(XmlPullParser)} or
- through the builder class {@link ApplicationMediaCapabilities.Builder}
-
- <h3> Video Codec Support</h3>
- <p>
- Newer video codes include HEVC, VP9 and AV1. Application only needs to indicate their support
- for newer format with this class as they are assumed to support older format like h.264.
-
- <h3>Capability of handling HDR(high dynamic range) video</h3>
- <p>
- There are four types of HDR video(Dolby-Vision, HDR10, HDR10+, HLG) supported by the platform,
- application will only need to specify individual types they supported.
- */
-@MinSdk(Build.VERSION_CODES.S)
-public final class ApplicationMediaCapabilities implements Parcelable {
- private static final String TAG = "ApplicationMediaCapabilities";
-
- /** List of supported video codec mime types. */
- private Set<String> mSupportedVideoMimeTypes = new HashSet<>();
-
- /** List of unsupported video codec mime types. */
- private Set<String> mUnsupportedVideoMimeTypes = new HashSet<>();
-
- /** List of supported hdr types. */
- private Set<String> mSupportedHdrTypes = new HashSet<>();
-
- /** List of unsupported hdr types. */
- private Set<String> mUnsupportedHdrTypes = new HashSet<>();
-
- private boolean mIsSlowMotionSupported = false;
-
- private ApplicationMediaCapabilities(Builder b) {
- mSupportedVideoMimeTypes.addAll(b.getSupportedVideoMimeTypes());
- mUnsupportedVideoMimeTypes.addAll(b.getUnsupportedVideoMimeTypes());
- mSupportedHdrTypes.addAll(b.getSupportedHdrTypes());
- mUnsupportedHdrTypes.addAll(b.getUnsupportedHdrTypes());
- mIsSlowMotionSupported = b.mIsSlowMotionSupported;
- }
-
- /**
- * Query if a video codec format is supported by the application.
- * <p>
- * If the application has not specified supporting the format or not, this will return false.
- * Use {@link #isFormatSpecified(String)} to query if a format is specified or not.
- *
- * @param videoMime The mime type of the video codec format. Must be the one used in
- * {@link MediaFormat#KEY_MIME}.
- * @return true if application supports the video codec format, false otherwise.
- */
- public boolean isVideoMimeTypeSupported(
- @NonNull String videoMime) {
- if (mSupportedVideoMimeTypes.contains(videoMime.toLowerCase())) {
- return true;
- }
- return false;
- }
-
- /**
- * Query if a HDR type is supported by the application.
- * <p>
- * If the application has not specified supporting the format or not, this will return false.
- * Use {@link #isFormatSpecified(String)} to query if a format is specified or not.
- *
- * @param hdrType The type of the HDR format.
- * @return true if application supports the HDR format, false otherwise.
- */
- public boolean isHdrTypeSupported(
- @NonNull @MediaFeature.MediaHdrType String hdrType) {
- if (mSupportedHdrTypes.contains(hdrType)) {
- return true;
- }
- return false;
- }
-
- /**
- * Query if a format is specified by the application.
- * <p>
- * The format could be either the video format or the hdr format.
- *
- * @param format The name of the format.
- * @return true if application specifies the format, false otherwise.
- */
- public boolean isFormatSpecified(@NonNull String format) {
- if (mSupportedVideoMimeTypes.contains(format) || mUnsupportedVideoMimeTypes.contains(format)
- || mSupportedHdrTypes.contains(format) || mUnsupportedHdrTypes.contains(format)) {
- return true;
-
- }
- return false;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel dest, int flags) {
- // Write out the supported video mime types.
- dest.writeInt(mSupportedVideoMimeTypes.size());
- for (String cap : mSupportedVideoMimeTypes) {
- dest.writeString(cap);
- }
- // Write out the unsupported video mime types.
- dest.writeInt(mUnsupportedVideoMimeTypes.size());
- for (String cap : mUnsupportedVideoMimeTypes) {
- dest.writeString(cap);
- }
- // Write out the supported hdr types.
- dest.writeInt(mSupportedHdrTypes.size());
- for (String cap : mSupportedHdrTypes) {
- dest.writeString(cap);
- }
- // Write out the unsupported hdr types.
- dest.writeInt(mUnsupportedHdrTypes.size());
- for (String cap : mUnsupportedHdrTypes) {
- dest.writeString(cap);
- }
- // Write out the supported slow motion.
- dest.writeBoolean(mIsSlowMotionSupported);
- }
-
- @Override
- public String toString() {
- String caps = new String(
- "Supported Video MimeTypes: " + mSupportedVideoMimeTypes.toString());
- caps += "Unsupported Video MimeTypes: " + mUnsupportedVideoMimeTypes.toString();
- caps += "Supported HDR types: " + mSupportedHdrTypes.toString();
- caps += "Unsupported HDR types: " + mUnsupportedHdrTypes.toString();
- caps += "Supported slow motion: " + mIsSlowMotionSupported;
- return caps;
- }
-
- @NonNull
- public static final Creator<ApplicationMediaCapabilities> CREATOR =
- new Creator<ApplicationMediaCapabilities>() {
- public ApplicationMediaCapabilities createFromParcel(Parcel in) {
- ApplicationMediaCapabilities.Builder builder =
- new ApplicationMediaCapabilities.Builder();
-
- // Parse supported video codec mime types.
- int count = in.readInt();
- for (int readCount = 0; readCount < count; ++readCount) {
- builder.addSupportedVideoMimeType(in.readString());
- }
-
- // Parse unsupported video codec mime types.
- count = in.readInt();
- for (int readCount = 0; readCount < count; ++readCount) {
- builder.addUnsupportedVideoMimeType(in.readString());
- }
-
- // Parse supported hdr types.
- count = in.readInt();
- for (int readCount = 0; readCount < count; ++readCount) {
- builder.addSupportedHdrType(in.readString());
- }
-
- // Parse unsupported hdr types.
- count = in.readInt();
- for (int readCount = 0; readCount < count; ++readCount) {
- builder.addUnsupportedHdrType(in.readString());
- }
-
- boolean supported = in.readBoolean();
- builder.setSlowMotionSupported(supported);
-
- return builder.build();
- }
-
- public ApplicationMediaCapabilities[] newArray(int size) {
- return new ApplicationMediaCapabilities[size];
- }
- };
-
- /**
- * Query the video codec mime types supported by the application.
- * @return List of supported video codec mime types. The list will be empty if there are none.
- */
- @NonNull
- public List<String> getSupportedVideoMimeTypes() {
- return new ArrayList<>(mSupportedVideoMimeTypes);
- }
-
- /**
- * Query the video codec mime types that are not supported by the application.
- * @return List of unsupported video codec mime types. The list will be empty if there are none.
- */
- @NonNull
- public List<String> getUnsupportedVideoMimeTypes() {
- return new ArrayList<>(mUnsupportedVideoMimeTypes);
- }
-
- /**
- * Query all hdr types that are supported by the application.
- * @return List of supported hdr types. The list will be empty if there are none.
- */
- @NonNull
- public List<String> getSupportedHdrTypes() {
- return new ArrayList<>(mSupportedHdrTypes);
- }
-
- /**
- * Query all hdr types that are not supported by the application.
- * @return List of unsupported hdr types. The list will be empty if there are none.
- */
- @NonNull
- public List<String> getUnsupportedHdrTypes() {
- return new ArrayList<>(mUnsupportedHdrTypes);
- }
-
- /**
- * Whether handling of slow-motion video is supported
- * @hide
- */
- public boolean isSlowMotionSupported() {
- return mIsSlowMotionSupported;
- }
-
- /**
- * Creates {@link ApplicationMediaCapabilities} from an xml.
- *
- * The xml's syntax is the same as the media_capabilities.xml used by the AndroidManifest.xml.
- * <p> Here is an example:
- *
- * <pre>
- * {@code
- * <media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
- * <format android:name="HEVC" supported="true"/>
- * <format android:name="HDR10" supported="false"/>
- * <format android:name="HDR10Plus" supported="false"/>
- * </media-capabilities>
- * }
- * </pre>
- * <p>
- *
- * @param xmlParser The underlying {@link XmlPullParser} that will read the xml.
- * @return An ApplicationMediaCapabilities object.
- * @throws UnsupportedOperationException if the capabilities in xml config are invalid or
- * incompatible.
- */
- // TODO: Add developer.android.com link for the format of the xml.
- @NonNull
- public static ApplicationMediaCapabilities createFromXml(@NonNull XmlPullParser xmlParser) {
- ApplicationMediaCapabilities.Builder builder = new ApplicationMediaCapabilities.Builder();
- builder.parseXml(xmlParser);
- return builder.build();
- }
-
- /**
- * Builder class for {@link ApplicationMediaCapabilities} objects.
- * Use this class to configure and create an ApplicationMediaCapabilities instance. Builder
- * could be created from an existing ApplicationMediaCapabilities object, from a xml file or
- * MediaCodecList.
- * //TODO(hkuang): Add xml parsing support to the builder.
- */
- public final static class Builder {
- /** List of supported video codec mime types. */
- private Set<String> mSupportedVideoMimeTypes = new HashSet<>();
-
- /** List of supported hdr types. */
- private Set<String> mSupportedHdrTypes = new HashSet<>();
-
- /** List of unsupported video codec mime types. */
- private Set<String> mUnsupportedVideoMimeTypes = new HashSet<>();
-
- /** List of unsupported hdr types. */
- private Set<String> mUnsupportedHdrTypes = new HashSet<>();
-
- private boolean mIsSlowMotionSupported = false;
-
- /* Map to save the format read from the xml. */
- private Map<String, Boolean> mFormatSupportedMap = new HashMap<String, Boolean>();
-
- /**
- * Constructs a new Builder with all the supports default to false.
- */
- public Builder() {
- }
-
- private void parseXml(@NonNull XmlPullParser xmlParser)
- throws UnsupportedOperationException {
- if (xmlParser == null) {
- throw new IllegalArgumentException("XmlParser must not be null");
- }
-
- try {
- while (xmlParser.next() != XmlPullParser.START_TAG) {
- continue;
- }
-
- // Validates the tag is "media-capabilities".
- if (!xmlParser.getName().equals("media-capabilities")) {
- throw new UnsupportedOperationException("Invalid tag");
- }
-
- xmlParser.next();
- while (xmlParser.getEventType() != XmlPullParser.END_TAG) {
- while (xmlParser.getEventType() != XmlPullParser.START_TAG) {
- if (xmlParser.getEventType() == XmlPullParser.END_DOCUMENT) {
- return;
- }
- xmlParser.next();
- }
-
- // Validates the tag is "format".
- if (xmlParser.getName().equals("format")) {
- parseFormatTag(xmlParser);
- } else {
- throw new UnsupportedOperationException("Invalid tag");
- }
- while (xmlParser.getEventType() != XmlPullParser.END_TAG) {
- xmlParser.next();
- }
- xmlParser.next();
- }
- } catch (XmlPullParserException xppe) {
- throw new UnsupportedOperationException("Ill-formatted xml file");
- } catch (java.io.IOException ioe) {
- throw new UnsupportedOperationException("Unable to read xml file");
- }
- }
-
- private void parseFormatTag(XmlPullParser xmlParser) {
- String name = null;
- String supported = null;
- for (int i = 0; i < xmlParser.getAttributeCount(); i++) {
- String attrName = xmlParser.getAttributeName(i);
- if (attrName.equals("name")) {
- name = xmlParser.getAttributeValue(i);
- } else if (attrName.equals("supported")) {
- supported = xmlParser.getAttributeValue(i);
- } else {
- throw new UnsupportedOperationException("Invalid attribute name " + attrName);
- }
- }
-
- if (name != null && supported != null) {
- if (!supported.equals("true") && !supported.equals("false")) {
- throw new UnsupportedOperationException(
- ("Supported value must be either true or false"));
- }
- boolean isSupported = Boolean.parseBoolean(supported);
-
- // Check if the format is already found before.
- if (mFormatSupportedMap.get(name) != null && mFormatSupportedMap.get(name)
- != isSupported) {
- throw new UnsupportedOperationException(
- "Format: " + name + " has conflict supported value");
- }
-
- switch (name) {
- case "HEVC":
- if (isSupported) {
- mSupportedVideoMimeTypes.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
- } else {
- mUnsupportedVideoMimeTypes.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
- }
- break;
- case "VP9":
- if (isSupported) {
- mSupportedVideoMimeTypes.add(MediaFormat.MIMETYPE_VIDEO_VP9);
- } else {
- mUnsupportedVideoMimeTypes.add(MediaFormat.MIMETYPE_VIDEO_VP9);
- }
- break;
- case "AV1":
- if (isSupported) {
- mSupportedVideoMimeTypes.add(MediaFormat.MIMETYPE_VIDEO_AV1);
- } else {
- mUnsupportedVideoMimeTypes.add(MediaFormat.MIMETYPE_VIDEO_AV1);
- }
- break;
- case "HDR10":
- if (isSupported) {
- mSupportedHdrTypes.add(MediaFeature.HdrType.HDR10);
- } else {
- mUnsupportedHdrTypes.add(MediaFeature.HdrType.HDR10);
- }
- break;
- case "HDR10Plus":
- if (isSupported) {
- mSupportedHdrTypes.add(MediaFeature.HdrType.HDR10_PLUS);
- } else {
- mUnsupportedHdrTypes.add(MediaFeature.HdrType.HDR10_PLUS);
- }
- break;
- case "Dolby-Vision":
- if (isSupported) {
- mSupportedHdrTypes.add(MediaFeature.HdrType.DOLBY_VISION);
- } else {
- mUnsupportedHdrTypes.add(MediaFeature.HdrType.DOLBY_VISION);
- }
- break;
- case "HLG":
- if (isSupported) {
- mSupportedHdrTypes.add(MediaFeature.HdrType.HLG);
- } else {
- mUnsupportedHdrTypes.add(MediaFeature.HdrType.HLG);
- }
- break;
- case "SlowMotion":
- mIsSlowMotionSupported = isSupported;
- break;
- default:
- Log.w(TAG, "Invalid format name " + name);
- }
- // Save the name and isSupported into the map for validate later.
- mFormatSupportedMap.put(name, isSupported);
- } else {
- throw new UnsupportedOperationException(
- "Format name and supported must both be specified");
- }
- }
-
- /**
- * Builds a {@link ApplicationMediaCapabilities} object.
- *
- * @return a new {@link ApplicationMediaCapabilities} instance successfully initialized
- * with all the parameters set on this <code>Builder</code>.
- * @throws UnsupportedOperationException if the parameters set on the
- * <code>Builder</code> were incompatible, or if they
- * are not supported by the
- * device.
- */
- @NonNull
- public ApplicationMediaCapabilities build() {
- Log.d(TAG,
- "Building ApplicationMediaCapabilities with: (Supported HDR: "
- + mSupportedHdrTypes.toString() + " Unsupported HDR: "
- + mUnsupportedHdrTypes.toString() + ") (Supported Codec: "
- + " " + mSupportedVideoMimeTypes.toString() + " Unsupported Codec:"
- + mUnsupportedVideoMimeTypes.toString() + ") "
- + mIsSlowMotionSupported);
-
- // If hdr is supported, application must also support hevc.
- if (!mSupportedHdrTypes.isEmpty() && !mSupportedVideoMimeTypes.contains(
- MediaFormat.MIMETYPE_VIDEO_HEVC)) {
- throw new UnsupportedOperationException("Only support HEVC mime type");
- }
- return new ApplicationMediaCapabilities(this);
- }
-
- /**
- * Adds a supported video codec mime type.
- *
- * @param codecMime Supported codec mime types. Must be one of the mime type defined
- * in {@link MediaFormat}.
- * @throws IllegalArgumentException if mime type is not valid.
- */
- @NonNull
- public Builder addSupportedVideoMimeType(
- @NonNull String codecMime) {
- mSupportedVideoMimeTypes.add(codecMime);
- return this;
- }
-
- private List<String> getSupportedVideoMimeTypes() {
- return new ArrayList<>(mSupportedVideoMimeTypes);
- }
-
- private boolean isValidVideoCodecMimeType(@NonNull String codecMime) {
- if (!codecMime.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_HEVC)
- && !codecMime.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_VP9)
- && !codecMime.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_AV1)) {
- return false;
- }
- return true;
- }
-
- /**
- * Adds an unsupported video codec mime type.
- *
- * @param codecMime Unsupported codec mime type. Must be one of the mime type defined
- * in {@link MediaFormat}.
- * @throws IllegalArgumentException if mime type is not valid.
- */
- @NonNull
- public Builder addUnsupportedVideoMimeType(
- @NonNull String codecMime) {
- if (!isValidVideoCodecMimeType(codecMime)) {
- throw new IllegalArgumentException("Invalid codec mime type: " + codecMime);
- }
- mUnsupportedVideoMimeTypes.add(codecMime);
- return this;
- }
-
- private List<String> getUnsupportedVideoMimeTypes() {
- return new ArrayList<>(mUnsupportedVideoMimeTypes);
- }
-
- /**
- * Adds a supported hdr type.
- *
- * @param hdrType Supported hdr type. Must be one of the String defined in
- * {@link MediaFeature.HdrType}.
- * @throws IllegalArgumentException if hdrType is not valid.
- */
- @NonNull
- public Builder addSupportedHdrType(
- @NonNull @MediaFeature.MediaHdrType String hdrType) {
- if (!isValidVideoCodecHdrType(hdrType)) {
- throw new IllegalArgumentException("Invalid hdr type: " + hdrType);
- }
- mSupportedHdrTypes.add(hdrType);
- return this;
- }
-
- private List<String> getSupportedHdrTypes() {
- return new ArrayList<>(mSupportedHdrTypes);
- }
-
- private boolean isValidVideoCodecHdrType(@NonNull String hdrType) {
- if (!hdrType.equals(MediaFeature.HdrType.DOLBY_VISION)
- && !hdrType.equals(MediaFeature.HdrType.HDR10)
- && !hdrType.equals(MediaFeature.HdrType.HDR10_PLUS)
- && !hdrType.equals(MediaFeature.HdrType.HLG)) {
- return false;
- }
- return true;
- }
-
- /**
- * Adds an unsupported hdr type.
- *
- * @param hdrType Unsupported hdr type. Must be one of the String defined in
- * {@link MediaFeature.HdrType}.
- * @throws IllegalArgumentException if hdrType is not valid.
- */
- @NonNull
- public Builder addUnsupportedHdrType(
- @NonNull @MediaFeature.MediaHdrType String hdrType) {
- if (!isValidVideoCodecHdrType(hdrType)) {
- throw new IllegalArgumentException("Invalid hdr type: " + hdrType);
- }
- mUnsupportedHdrTypes.add(hdrType);
- return this;
- }
-
- private List<String> getUnsupportedHdrTypes() {
- return new ArrayList<>(mUnsupportedHdrTypes);
- }
-
- /**
- * Sets whether slow-motion video is supported.
- * If an application indicates support for slow-motion, it is application's responsibility
- * to parse the slow-motion videos using their own parser or using support library.
- * @see android.media.MediaFormat#KEY_SLOW_MOTION_MARKERS
- * @hide
- */
- @NonNull
- public Builder setSlowMotionSupported(boolean slowMotionSupported) {
- mIsSlowMotionSupported = slowMotionSupported;
- return this;
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/BaseMediaParceledListSlice.java b/apex/media/framework/java/android/media/BaseMediaParceledListSlice.java
deleted file mode 100644
index 915f3f6a3..0000000
--- a/apex/media/framework/java/android/media/BaseMediaParceledListSlice.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This is a copied version of BaseParceledListSlice in framework with hidden API usages
- * removed.
- *
- * Transfer a large list of Parcelable objects across an IPC. Splits into
- * multiple transactions if needed.
- *
- * Caveat: for efficiency and security, all elements must be the same concrete type.
- * In order to avoid writing the class name of each object, we must ensure that
- * each object is the same type, or else unparceling then reparceling the data may yield
- * a different result if the class name encoded in the Parcelable is a Base type.
- * See b/17671747.
- *
- * @hide
- */
-abstract class BaseMediaParceledListSlice<T> implements Parcelable {
- private static String TAG = "BaseMediaParceledListSlice";
- private static final boolean DEBUG = false;
-
- /*
- * TODO get this number from somewhere else. For now set it to a quarter of
- * the 1MB limit.
- */
- // private static final int MAX_IPC_SIZE = IBinder.getSuggestedMaxIpcSizeBytes();
- private static final int MAX_IPC_SIZE = 64 * 1024;
-
- private final List<T> mList;
-
- private int mInlineCountLimit = Integer.MAX_VALUE;
-
- public BaseMediaParceledListSlice(List<T> list) {
- mList = list;
- }
-
- @SuppressWarnings("unchecked")
- BaseMediaParceledListSlice(Parcel p, ClassLoader loader) {
- final int N = p.readInt();
- mList = new ArrayList<T>(N);
- if (DEBUG) Log.d(TAG, "Retrieving " + N + " items");
- if (N <= 0) {
- return;
- }
-
- Parcelable.Creator<?> creator = readParcelableCreator(p, loader);
- Class<?> listElementClass = null;
-
- int i = 0;
- while (i < N) {
- if (p.readInt() == 0) {
- break;
- }
-
- final T parcelable = readCreator(creator, p, loader);
- if (listElementClass == null) {
- listElementClass = parcelable.getClass();
- } else {
- verifySameType(listElementClass, parcelable.getClass());
- }
-
- mList.add(parcelable);
-
- if (DEBUG) Log.d(TAG, "Read inline #" + i + ": " + mList.get(mList.size()-1));
- i++;
- }
- if (i >= N) {
- return;
- }
- final IBinder retriever = p.readStrongBinder();
- while (i < N) {
- if (DEBUG) Log.d(TAG, "Reading more @" + i + " of " + N + ": retriever=" + retriever);
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInt(i);
- try {
- retriever.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0);
- } catch (RemoteException e) {
- Log.w(TAG, "Failure retrieving array; only received " + i + " of " + N, e);
- return;
- }
- while (i < N && reply.readInt() != 0) {
- final T parcelable = readCreator(creator, reply, loader);
- verifySameType(listElementClass, parcelable.getClass());
-
- mList.add(parcelable);
-
- if (DEBUG) Log.d(TAG, "Read extra #" + i + ": " + mList.get(mList.size()-1));
- i++;
- }
- reply.recycle();
- data.recycle();
- }
- }
-
- private T readCreator(Parcelable.Creator<?> creator, Parcel p, ClassLoader loader) {
- if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
- Parcelable.ClassLoaderCreator<?> classLoaderCreator =
- (Parcelable.ClassLoaderCreator<?>) creator;
- return (T) classLoaderCreator.createFromParcel(p, loader);
- }
- return (T) creator.createFromParcel(p);
- }
-
- private static void verifySameType(final Class<?> expected, final Class<?> actual) {
- if (!actual.equals(expected)) {
- throw new IllegalArgumentException("Can't unparcel type "
- + (actual == null ? null : actual.getName()) + " in list of type "
- + (expected == null ? null : expected.getName()));
- }
- }
-
- public List<T> getList() {
- return mList;
- }
-
- /**
- * Set a limit on the maximum number of entries in the array that will be included
- * inline in the initial parcelling of this object.
- */
- public void setInlineCountLimit(int maxCount) {
- mInlineCountLimit = maxCount;
- }
-
- /**
- * Write this to another Parcel. Note that this discards the internal Parcel
- * and should not be used anymore. This is so we can pass this to a Binder
- * where we won't have a chance to call recycle on this.
- */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- final int N = mList.size();
- final int callFlags = flags;
- dest.writeInt(N);
- if (DEBUG) Log.d(TAG, "Writing " + N + " items");
- if (N > 0) {
- final Class<?> listElementClass = mList.get(0).getClass();
- writeParcelableCreator(mList.get(0), dest);
- int i = 0;
- while (i < N && i < mInlineCountLimit && dest.dataSize() < MAX_IPC_SIZE) {
- dest.writeInt(1);
-
- final T parcelable = mList.get(i);
- verifySameType(listElementClass, parcelable.getClass());
- writeElement(parcelable, dest, callFlags);
-
- if (DEBUG) Log.d(TAG, "Wrote inline #" + i + ": " + mList.get(i));
- i++;
- }
- if (i < N) {
- dest.writeInt(0);
- Binder retriever = new Binder() {
- @Override
- protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
- throws RemoteException {
- if (code != FIRST_CALL_TRANSACTION) {
- return super.onTransact(code, data, reply, flags);
- }
- int i = data.readInt();
- if (DEBUG) Log.d(TAG, "Writing more @" + i + " of " + N);
- while (i < N && reply.dataSize() < MAX_IPC_SIZE) {
- reply.writeInt(1);
-
- final T parcelable = mList.get(i);
- verifySameType(listElementClass, parcelable.getClass());
- writeElement(parcelable, reply, callFlags);
-
- if (DEBUG) Log.d(TAG, "Wrote extra #" + i + ": " + mList.get(i));
- i++;
- }
- if (i < N) {
- if (DEBUG) Log.d(TAG, "Breaking @" + i + " of " + N);
- reply.writeInt(0);
- }
- return true;
- }
- };
- if (DEBUG) Log.d(TAG, "Breaking @" + i + " of " + N + ": retriever=" + retriever);
- dest.writeStrongBinder(retriever);
- }
- }
- }
-
- abstract void writeElement(T parcelable, Parcel reply, int callFlags);
-
- abstract void writeParcelableCreator(T parcelable, Parcel dest);
-
- abstract Parcelable.Creator<?> readParcelableCreator(Parcel from, ClassLoader loader);
-}
diff --git a/apex/media/framework/java/android/media/BufferingParams.java b/apex/media/framework/java/android/media/BufferingParams.java
deleted file mode 100644
index 04af028..0000000
--- a/apex/media/framework/java/android/media/BufferingParams.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright 2017 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 android.media;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Structure for source buffering management params.
- *
- * Used by {@link MediaPlayer#getBufferingParams()} and
- * {@link MediaPlayer#setBufferingParams(BufferingParams)}
- * to control source buffering behavior.
- *
- * <p>There are two stages of source buffering in {@link MediaPlayer}: initial buffering
- * (when {@link MediaPlayer} is being prepared) and rebuffering (when {@link MediaPlayer}
- * is playing back source). {@link BufferingParams} includes corresponding marks for each
- * stage of source buffering. The marks are time based (in milliseconds).
- *
- * <p>{@link MediaPlayer} source component has default marks which can be queried by
- * calling {@link MediaPlayer#getBufferingParams()} before any change is made by
- * {@link MediaPlayer#setBufferingParams()}.
- * <ul>
- * <li><strong>initial buffering:</strong> initialMarkMs is used when
- * {@link MediaPlayer} is being prepared. When cached data amount exceeds this mark
- * {@link MediaPlayer} is prepared. </li>
- * <li><strong>rebuffering during playback:</strong> resumePlaybackMarkMs is used when
- * {@link MediaPlayer} is playing back content.
- * <ul>
- * <li> {@link MediaPlayer} has internal mark, namely pausePlaybackMarkMs, to decide when
- * to pause playback if cached data amount runs low. This internal mark varies based on
- * type of data source. </li>
- * <li> When cached data amount exceeds resumePlaybackMarkMs, {@link MediaPlayer} will
- * resume playback if it has been paused due to low cached data amount. The internal mark
- * pausePlaybackMarkMs shall be less than resumePlaybackMarkMs. </li>
- * <li> {@link MediaPlayer} has internal mark, namely pauseRebufferingMarkMs, to decide
- * when to pause rebuffering. Apparently, this internal mark shall be no less than
- * resumePlaybackMarkMs. </li>
- * <li> {@link MediaPlayer} has internal mark, namely resumeRebufferingMarkMs, to decide
- * when to resume buffering. This internal mark varies based on type of data source. This
- * mark shall be larger than pausePlaybackMarkMs, and less than pauseRebufferingMarkMs.
- * </li>
- * </ul> </li>
- * </ul>
- * <p>Users should use {@link Builder} to change {@link BufferingParams}.
- * @hide
- */
-public final class BufferingParams implements Parcelable {
- private static final int BUFFERING_NO_MARK = -1;
-
- // params
- private int mInitialMarkMs = BUFFERING_NO_MARK;
-
- private int mResumePlaybackMarkMs = BUFFERING_NO_MARK;
-
- private BufferingParams() {
- }
-
- /**
- * Return initial buffering mark in milliseconds.
- * @return initial buffering mark in milliseconds
- */
- public int getInitialMarkMs() {
- return mInitialMarkMs;
- }
-
- /**
- * Return the mark in milliseconds for resuming playback.
- * @return the mark for resuming playback in milliseconds
- */
- public int getResumePlaybackMarkMs() {
- return mResumePlaybackMarkMs;
- }
-
- /**
- * Builder class for {@link BufferingParams} objects.
- * <p> Here is an example where <code>Builder</code> is used to define the
- * {@link BufferingParams} to be used by a {@link MediaPlayer} instance:
- *
- * <pre class="prettyprint">
- * BufferingParams myParams = mediaplayer.getDefaultBufferingParams();
- * myParams = new BufferingParams.Builder(myParams)
- * .setInitialMarkMs(10000)
- * .setResumePlaybackMarkMs(15000)
- * .build();
- * mediaplayer.setBufferingParams(myParams);
- * </pre>
- */
- public static class Builder {
- private int mInitialMarkMs = BUFFERING_NO_MARK;
- private int mResumePlaybackMarkMs = BUFFERING_NO_MARK;
-
- /**
- * Constructs a new Builder with the defaults.
- * By default, all marks are -1.
- */
- public Builder() {
- }
-
- /**
- * Constructs a new Builder from a given {@link BufferingParams} instance
- * @param bp the {@link BufferingParams} object whose data will be reused
- * in the new Builder.
- */
- public Builder(BufferingParams bp) {
- mInitialMarkMs = bp.mInitialMarkMs;
- mResumePlaybackMarkMs = bp.mResumePlaybackMarkMs;
- }
-
- /**
- * Combines all of the fields that have been set and return a new
- * {@link BufferingParams} object. <code>IllegalStateException</code> will be
- * thrown if there is conflict between fields.
- * @return a new {@link BufferingParams} object
- */
- public BufferingParams build() {
- BufferingParams bp = new BufferingParams();
- bp.mInitialMarkMs = mInitialMarkMs;
- bp.mResumePlaybackMarkMs = mResumePlaybackMarkMs;
-
- return bp;
- }
-
- /**
- * Sets the time based mark in milliseconds for initial buffering.
- * @param markMs time based mark in milliseconds
- * @return the same Builder instance.
- */
- public Builder setInitialMarkMs(int markMs) {
- mInitialMarkMs = markMs;
- return this;
- }
-
- /**
- * Sets the time based mark in milliseconds for resuming playback.
- * @param markMs time based mark in milliseconds for resuming playback
- * @return the same Builder instance.
- */
- public Builder setResumePlaybackMarkMs(int markMs) {
- mResumePlaybackMarkMs = markMs;
- return this;
- }
- }
-
- private BufferingParams(Parcel in) {
- mInitialMarkMs = in.readInt();
- mResumePlaybackMarkMs = in.readInt();
- }
-
- public static final @android.annotation.NonNull Parcelable.Creator<BufferingParams> CREATOR =
- new Parcelable.Creator<BufferingParams>() {
- @Override
- public BufferingParams createFromParcel(Parcel in) {
- return new BufferingParams(in);
- }
-
- @Override
- public BufferingParams[] newArray(int size) {
- return new BufferingParams[size];
- }
- };
-
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mInitialMarkMs);
- dest.writeInt(mResumePlaybackMarkMs);
- }
-}
diff --git a/apex/media/framework/java/android/media/Controller2Link.java b/apex/media/framework/java/android/media/Controller2Link.java
deleted file mode 100644
index 8eefec7..0000000
--- a/apex/media/framework/java/android/media/Controller2Link.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-
-import java.util.Objects;
-
-/**
- * Handles incoming commands from {@link MediaSession2} to {@link MediaController2}.
- * @hide
- */
-// @SystemApi
-public final class Controller2Link implements Parcelable {
- private static final String TAG = "Controller2Link";
- private static final boolean DEBUG = MediaController2.DEBUG;
-
- public static final @android.annotation.NonNull Parcelable.Creator<Controller2Link> CREATOR =
- new Parcelable.Creator<Controller2Link>() {
- @Override
- public Controller2Link createFromParcel(Parcel in) {
- return new Controller2Link(in);
- }
-
- @Override
- public Controller2Link[] newArray(int size) {
- return new Controller2Link[size];
- }
- };
-
-
- private final MediaController2 mController;
- private final IMediaController2 mIController;
-
- public Controller2Link(MediaController2 controller) {
- mController = controller;
- mIController = new Controller2Stub();
- }
-
- Controller2Link(Parcel in) {
- mController = null;
- mIController = IMediaController2.Stub.asInterface(in.readStrongBinder());
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeStrongBinder(mIController.asBinder());
- }
-
- @Override
- public int hashCode() {
- return mIController.asBinder().hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Controller2Link)) {
- return false;
- }
- Controller2Link other = (Controller2Link) obj;
- return Objects.equals(mIController.asBinder(), other.mIController.asBinder());
- }
-
- /** Interface method for IMediaController2.notifyConnected */
- public void notifyConnected(int seq, Bundle connectionResult) {
- try {
- mIController.notifyConnected(seq, connectionResult);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Interface method for IMediaController2.notifyDisonnected */
- public void notifyDisconnected(int seq) {
- try {
- mIController.notifyDisconnected(seq);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Interface method for IMediaController2.notifyPlaybackActiveChanged */
- public void notifyPlaybackActiveChanged(int seq, boolean playbackActive) {
- try {
- mIController.notifyPlaybackActiveChanged(seq, playbackActive);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Interface method for IMediaController2.sendSessionCommand */
- public void sendSessionCommand(int seq, Session2Command command, Bundle args,
- ResultReceiver resultReceiver) {
- try {
- mIController.sendSessionCommand(seq, command, args, resultReceiver);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Interface method for IMediaController2.cancelSessionCommand */
- public void cancelSessionCommand(int seq) {
- try {
- mIController.cancelSessionCommand(seq);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Stub implementation for IMediaController2.notifyConnected */
- public void onConnected(int seq, Bundle connectionResult) {
- if (connectionResult == null) {
- onDisconnected(seq);
- return;
- }
- mController.onConnected(seq, connectionResult);
- }
-
- /** Stub implementation for IMediaController2.notifyDisonnected */
- public void onDisconnected(int seq) {
- mController.onDisconnected(seq);
- }
-
- /** Stub implementation for IMediaController2.notifyPlaybackActiveChanged */
- public void onPlaybackActiveChanged(int seq, boolean playbackActive) {
- mController.onPlaybackActiveChanged(seq, playbackActive);
- }
-
- /** Stub implementation for IMediaController2.sendSessionCommand */
- public void onSessionCommand(int seq, Session2Command command, Bundle args,
- ResultReceiver resultReceiver) {
- mController.onSessionCommand(seq, command, args, resultReceiver);
- }
-
- /** Stub implementation for IMediaController2.cancelSessionCommand */
- public void onCancelCommand(int seq) {
- mController.onCancelCommand(seq);
- }
-
- private class Controller2Stub extends IMediaController2.Stub {
- @Override
- public void notifyConnected(int seq, Bundle connectionResult) {
- final long token = Binder.clearCallingIdentity();
- try {
- Controller2Link.this.onConnected(seq, connectionResult);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void notifyDisconnected(int seq) {
- final long token = Binder.clearCallingIdentity();
- try {
- Controller2Link.this.onDisconnected(seq);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void notifyPlaybackActiveChanged(int seq, boolean playbackActive) {
- final long token = Binder.clearCallingIdentity();
- try {
- Controller2Link.this.onPlaybackActiveChanged(seq, playbackActive);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void sendSessionCommand(int seq, Session2Command command, Bundle args,
- ResultReceiver resultReceiver) {
- final long token = Binder.clearCallingIdentity();
- try {
- Controller2Link.this.onSessionCommand(seq, command, args, resultReceiver);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void cancelSessionCommand(int seq) {
- final long token = Binder.clearCallingIdentity();
- try {
- Controller2Link.this.onCancelCommand(seq);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/DataSourceCallback.java b/apex/media/framework/java/android/media/DataSourceCallback.java
deleted file mode 100644
index c297ecd..0000000
--- a/apex/media/framework/java/android/media/DataSourceCallback.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2017 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 android.media;
-
-import android.annotation.NonNull;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * For supplying media data to the framework. Implement this if your app has
- * special requirements for the way media data is obtained.
- *
- * <p class="note">Methods of this interface may be called on multiple different
- * threads. There will be a thread synchronization point between each call to ensure that
- * modifications to the state of your DataSourceCallback are visible to future calls. This means
- * you don't need to do your own synchronization unless you're modifying the
- * DataSourceCallback from another thread while it's being used by the framework.</p>
- *
- * @hide
- */
-public abstract class DataSourceCallback implements Closeable {
-
- public static final int END_OF_STREAM = -1;
-
- /**
- * Called to request data from the given position.
- *
- * Implementations should should write up to {@code size} bytes into
- * {@code buffer}, and return the number of bytes written.
- *
- * Return {@code 0} if size is zero (thus no bytes are read).
- *
- * Return {@code -1} to indicate that end of stream is reached.
- *
- * @param position the position in the data source to read from.
- * @param buffer the buffer to read the data into.
- * @param offset the offset within buffer to read the data into.
- * @param size the number of bytes to read.
- * @throws IOException on fatal errors.
- * @return the number of bytes read, or {@link #END_OF_STREAM} if end of stream is reached.
- */
- public abstract int readAt(long position, @NonNull byte[] buffer, int offset, int size)
- throws IOException;
-
- /**
- * Called to get the size of the data source.
- *
- * @throws IOException on fatal errors
- * @return the size of data source in bytes, or -1 if the size is unknown.
- */
- public abstract long getSize() throws IOException;
-}
diff --git a/apex/media/framework/java/android/media/MediaCommunicationManager.java b/apex/media/framework/java/android/media/MediaCommunicationManager.java
deleted file mode 100644
index ef5552e..0000000
--- a/apex/media/framework/java/android/media/MediaCommunicationManager.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.media;
-
-import static android.Manifest.permission.MEDIA_CONTENT_CONTROL;
-import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
-
-import android.annotation.CallbackExecutor;
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
-import android.annotation.SystemService;
-import android.content.Context;
-import android.media.session.MediaSession;
-import android.media.session.MediaSessionManager;
-import android.os.Build;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.service.media.MediaBrowserService;
-import android.util.Log;
-import android.view.KeyEvent;
-
-import androidx.annotation.RequiresApi;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.modules.annotation.MinSdk;
-import com.android.modules.utils.build.SdkLevel;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.Executor;
-
-/**
- * Provides support for interacting with {@link android.media.MediaSession2 MediaSession2s}
- * that applications have published to express their ongoing media playback state.
- */
-@MinSdk(Build.VERSION_CODES.S)
-@RequiresApi(Build.VERSION_CODES.S)
-@SystemService(Context.MEDIA_COMMUNICATION_SERVICE)
-public class MediaCommunicationManager {
- private static final String TAG = "MediaCommunicationManager";
-
- /**
- * The manager version used from beginning.
- */
- private static final int VERSION_1 = 1;
-
- /**
- * Current manager version.
- */
- private static final int CURRENT_VERSION = VERSION_1;
-
- private final Context mContext;
- // Do not access directly use getService().
- private IMediaCommunicationService mService;
-
- private final Object mLock = new Object();
- private final CopyOnWriteArrayList<SessionCallbackRecord> mTokenCallbackRecords =
- new CopyOnWriteArrayList<>();
-
- @GuardedBy("mLock")
- private MediaCommunicationServiceCallbackStub mCallbackStub;
-
- // TODO: remove this when MCS implements dispatchMediaKeyEvent.
- private MediaSessionManager mMediaSessionManager;
-
- /**
- * @hide
- */
- public MediaCommunicationManager(@NonNull Context context) {
- if (!SdkLevel.isAtLeastS()) {
- throw new UnsupportedOperationException("Android version must be S or greater.");
- }
- mContext = context;
- }
-
- /**
- * Gets the version of this {@link MediaCommunicationManager}.
- */
- public @IntRange(from = 1) int getVersion() {
- return CURRENT_VERSION;
- }
-
- /**
- * Notifies that a new {@link MediaSession2} with type {@link Session2Token#TYPE_SESSION} is
- * created.
- * @param token newly created session2 token
- * @hide
- */
- public void notifySession2Created(@NonNull Session2Token token) {
- Objects.requireNonNull(token, "token shouldn't be null");
- if (token.getType() != Session2Token.TYPE_SESSION) {
- throw new IllegalArgumentException("token's type should be TYPE_SESSION");
- }
- try {
- getService().notifySession2Created(token);
- } catch (RemoteException e) {
- e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Checks whether the remote user is a trusted app.
- * <p>
- * An app is trusted if the app holds the
- * {@link android.Manifest.permission#MEDIA_CONTENT_CONTROL} permission or has an enabled
- * notification listener.
- *
- * @param userInfo The remote user info from either
- * {@link MediaSession#getCurrentControllerInfo()} or
- * {@link MediaBrowserService#getCurrentBrowserInfo()}.
- * @return {@code true} if the remote user is trusted or {@code false} otherwise.
- * @hide
- */
- public boolean isTrustedForMediaControl(@NonNull MediaSessionManager.RemoteUserInfo userInfo) {
- Objects.requireNonNull(userInfo, "userInfo shouldn't be null");
- if (userInfo.getPackageName() == null) {
- return false;
- }
- try {
- return getService().isTrusted(
- userInfo.getPackageName(), userInfo.getPid(), userInfo.getUid());
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot communicate with the service.", e);
- }
- return false;
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Gets a list of {@link Session2Token} with type {@link Session2Token#TYPE_SESSION} for the
- * current user.
- * <p>
- * Although this API can be used without any restriction, each session owners can accept or
- * reject your uses of {@link MediaSession2}.
- *
- * @return A list of {@link Session2Token}.
- */
- @NonNull
- public List<Session2Token> getSession2Tokens() {
- return getSession2Tokens(UserHandle.myUserId());
- }
-
- /**
- * Adds a callback to be notified when the list of active sessions changes.
- * <p>
- * This requires the {@link android.Manifest.permission#MEDIA_CONTENT_CONTROL} permission be
- * held by the calling app.
- * </p>
- * @hide
- */
- @SystemApi(client = MODULE_LIBRARIES)
- @RequiresPermission(MEDIA_CONTENT_CONTROL)
- public void registerSessionCallback(@CallbackExecutor @NonNull Executor executor,
- @NonNull SessionCallback callback) {
- Objects.requireNonNull(executor, "executor must not be null");
- Objects.requireNonNull(callback, "callback must not be null");
-
- if (!mTokenCallbackRecords.addIfAbsent(
- new SessionCallbackRecord(executor, callback))) {
- Log.w(TAG, "registerSession2TokenCallback: Ignoring the same callback");
- return;
- }
- synchronized (mLock) {
- if (mCallbackStub == null) {
- MediaCommunicationServiceCallbackStub callbackStub =
- new MediaCommunicationServiceCallbackStub();
- try {
- getService().registerCallback(callbackStub, mContext.getPackageName());
- mCallbackStub = callbackStub;
- } catch (RemoteException ex) {
- Log.e(TAG, "Failed to register callback.", ex);
- }
- }
- }
- }
-
- /**
- * Stops receiving active sessions updates on the specified callback.
- * @hide
- */
- @SystemApi(client = MODULE_LIBRARIES)
- public void unregisterSessionCallback(@NonNull SessionCallback callback) {
- if (!mTokenCallbackRecords.remove(
- new SessionCallbackRecord(null, callback))) {
- Log.w(TAG, "unregisterSession2TokenCallback: Ignoring an unknown callback.");
- return;
- }
- synchronized (mLock) {
- if (mCallbackStub != null && mTokenCallbackRecords.isEmpty()) {
- try {
- getService().unregisterCallback(mCallbackStub);
- } catch (RemoteException ex) {
- Log.e(TAG, "Failed to unregister callback.", ex);
- }
- mCallbackStub = null;
- }
- }
- }
-
- private IMediaCommunicationService getService() {
- if (mService == null) {
- mService = IMediaCommunicationService.Stub.asInterface(
- MediaFrameworkInitializer.getMediaServiceManager()
- .getMediaCommunicationServiceRegisterer()
- .get());
- }
- return mService;
- }
-
- // TODO: remove this when MCS implements dispatchMediaKeyEvent.
- private MediaSessionManager getMediaSessionManager() {
- if (mMediaSessionManager == null) {
- mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
- }
- return mMediaSessionManager;
- }
-
- private List<Session2Token> getSession2Tokens(int userId) {
- try {
- MediaParceledListSlice slice = getService().getSession2Tokens(userId);
- return slice == null ? Collections.emptyList() : slice.getList();
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to get session tokens", e);
- }
- return Collections.emptyList();
- }
-
- /**
- * Sends a media key event. The receiver will be selected automatically.
- *
- * @param keyEvent the key event to send
- * @param asSystemService if {@code true}, the event sent to the session as if it was come from
- * the system service instead of the app process.
- * @hide
- */
- @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
- public void dispatchMediaKeyEvent(@NonNull KeyEvent keyEvent, boolean asSystemService) {
- Objects.requireNonNull(keyEvent, "keyEvent shouldn't be null");
-
- // When MCS handles this, caller is changed.
- // TODO: remove this when MCS implementation is done.
- if (!asSystemService) {
- getMediaSessionManager().dispatchMediaKeyEvent(keyEvent, false);
- return;
- }
-
- try {
- getService().dispatchMediaKeyEvent(mContext.getPackageName(),
- keyEvent, asSystemService);
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to send key event.", e);
- }
- }
-
- /**
- * Callback for listening to changes to the sessions.
- * @see #registerSessionCallback(Executor, SessionCallback)
- * @hide
- */
- @SystemApi(client = MODULE_LIBRARIES)
- public interface SessionCallback {
- /**
- * Called when a new {@link MediaSession2 media session2} is created.
- * @param token the newly created token
- */
- default void onSession2TokenCreated(@NonNull Session2Token token) {}
-
- /**
- * Called when {@link #getSession2Tokens() session tokens} are changed.
- */
- default void onSession2TokensChanged(@NonNull List<Session2Token> tokens) {}
- }
-
- private static final class SessionCallbackRecord {
- public final Executor executor;
- public final SessionCallback callback;
-
- SessionCallbackRecord(Executor executor, SessionCallback callback) {
- this.executor = executor;
- this.callback = callback;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(callback);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof SessionCallbackRecord)) {
- return false;
- }
- return Objects.equals(this.callback, ((SessionCallbackRecord) obj).callback);
- }
- }
-
- class MediaCommunicationServiceCallbackStub extends IMediaCommunicationServiceCallback.Stub {
- @Override
- public void onSession2Created(Session2Token token) throws RemoteException {
- for (SessionCallbackRecord record : mTokenCallbackRecords) {
- record.executor.execute(() -> record.callback.onSession2TokenCreated(token));
- }
- }
-
- @Override
- public void onSession2Changed(MediaParceledListSlice tokens) throws RemoteException {
- List<Session2Token> tokenList = tokens.getList();
- for (SessionCallbackRecord record : mTokenCallbackRecords) {
- record.executor.execute(() -> record.callback.onSession2TokensChanged(tokenList));
- }
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaConstants.java b/apex/media/framework/java/android/media/MediaConstants.java
deleted file mode 100644
index ce10889..0000000
--- a/apex/media/framework/java/android/media/MediaConstants.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-class MediaConstants {
- // Bundle key for int
- static final String KEY_PID = "android.media.key.PID";
-
- // Bundle key for String
- static final String KEY_PACKAGE_NAME = "android.media.key.PACKAGE_NAME";
-
- // Bundle key for Parcelable
- static final String KEY_SESSION2LINK = "android.media.key.SESSION2LINK";
- static final String KEY_ALLOWED_COMMANDS = "android.media.key.ALLOWED_COMMANDS";
- static final String KEY_PLAYBACK_ACTIVE = "android.media.key.PLAYBACK_ACTIVE";
- static final String KEY_TOKEN_EXTRAS = "android.media.key.TOKEN_EXTRAS";
- static final String KEY_CONNECTION_HINTS = "android.media.key.CONNECTION_HINTS";
-
- private MediaConstants() {
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaController2.java b/apex/media/framework/java/android/media/MediaController2.java
deleted file mode 100644
index 159e8e5..0000000
--- a/apex/media/framework/java/android/media/MediaController2.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import static android.media.MediaConstants.KEY_ALLOWED_COMMANDS;
-import static android.media.MediaConstants.KEY_CONNECTION_HINTS;
-import static android.media.MediaConstants.KEY_PACKAGE_NAME;
-import static android.media.MediaConstants.KEY_PID;
-import static android.media.MediaConstants.KEY_PLAYBACK_ACTIVE;
-import static android.media.MediaConstants.KEY_SESSION2LINK;
-import static android.media.MediaConstants.KEY_TOKEN_EXTRAS;
-import static android.media.Session2Command.Result.RESULT_ERROR_UNKNOWN_ERROR;
-import static android.media.Session2Command.Result.RESULT_INFO_SKIPPED;
-import static android.media.Session2Token.TYPE_SESSION;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Log;
-
-import java.util.concurrent.Executor;
-
-/**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- *
- * Allows an app to interact with an active {@link MediaSession2} or a
- * {@link MediaSession2Service} which would provide {@link MediaSession2}. Media buttons and other
- * commands can be sent to the session.
- */
-public class MediaController2 implements AutoCloseable {
- static final String TAG = "MediaController2";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- final ControllerCallback mCallback;
-
- private final IBinder.DeathRecipient mDeathRecipient = () -> close();
- private final Context mContext;
- private final Session2Token mSessionToken;
- private final Executor mCallbackExecutor;
- private final Controller2Link mControllerStub;
- private final Handler mResultHandler;
- private final SessionServiceConnection mServiceConnection;
-
- private final Object mLock = new Object();
- //@GuardedBy("mLock")
- private boolean mClosed;
- //@GuardedBy("mLock")
- private int mNextSeqNumber;
- //@GuardedBy("mLock")
- private Session2Link mSessionBinder;
- //@GuardedBy("mLock")
- private Session2CommandGroup mAllowedCommands;
- //@GuardedBy("mLock")
- private Session2Token mConnectedToken;
- //@GuardedBy("mLock")
- private ArrayMap<ResultReceiver, Integer> mPendingCommands;
- //@GuardedBy("mLock")
- private ArraySet<Integer> mRequestedCommandSeqNumbers;
- //@GuardedBy("mLock")
- private boolean mPlaybackActive;
-
- /**
- * Create a {@link MediaController2} from the {@link Session2Token}.
- * This connects to the session and may wake up the service if it's not available.
- *
- * @param context context
- * @param token token to connect to
- * @param connectionHints a session-specific argument to send to the session when connecting.
- * The contents of this bundle may affect the connection result.
- * @param executor executor to run callbacks on.
- * @param callback controller callback to receive changes in.
- */
- MediaController2(@NonNull Context context, @NonNull Session2Token token,
- @NonNull Bundle connectionHints, @NonNull Executor executor,
- @NonNull ControllerCallback callback) {
- if (context == null) {
- throw new IllegalArgumentException("context shouldn't be null");
- }
- if (token == null) {
- throw new IllegalArgumentException("token shouldn't be null");
- }
- mContext = context;
- mSessionToken = token;
- mCallbackExecutor = (executor == null) ? context.getMainExecutor() : executor;
- mCallback = (callback == null) ? new ControllerCallback() {} : callback;
- mControllerStub = new Controller2Link(this);
- // NOTE: mResultHandler uses main looper, so this MUST NOT be blocked.
- mResultHandler = new Handler(context.getMainLooper());
-
- mNextSeqNumber = 0;
- mPendingCommands = new ArrayMap<>();
- mRequestedCommandSeqNumbers = new ArraySet<>();
-
- boolean connectRequested;
- if (token.getType() == TYPE_SESSION) {
- mServiceConnection = null;
- connectRequested = requestConnectToSession(connectionHints);
- } else {
- mServiceConnection = new SessionServiceConnection(connectionHints);
- connectRequested = requestConnectToService();
- }
- if (!connectRequested) {
- close();
- }
- }
-
- @Override
- public void close() {
- synchronized (mLock) {
- if (mClosed) {
- // Already closed. Ignore rest of clean up code.
- // Note: unbindService() throws IllegalArgumentException when it's called twice.
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "closing " + this);
- }
- mClosed = true;
- if (mServiceConnection != null) {
- // Note: This should be called even when the bindService() has returned false.
- mContext.unbindService(mServiceConnection);
- }
- if (mSessionBinder != null) {
- try {
- mSessionBinder.disconnect(mControllerStub, getNextSeqNumber());
- mSessionBinder.unlinkToDeath(mDeathRecipient, 0);
- } catch (RuntimeException e) {
- // No-op
- }
- }
- mConnectedToken = null;
- mPendingCommands.clear();
- mRequestedCommandSeqNumbers.clear();
- mCallbackExecutor.execute(() -> {
- mCallback.onDisconnected(MediaController2.this);
- });
- mSessionBinder = null;
- }
- }
-
- /**
- * Returns {@link Session2Token} of the connected session.
- * If it is not connected yet, it returns {@code null}.
- * <p>
- * This may differ with the {@link Session2Token} from the constructor. For example, if the
- * controller is created with the token for {@link MediaSession2Service}, this would return
- * token for the {@link MediaSession2} in the service.
- *
- * @return Session2Token of the connected session, or {@code null} if not connected
- */
- @Nullable
- public Session2Token getConnectedToken() {
- synchronized (mLock) {
- return mConnectedToken;
- }
- }
-
- /**
- * Returns whether the session's playback is active.
- *
- * @return {@code true} if playback active. {@code false} otherwise.
- * @see ControllerCallback#onPlaybackActiveChanged(MediaController2, boolean)
- */
- public boolean isPlaybackActive() {
- synchronized (mLock) {
- return mPlaybackActive;
- }
- }
-
- /**
- * Sends a session command to the session
- * <p>
- * @param command the session command
- * @param args optional arguments
- * @return a token which will be sent together in {@link ControllerCallback#onCommandResult}
- * when its result is received.
- */
- @NonNull
- public Object sendSessionCommand(@NonNull Session2Command command, @Nullable Bundle args) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
-
- ResultReceiver resultReceiver = new ResultReceiver(mResultHandler) {
- protected void onReceiveResult(int resultCode, Bundle resultData) {
- synchronized (mLock) {
- mPendingCommands.remove(this);
- }
- mCallbackExecutor.execute(() -> {
- mCallback.onCommandResult(MediaController2.this, this,
- command, new Session2Command.Result(resultCode, resultData));
- });
- }
- };
-
- synchronized (mLock) {
- if (mSessionBinder != null) {
- int seq = getNextSeqNumber();
- mPendingCommands.put(resultReceiver, seq);
- try {
- mSessionBinder.sendSessionCommand(mControllerStub, seq, command, args,
- resultReceiver);
- } catch (RuntimeException e) {
- mPendingCommands.remove(resultReceiver);
- resultReceiver.send(RESULT_ERROR_UNKNOWN_ERROR, null);
- }
- }
- }
- return resultReceiver;
- }
-
- /**
- * Cancels the session command previously sent.
- *
- * @param token the token which is returned from {@link #sendSessionCommand}.
- */
- public void cancelSessionCommand(@NonNull Object token) {
- if (token == null) {
- throw new IllegalArgumentException("token shouldn't be null");
- }
- synchronized (mLock) {
- if (mSessionBinder == null) return;
- Integer seq = mPendingCommands.remove(token);
- if (seq != null) {
- mSessionBinder.cancelSessionCommand(mControllerStub, seq);
- }
- }
- }
-
- // Called by Controller2Link.onConnected
- void onConnected(int seq, Bundle connectionResult) {
- Session2Link sessionBinder = connectionResult.getParcelable(KEY_SESSION2LINK);
- Session2CommandGroup allowedCommands =
- connectionResult.getParcelable(KEY_ALLOWED_COMMANDS);
- boolean playbackActive = connectionResult.getBoolean(KEY_PLAYBACK_ACTIVE);
-
- Bundle tokenExtras = connectionResult.getBundle(KEY_TOKEN_EXTRAS);
- if (tokenExtras == null) {
- Log.w(TAG, "extras shouldn't be null.");
- tokenExtras = Bundle.EMPTY;
- } else if (MediaSession2.hasCustomParcelable(tokenExtras)) {
- Log.w(TAG, "extras contain custom parcelable. Ignoring.");
- tokenExtras = Bundle.EMPTY;
- }
-
- if (DEBUG) {
- Log.d(TAG, "notifyConnected sessionBinder=" + sessionBinder
- + ", allowedCommands=" + allowedCommands);
- }
- if (sessionBinder == null || allowedCommands == null) {
- // Connection rejected.
- close();
- return;
- }
- synchronized (mLock) {
- mSessionBinder = sessionBinder;
- mAllowedCommands = allowedCommands;
- mPlaybackActive = playbackActive;
-
- // Implementation for the local binder is no-op,
- // so can be used without worrying about deadlock.
- sessionBinder.linkToDeath(mDeathRecipient, 0);
- mConnectedToken = new Session2Token(mSessionToken.getUid(), TYPE_SESSION,
- mSessionToken.getPackageName(), sessionBinder, tokenExtras);
- }
- mCallbackExecutor.execute(() -> {
- mCallback.onConnected(MediaController2.this, allowedCommands);
- });
- }
-
- // Called by Controller2Link.onDisconnected
- void onDisconnected(int seq) {
- // close() will call mCallback.onDisconnected
- close();
- }
-
- // Called by Controller2Link.onPlaybackActiveChanged
- void onPlaybackActiveChanged(int seq, boolean playbackActive) {
- synchronized (mLock) {
- mPlaybackActive = playbackActive;
- }
- mCallbackExecutor.execute(() -> {
- mCallback.onPlaybackActiveChanged(MediaController2.this, playbackActive);
- });
- }
-
- // Called by Controller2Link.onSessionCommand
- void onSessionCommand(int seq, Session2Command command, Bundle args,
- @Nullable ResultReceiver resultReceiver) {
- synchronized (mLock) {
- mRequestedCommandSeqNumbers.add(seq);
- }
- mCallbackExecutor.execute(() -> {
- boolean isCanceled;
- synchronized (mLock) {
- isCanceled = !mRequestedCommandSeqNumbers.remove(seq);
- }
- if (isCanceled) {
- if (resultReceiver != null) {
- resultReceiver.send(RESULT_INFO_SKIPPED, null);
- }
- return;
- }
- Session2Command.Result result = mCallback.onSessionCommand(
- MediaController2.this, command, args);
- if (resultReceiver != null) {
- if (result == null) {
- resultReceiver.send(RESULT_INFO_SKIPPED, null);
- } else {
- resultReceiver.send(result.getResultCode(), result.getResultData());
- }
- }
- });
- }
-
- // Called by Controller2Link.onSessionCommand
- void onCancelCommand(int seq) {
- synchronized (mLock) {
- mRequestedCommandSeqNumbers.remove(seq);
- }
- }
-
- private int getNextSeqNumber() {
- synchronized (mLock) {
- return mNextSeqNumber++;
- }
- }
-
- private Bundle createConnectionRequest(@NonNull Bundle connectionHints) {
- Bundle connectionRequest = new Bundle();
- connectionRequest.putString(KEY_PACKAGE_NAME, mContext.getPackageName());
- connectionRequest.putInt(KEY_PID, Process.myPid());
- connectionRequest.putBundle(KEY_CONNECTION_HINTS, connectionHints);
- return connectionRequest;
- }
-
- private boolean requestConnectToSession(@NonNull Bundle connectionHints) {
- Session2Link sessionBinder = mSessionToken.getSessionLink();
- Bundle connectionRequest = createConnectionRequest(connectionHints);
- try {
- sessionBinder.connect(mControllerStub, getNextSeqNumber(), connectionRequest);
- } catch (RuntimeException e) {
- Log.w(TAG, "Failed to call connection request", e);
- return false;
- }
- return true;
- }
-
- private boolean requestConnectToService() {
- // Service. Needs to get fresh binder whenever connection is needed.
- final Intent intent = new Intent(MediaSession2Service.SERVICE_INTERFACE);
- intent.setClassName(mSessionToken.getPackageName(), mSessionToken.getServiceName());
-
- // Use bindService() instead of startForegroundService() to start session service for three
- // reasons.
- // 1. Prevent session service owner's stopSelf() from destroying service.
- // With the startForegroundService(), service's call of stopSelf() will trigger immediate
- // onDestroy() calls on the main thread even when onConnect() is running in another
- // thread.
- // 2. Minimize APIs for developers to take care about.
- // With bindService(), developers only need to take care about Service.onBind()
- // but Service.onStartCommand() should be also taken care about with the
- // startForegroundService().
- // 3. Future support for UI-less playback
- // If a service wants to keep running, it should be either foreground service or
- // bound service. But there had been request for the feature for system apps
- // and using bindService() will be better fit with it.
- synchronized (mLock) {
- boolean result = mContext.bindService(
- intent, mServiceConnection, Context.BIND_AUTO_CREATE);
- if (!result) {
- Log.w(TAG, "bind to " + mSessionToken + " failed");
- return false;
- } else if (DEBUG) {
- Log.d(TAG, "bind to " + mSessionToken + " succeeded");
- }
- }
- return true;
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Builder for {@link MediaController2}.
- * <p>
- * Any incoming event from the {@link MediaSession2} will be handled on the callback
- * executor. If it's not set, {@link Context#getMainExecutor()} will be used by default.
- */
- public static final class Builder {
- private Context mContext;
- private Session2Token mToken;
- private Bundle mConnectionHints;
- private Executor mCallbackExecutor;
- private ControllerCallback mCallback;
-
- /**
- * Creates a builder for {@link MediaController2}.
- *
- * @param context context
- * @param token token of the session to connect to
- */
- public Builder(@NonNull Context context, @NonNull Session2Token token) {
- if (context == null) {
- throw new IllegalArgumentException("context shouldn't be null");
- }
- if (token == null) {
- throw new IllegalArgumentException("token shouldn't be null");
- }
- mContext = context;
- mToken = token;
- }
-
- /**
- * Set the connection hints for the controller.
- * <p>
- * {@code connectionHints} is a session-specific argument to send to the session when
- * connecting. The contents of this bundle may affect the connection result.
- * <p>
- * An {@link IllegalArgumentException} will be thrown if the bundle contains any
- * non-framework Parcelable objects.
- *
- * @param connectionHints a bundle which contains the connection hints
- * @return The Builder to allow chaining
- */
- @NonNull
- public Builder setConnectionHints(@NonNull Bundle connectionHints) {
- if (connectionHints == null) {
- throw new IllegalArgumentException("connectionHints shouldn't be null");
- }
- if (MediaSession2.hasCustomParcelable(connectionHints)) {
- throw new IllegalArgumentException("connectionHints shouldn't contain any custom "
- + "parcelables");
- }
- mConnectionHints = new Bundle(connectionHints);
- return this;
- }
-
- /**
- * Set callback for the controller and its executor.
- *
- * @param executor callback executor
- * @param callback session callback.
- * @return The Builder to allow chaining
- */
- @NonNull
- public Builder setControllerCallback(@NonNull Executor executor,
- @NonNull ControllerCallback callback) {
- if (executor == null) {
- throw new IllegalArgumentException("executor shouldn't be null");
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback shouldn't be null");
- }
- mCallbackExecutor = executor;
- mCallback = callback;
- return this;
- }
-
- /**
- * Build {@link MediaController2}.
- *
- * @return a new controller
- */
- @NonNull
- public MediaController2 build() {
- if (mCallbackExecutor == null) {
- mCallbackExecutor = mContext.getMainExecutor();
- }
- if (mCallback == null) {
- mCallback = new ControllerCallback() {};
- }
- if (mConnectionHints == null) {
- mConnectionHints = Bundle.EMPTY;
- }
- return new MediaController2(
- mContext, mToken, mConnectionHints, mCallbackExecutor, mCallback);
- }
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Interface for listening to change in activeness of the {@link MediaSession2}.
- */
- public abstract static class ControllerCallback {
- /**
- * Called when the controller is successfully connected to the session. The controller
- * becomes available afterwards.
- *
- * @param controller the controller for this event
- * @param allowedCommands commands that's allowed by the session.
- */
- public void onConnected(@NonNull MediaController2 controller,
- @NonNull Session2CommandGroup allowedCommands) {}
-
- /**
- * Called when the session refuses the controller or the controller is disconnected from
- * the session. The controller becomes unavailable afterwards and the callback wouldn't
- * be called.
- * <p>
- * It will be also called after the {@link #close()}, so you can put clean up code here.
- * You don't need to call {@link #close()} after this.
- *
- * @param controller the controller for this event
- */
- public void onDisconnected(@NonNull MediaController2 controller) {}
-
- /**
- * Called when the session's playback activeness is changed.
- *
- * @param controller the controller for this event
- * @param playbackActive {@code true} if the session's playback is active.
- * {@code false} otherwise.
- * @see MediaController2#isPlaybackActive()
- */
- public void onPlaybackActiveChanged(@NonNull MediaController2 controller,
- boolean playbackActive) {}
-
- /**
- * Called when the connected session sent a session command.
- *
- * @param controller the controller for this event
- * @param command the session command
- * @param args optional arguments
- * @return the result for the session command. If {@code null}, RESULT_INFO_SKIPPED
- * will be sent to the session.
- */
- @Nullable
- public Session2Command.Result onSessionCommand(@NonNull MediaController2 controller,
- @NonNull Session2Command command, @Nullable Bundle args) {
- return null;
- }
-
- /**
- * Called when the command sent to the connected session is finished.
- *
- * @param controller the controller for this event
- * @param token the token got from {@link MediaController2#sendSessionCommand}
- * @param command the session command
- * @param result the result of the session command
- */
- public void onCommandResult(@NonNull MediaController2 controller, @NonNull Object token,
- @NonNull Session2Command command, @NonNull Session2Command.Result result) {}
- }
-
- // This will be called on the main thread.
- private class SessionServiceConnection implements ServiceConnection {
- private final Bundle mConnectionHints;
-
- SessionServiceConnection(@Nullable Bundle connectionHints) {
- mConnectionHints = connectionHints;
- }
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- // Note that it's always main-thread.
- boolean connectRequested = false;
- try {
- if (DEBUG) {
- Log.d(TAG, "onServiceConnected " + name + " " + this);
- }
- if (!mSessionToken.getPackageName().equals(name.getPackageName())) {
- Log.wtf(TAG, "Expected connection to " + mSessionToken.getPackageName()
- + " but is connected to " + name);
- return;
- }
- IMediaSession2Service iService = IMediaSession2Service.Stub.asInterface(service);
- if (iService == null) {
- Log.wtf(TAG, "Service interface is missing.");
- return;
- }
- Bundle connectionRequest = createConnectionRequest(mConnectionHints);
- iService.connect(mControllerStub, getNextSeqNumber(), connectionRequest);
- connectRequested = true;
- } catch (RemoteException e) {
- Log.w(TAG, "Service " + name + " has died prematurely", e);
- } finally {
- if (!connectRequested) {
- close();
- }
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- // Temporal lose of the binding because of the service crash. System will automatically
- // rebind, so just no-op.
- if (DEBUG) {
- Log.w(TAG, "Session service " + name + " is disconnected.");
- }
- close();
- }
-
- @Override
- public void onBindingDied(ComponentName name) {
- // Permanent lose of the binding because of the service package update or removed.
- // This SessionServiceRecord will be removed accordingly, but forget session binder here
- // for sure.
- close();
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaFeature.java b/apex/media/framework/java/android/media/MediaFeature.java
deleted file mode 100644
index 8d1b159..0000000
--- a/apex/media/framework/java/android/media/MediaFeature.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.StringDef;
-import android.os.Build;
-
-import com.android.modules.annotation.MinSdk;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * MediaFeature defines various media features, e.g. hdr type.
- */
-@MinSdk(Build.VERSION_CODES.S)
-public final class MediaFeature {
- /**
- * Defines tye type of HDR(high dynamic range) video.
- */
- public static final class HdrType {
- private HdrType() {
- }
-
- /**
- * HDR type for dolby-vision.
- */
- public static final String DOLBY_VISION = "android.media.feature.hdr.dolby_vision";
- /**
- * HDR type for hdr10.
- */
- public static final String HDR10 = "android.media.feature.hdr.hdr10";
- /**
- * HDR type for hdr10+.
- */
- public static final String HDR10_PLUS = "android.media.feature.hdr.hdr10_plus";
- /**
- * HDR type for hlg.
- */
- public static final String HLG = "android.media.feature.hdr.hlg";
- }
-
- /** @hide */
- @StringDef({
- HdrType.DOLBY_VISION,
- HdrType.HDR10,
- HdrType.HDR10_PLUS,
- HdrType.HLG,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface MediaHdrType {
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaFrameworkInitializer.java b/apex/media/framework/java/android/media/MediaFrameworkInitializer.java
deleted file mode 100644
index d7ad97d..0000000
--- a/apex/media/framework/java/android/media/MediaFrameworkInitializer.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.NonNull;
-import android.annotation.SystemApi;
-import android.annotation.SystemApi.Client;
-import android.app.SystemServiceRegistry;
-import android.content.Context;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.modules.annotation.MinSdk;
-import com.android.modules.utils.build.SdkLevel;
-
-/**
- * Class for performing registration for all media services on com.android.media apex.
- *
- * @hide
- */
-@MinSdk(Build.VERSION_CODES.S)
-@RequiresApi(Build.VERSION_CODES.S)
-@SystemApi(client = Client.MODULE_LIBRARIES)
-public class MediaFrameworkInitializer {
- private MediaFrameworkInitializer() {
- }
-
- private static volatile MediaServiceManager sMediaServiceManager;
-
- /**
- * Sets an instance of {@link MediaServiceManager} that allows
- * the media mainline module to register/obtain media binder services. This is called
- * by the platform during the system initialization.
- *
- * @param mediaServiceManager instance of {@link MediaServiceManager} that allows
- * the media mainline module to register/obtain media binder services.
- */
- public static void setMediaServiceManager(
- @NonNull MediaServiceManager mediaServiceManager) {
- if (sMediaServiceManager != null) {
- throw new IllegalStateException("setMediaServiceManager called twice!");
- }
-
- if (mediaServiceManager == null) {
- throw new NullPointerException("mediaServiceManager is null!");
- }
-
- sMediaServiceManager = mediaServiceManager;
- }
-
- /** @hide */
- public static MediaServiceManager getMediaServiceManager() {
- return sMediaServiceManager;
- }
-
- /**
- * Called by {@link SystemServiceRegistry}'s static initializer and registers all media
- * services to {@link Context}, so that {@link Context#getSystemService} can return them.
- *
- * @throws IllegalStateException if this is called from anywhere besides
- * {@link SystemServiceRegistry}
- */
- public static void registerServiceWrappers() {
- SystemServiceRegistry.registerContextAwareService(
- Context.MEDIA_TRANSCODING_SERVICE,
- MediaTranscodingManager.class,
- context -> new MediaTranscodingManager(context)
- );
- if (SdkLevel.isAtLeastS()) {
- SystemServiceRegistry.registerContextAwareService(
- Context.MEDIA_COMMUNICATION_SERVICE,
- MediaCommunicationManager.class,
- context -> new MediaCommunicationManager(context)
- );
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaParceledListSlice.java b/apex/media/framework/java/android/media/MediaParceledListSlice.java
deleted file mode 100644
index fb36e80..0000000
--- a/apex/media/framework/java/android/media/MediaParceledListSlice.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.NonNull;
-import android.annotation.SystemApi;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import androidx.annotation.RequiresApi;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * This is a copied version of MediaParceledListSlice in framework with hidden API usages removed,
- * and also with some lint error fixed.
- *
- * Transfer a large list of Parcelable objects across an IPC. Splits into
- * multiple transactions if needed.
- *
- * TODO: Remove this from @SystemApi once all the MediaSession related classes are moved
- * to apex (or ParceledListSlice moved to apex). This class is temporaily added to system API
- * for moving classes step by step.
- *
- * @param <T> The type of the elements in the list.
- * @see BaseMediaParceledListSlice
- * @deprecated This is temporary marked as @SystemApi. Should be removed from the API surface.
- * @hide
- */
-@Deprecated
-@RequiresApi(Build.VERSION_CODES.S)
-@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-public final class MediaParceledListSlice<T extends Parcelable>
- extends BaseMediaParceledListSlice<T> {
- public MediaParceledListSlice(@NonNull List<T> list) {
- super(list);
- }
-
- private MediaParceledListSlice(Parcel in, ClassLoader loader) {
- super(in, loader);
- }
-
- @NonNull
- public static <T extends Parcelable> MediaParceledListSlice<T> emptyList() {
- return new MediaParceledListSlice<T>(Collections.<T> emptyList());
- }
-
- @Override
- public int describeContents() {
- int contents = 0;
- final List<T> list = getList();
- for (int i=0; i<list.size(); i++) {
- contents |= list.get(i).describeContents();
- }
- return contents;
- }
-
- @Override
- void writeElement(T parcelable, Parcel dest, int callFlags) {
- parcelable.writeToParcel(dest, callFlags);
- }
-
- @Override
- void writeParcelableCreator(T parcelable, Parcel dest) {
- dest.writeParcelableCreator((Parcelable) parcelable);
- }
-
- @Override
- Parcelable.Creator<?> readParcelableCreator(Parcel from, ClassLoader loader) {
- return from.readParcelableCreator(loader);
- }
-
- @NonNull
- @SuppressWarnings("unchecked")
- public static final Parcelable.ClassLoaderCreator<MediaParceledListSlice> CREATOR =
- new Parcelable.ClassLoaderCreator<MediaParceledListSlice>() {
- public MediaParceledListSlice createFromParcel(Parcel in) {
- return new MediaParceledListSlice(in, null);
- }
-
- @Override
- public MediaParceledListSlice createFromParcel(Parcel in, ClassLoader loader) {
- return new MediaParceledListSlice(in, loader);
- }
-
- @Override
- public MediaParceledListSlice[] newArray(int size) {
- return new MediaParceledListSlice[size];
- }
- };
-}
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java
deleted file mode 100644
index b6f85c7..0000000
--- a/apex/media/framework/java/android/media/MediaParser.java
+++ /dev/null
@@ -1,2293 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.media;
-
-import android.annotation.CheckResult;
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.StringDef;
-import android.media.MediaCodec.CryptoInfo;
-import android.media.metrics.LogSessionId;
-import android.os.Build;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.Pair;
-import android.util.SparseArray;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.modules.utils.build.SdkLevel;
-
-import com.google.android.exoplayer2.C;
-import com.google.android.exoplayer2.Format;
-import com.google.android.exoplayer2.ParserException;
-import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
-import com.google.android.exoplayer2.extractor.ChunkIndex;
-import com.google.android.exoplayer2.extractor.DefaultExtractorInput;
-import com.google.android.exoplayer2.extractor.Extractor;
-import com.google.android.exoplayer2.extractor.ExtractorInput;
-import com.google.android.exoplayer2.extractor.ExtractorOutput;
-import com.google.android.exoplayer2.extractor.PositionHolder;
-import com.google.android.exoplayer2.extractor.SeekMap.SeekPoints;
-import com.google.android.exoplayer2.extractor.TrackOutput;
-import com.google.android.exoplayer2.extractor.amr.AmrExtractor;
-import com.google.android.exoplayer2.extractor.flac.FlacExtractor;
-import com.google.android.exoplayer2.extractor.flv.FlvExtractor;
-import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor;
-import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor;
-import com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor;
-import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor;
-import com.google.android.exoplayer2.extractor.ogg.OggExtractor;
-import com.google.android.exoplayer2.extractor.ts.Ac3Extractor;
-import com.google.android.exoplayer2.extractor.ts.Ac4Extractor;
-import com.google.android.exoplayer2.extractor.ts.AdtsExtractor;
-import com.google.android.exoplayer2.extractor.ts.DefaultTsPayloadReaderFactory;
-import com.google.android.exoplayer2.extractor.ts.PsExtractor;
-import com.google.android.exoplayer2.extractor.ts.TsExtractor;
-import com.google.android.exoplayer2.extractor.wav.WavExtractor;
-import com.google.android.exoplayer2.upstream.DataReader;
-import com.google.android.exoplayer2.util.ParsableByteArray;
-import com.google.android.exoplayer2.util.TimestampAdjuster;
-import com.google.android.exoplayer2.util.Util;
-import com.google.android.exoplayer2.video.ColorInfo;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.UUID;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.function.Function;
-
-/**
- * Parses media container formats and extracts contained media samples and metadata.
- *
- * <p>This class provides access to a battery of low-level media container parsers. Each instance of
- * this class is associated to a specific media parser implementation which is suitable for
- * extraction from a specific media container format. The media parser implementation assignment
- * depends on the factory method (see {@link #create} and {@link #createByName}) used to create the
- * instance.
- *
- * <p>Users must implement the following to use this class.
- *
- * <ul>
- * <li>{@link InputReader}: Provides the media container's bytes to parse.
- * <li>{@link OutputConsumer}: Provides a sink for all extracted data and metadata.
- * </ul>
- *
- * <p>The following code snippet includes a usage example:
- *
- * <pre>
- * MyOutputConsumer myOutputConsumer = new MyOutputConsumer();
- * MyInputReader myInputReader = new MyInputReader("www.example.com");
- * MediaParser mediaParser = MediaParser.create(myOutputConsumer);
- *
- * while (mediaParser.advance(myInputReader)) {}
- *
- * mediaParser.release();
- * mediaParser = null;
- * </pre>
- *
- * <p>The following code snippet provides a rudimentary {@link OutputConsumer} sample implementation
- * which extracts and publishes all video samples:
- *
- * <pre>
- * class VideoOutputConsumer implements MediaParser.OutputConsumer {
- *
- * private byte[] sampleDataBuffer = new byte[4096];
- * private byte[] discardedDataBuffer = new byte[4096];
- * private int videoTrackIndex = -1;
- * private int bytesWrittenCount = 0;
- *
- * @Override
- * public void onSeekMapFound(int i, @NonNull MediaFormat mediaFormat) {
- * // Do nothing.
- * }
- *
- * @Override
- * public void onTrackDataFound(int i, @NonNull TrackData trackData) {
- * MediaFormat mediaFormat = trackData.mediaFormat;
- * if (videoTrackIndex == -1 &&
- * mediaFormat
- * .getString(MediaFormat.KEY_MIME, /* defaultValue= */ "")
- * .startsWith("video/")) {
- * videoTrackIndex = i;
- * }
- * }
- *
- * @Override
- * public void onSampleDataFound(int trackIndex, @NonNull InputReader inputReader)
- * throws IOException {
- * int numberOfBytesToRead = (int) inputReader.getLength();
- * if (videoTrackIndex != trackIndex) {
- * // Discard contents.
- * inputReader.read(
- * discardedDataBuffer,
- * /* offset= */ 0,
- * Math.min(discardDataBuffer.length, numberOfBytesToRead));
- * } else {
- * ensureSpaceInBuffer(numberOfBytesToRead);
- * int bytesRead = inputReader.read(
- * sampleDataBuffer, bytesWrittenCount, numberOfBytesToRead);
- * bytesWrittenCount += bytesRead;
- * }
- * }
- *
- * @Override
- * public void onSampleCompleted(
- * int trackIndex,
- * long timeMicros,
- * int flags,
- * int size,
- * int offset,
- * @Nullable CryptoInfo cryptoData) {
- * if (videoTrackIndex != trackIndex) {
- * return; // It's not the video track. Ignore.
- * }
- * byte[] sampleData = new byte[size];
- * int sampleStartOffset = bytesWrittenCount - size - offset;
- * System.arraycopy(
- * sampleDataBuffer,
- * sampleStartOffset,
- * sampleData,
- * /* destPos= */ 0,
- * size);
- * // Place trailing bytes at the start of the buffer.
- * System.arraycopy(
- * sampleDataBuffer,
- * bytesWrittenCount - offset,
- * sampleDataBuffer,
- * /* destPos= */ 0,
- * /* size= */ offset);
- * bytesWrittenCount = bytesWrittenCount - offset;
- * publishSample(sampleData, timeMicros, flags);
- * }
- *
- * private void ensureSpaceInBuffer(int numberOfBytesToRead) {
- * int requiredLength = bytesWrittenCount + numberOfBytesToRead;
- * if (requiredLength > sampleDataBuffer.length) {
- * sampleDataBuffer = Arrays.copyOf(sampleDataBuffer, requiredLength);
- * }
- * }
- *
- * }
- *
- * </pre>
- */
-@RequiresApi(Build.VERSION_CODES.R)
-public final class MediaParser {
-
- /**
- * Maps seek positions to {@link SeekPoint SeekPoints} in the stream.
- *
- * <p>A {@link SeekPoint} is a position in the stream from which a player may successfully start
- * playing media samples.
- */
- public static final class SeekMap {
-
- /** Returned by {@link #getDurationMicros()} when the duration is unknown. */
- public static final int UNKNOWN_DURATION = Integer.MIN_VALUE;
-
- /**
- * For each {@link #getSeekPoints} call, returns a single {@link SeekPoint} whose {@link
- * SeekPoint#timeMicros} matches the requested timestamp, and whose {@link
- * SeekPoint#position} is 0.
- *
- * @hide
- */
- public static final SeekMap DUMMY = new SeekMap(new DummyExoPlayerSeekMap());
-
- private final com.google.android.exoplayer2.extractor.SeekMap mExoPlayerSeekMap;
-
- private SeekMap(com.google.android.exoplayer2.extractor.SeekMap exoplayerSeekMap) {
- mExoPlayerSeekMap = exoplayerSeekMap;
- }
-
- /** Returns whether seeking is supported. */
- public boolean isSeekable() {
- return mExoPlayerSeekMap.isSeekable();
- }
-
- /**
- * Returns the duration of the stream in microseconds or {@link #UNKNOWN_DURATION} if the
- * duration is unknown.
- */
- public long getDurationMicros() {
- long durationUs = mExoPlayerSeekMap.getDurationUs();
- return durationUs != C.TIME_UNSET ? durationUs : UNKNOWN_DURATION;
- }
-
- /**
- * Obtains {@link SeekPoint SeekPoints} for the specified seek time in microseconds.
- *
- * <p>{@code getSeekPoints(timeMicros).first} contains the latest seek point for samples
- * with timestamp equal to or smaller than {@code timeMicros}.
- *
- * <p>{@code getSeekPoints(timeMicros).second} contains the earliest seek point for samples
- * with timestamp equal to or greater than {@code timeMicros}. If a seek point exists for
- * {@code timeMicros}, the returned pair will contain the same {@link SeekPoint} twice.
- *
- * @param timeMicros A seek time in microseconds.
- * @return The corresponding {@link SeekPoint SeekPoints}.
- */
- @NonNull
- public Pair<SeekPoint, SeekPoint> getSeekPoints(long timeMicros) {
- SeekPoints seekPoints = mExoPlayerSeekMap.getSeekPoints(timeMicros);
- return new Pair<>(toSeekPoint(seekPoints.first), toSeekPoint(seekPoints.second));
- }
- }
-
- /** Holds information associated with a track. */
- public static final class TrackData {
-
- /** Holds {@link MediaFormat} information for the track. */
- @NonNull public final MediaFormat mediaFormat;
-
- /**
- * Holds {@link DrmInitData} necessary to acquire keys associated with the track, or null if
- * the track has no encryption data.
- */
- @Nullable public final DrmInitData drmInitData;
-
- private TrackData(MediaFormat mediaFormat, DrmInitData drmInitData) {
- this.mediaFormat = mediaFormat;
- this.drmInitData = drmInitData;
- }
- }
-
- /** Defines a seek point in a media stream. */
- public static final class SeekPoint {
-
- /** A {@link SeekPoint} whose time and byte offset are both set to 0. */
- @NonNull public static final SeekPoint START = new SeekPoint(0, 0);
-
- /** The time of the seek point, in microseconds. */
- public final long timeMicros;
-
- /** The byte offset of the seek point. */
- public final long position;
-
- /**
- * @param timeMicros The time of the seek point, in microseconds.
- * @param position The byte offset of the seek point.
- */
- private SeekPoint(long timeMicros, long position) {
- this.timeMicros = timeMicros;
- this.position = position;
- }
-
- @Override
- @NonNull
- public String toString() {
- return "[timeMicros=" + timeMicros + ", position=" + position + "]";
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null || getClass() != obj.getClass()) {
- return false;
- }
- SeekPoint other = (SeekPoint) obj;
- return timeMicros == other.timeMicros && position == other.position;
- }
-
- @Override
- public int hashCode() {
- int result = (int) timeMicros;
- result = 31 * result + (int) position;
- return result;
- }
- }
-
- /** Provides input data to {@link MediaParser}. */
- public interface InputReader {
-
- /**
- * Reads up to {@code readLength} bytes of data and stores them into {@code buffer},
- * starting at index {@code offset}.
- *
- * <p>This method blocks until at least one byte is read, the end of input is detected, or
- * an exception is thrown. The read position advances to the first unread byte.
- *
- * @param buffer The buffer into which the read data should be stored.
- * @param offset The start offset into {@code buffer} at which data should be written.
- * @param readLength The maximum number of bytes to read.
- * @return The non-zero number of bytes read, or -1 if no data is available because the end
- * of the input has been reached.
- * @throws java.io.IOException If an error occurs reading from the source.
- */
- int read(@NonNull byte[] buffer, int offset, int readLength) throws IOException;
-
- /** Returns the current read position (byte offset) in the stream. */
- long getPosition();
-
- /** Returns the length of the input in bytes, or -1 if the length is unknown. */
- long getLength();
- }
-
- /** {@link InputReader} that allows setting the read position. */
- public interface SeekableInputReader extends InputReader {
-
- /**
- * Sets the read position at the given {@code position}.
- *
- * <p>{@link #advance} will immediately return after calling this method.
- *
- * @param position The position to seek to, in bytes.
- */
- void seekToPosition(long position);
- }
-
- /** Receives extracted media sample data and metadata from {@link MediaParser}. */
- public interface OutputConsumer {
-
- /**
- * Called when a {@link SeekMap} has been extracted from the stream.
- *
- * <p>This method is called at least once before any samples are {@link #onSampleCompleted
- * complete}. May be called multiple times after that in order to add {@link SeekPoint
- * SeekPoints}.
- *
- * @param seekMap The extracted {@link SeekMap}.
- */
- void onSeekMapFound(@NonNull SeekMap seekMap);
-
- /**
- * Called when the number of tracks is found.
- *
- * @param numberOfTracks The number of tracks in the stream.
- */
- void onTrackCountFound(int numberOfTracks);
-
- /**
- * Called when new {@link TrackData} is found in the stream.
- *
- * @param trackIndex The index of the track for which the {@link TrackData} was extracted.
- * @param trackData The extracted {@link TrackData}.
- */
- void onTrackDataFound(int trackIndex, @NonNull TrackData trackData);
-
- /**
- * Called when sample data is found in the stream.
- *
- * <p>If the invocation of this method returns before the entire {@code inputReader} {@link
- * InputReader#getLength() length} is consumed, the method will be called again for the
- * implementer to read the remaining data. Implementers should surface any thrown {@link
- * IOException} caused by reading from {@code input}.
- *
- * @param trackIndex The index of the track to which the sample data corresponds.
- * @param inputReader The {@link InputReader} from which to read the data.
- * @throws IOException If an exception occurs while reading from {@code inputReader}.
- */
- void onSampleDataFound(int trackIndex, @NonNull InputReader inputReader) throws IOException;
-
- /**
- * Called once all the data of a sample has been passed to {@link #onSampleDataFound}.
- *
- * <p>Includes sample metadata, like presentation timestamp and flags.
- *
- * @param trackIndex The index of the track to which the sample corresponds.
- * @param timeMicros The media timestamp associated with the sample, in microseconds.
- * @param flags Flags associated with the sample. See the {@code SAMPLE_FLAG_*} constants.
- * @param size The size of the sample data, in bytes.
- * @param offset The number of bytes that have been consumed by {@code
- * onSampleDataFound(int, MediaParser.InputReader)} for the specified track, since the
- * last byte belonging to the sample whose metadata is being passed.
- * @param cryptoInfo Encryption data required to decrypt the sample. May be null for
- * unencrypted samples. Implementors should treat any output {@link CryptoInfo}
- * instances as immutable. MediaParser will not modify any output {@code cryptoInfos}
- * and implementors should not modify them either.
- */
- void onSampleCompleted(
- int trackIndex,
- long timeMicros,
- @SampleFlags int flags,
- int size,
- int offset,
- @Nullable CryptoInfo cryptoInfo);
- }
-
- /**
- * Thrown if all parser implementations provided to {@link #create} failed to sniff the input
- * content.
- */
- public static final class UnrecognizedInputFormatException extends IOException {
-
- /**
- * Creates a new instance which signals that the parsers with the given names failed to
- * parse the input.
- */
- @NonNull
- @CheckResult
- private static UnrecognizedInputFormatException createForExtractors(
- @NonNull String... extractorNames) {
- StringBuilder builder = new StringBuilder();
- builder.append("None of the available parsers ( ");
- builder.append(extractorNames[0]);
- for (int i = 1; i < extractorNames.length; i++) {
- builder.append(", ");
- builder.append(extractorNames[i]);
- }
- builder.append(") could read the stream.");
- return new UnrecognizedInputFormatException(builder.toString());
- }
-
- private UnrecognizedInputFormatException(String extractorNames) {
- super(extractorNames);
- }
- }
-
- /** Thrown when an error occurs while parsing a media stream. */
- public static final class ParsingException extends IOException {
-
- private ParsingException(ParserException cause) {
- super(cause);
- }
- }
-
- // Sample flags.
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(
- flag = true,
- value = {
- SAMPLE_FLAG_KEY_FRAME,
- SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA,
- SAMPLE_FLAG_LAST_SAMPLE,
- SAMPLE_FLAG_ENCRYPTED,
- SAMPLE_FLAG_DECODE_ONLY
- })
- public @interface SampleFlags {}
- /** Indicates that the sample holds a synchronization sample. */
- public static final int SAMPLE_FLAG_KEY_FRAME = MediaCodec.BUFFER_FLAG_KEY_FRAME;
- /**
- * Indicates that the sample has supplemental data.
- *
- * <p>Samples will not have this flag set unless the {@code
- * "android.media.mediaparser.includeSupplementalData"} parameter is set to {@code true} via
- * {@link #setParameter}.
- *
- * <p>Samples with supplemental data have the following sample data format:
- *
- * <ul>
- * <li>If the {@code "android.media.mediaparser.inBandCryptoInfo"} parameter is set, all
- * encryption information.
- * <li>(4 bytes) {@code sample_data_size}: The size of the actual sample data, not including
- * supplemental data or encryption information.
- * <li>({@code sample_data_size} bytes): The media sample data.
- * <li>(remaining bytes) The supplemental data.
- * </ul>
- */
- public static final int SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA = 1 << 28;
- /** Indicates that the sample is known to contain the last media sample of the stream. */
- public static final int SAMPLE_FLAG_LAST_SAMPLE = 1 << 29;
- /** Indicates that the sample is (at least partially) encrypted. */
- public static final int SAMPLE_FLAG_ENCRYPTED = 1 << 30;
- /** Indicates that the sample should be decoded but not rendered. */
- public static final int SAMPLE_FLAG_DECODE_ONLY = 1 << 31;
-
- // Parser implementation names.
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @StringDef(
- prefix = {"PARSER_NAME_"},
- value = {
- PARSER_NAME_UNKNOWN,
- PARSER_NAME_MATROSKA,
- PARSER_NAME_FMP4,
- PARSER_NAME_MP4,
- PARSER_NAME_MP3,
- PARSER_NAME_ADTS,
- PARSER_NAME_AC3,
- PARSER_NAME_TS,
- PARSER_NAME_FLV,
- PARSER_NAME_OGG,
- PARSER_NAME_PS,
- PARSER_NAME_WAV,
- PARSER_NAME_AMR,
- PARSER_NAME_AC4,
- PARSER_NAME_FLAC
- })
- public @interface ParserName {}
-
- /** Parser name returned by {@link #getParserName()} when no parser has been selected yet. */
- public static final String PARSER_NAME_UNKNOWN = "android.media.mediaparser.UNKNOWN";
- /**
- * Parser for the Matroska container format, as defined in the <a
- * href="https://matroska.org/technical/specs/">spec</a>.
- */
- public static final String PARSER_NAME_MATROSKA = "android.media.mediaparser.MatroskaParser";
- /**
- * Parser for fragmented files using the MP4 container format, as defined in ISO/IEC 14496-12.
- */
- public static final String PARSER_NAME_FMP4 = "android.media.mediaparser.FragmentedMp4Parser";
- /**
- * Parser for non-fragmented files using the MP4 container format, as defined in ISO/IEC
- * 14496-12.
- */
- public static final String PARSER_NAME_MP4 = "android.media.mediaparser.Mp4Parser";
- /** Parser for the MP3 container format, as defined in ISO/IEC 11172-3. */
- public static final String PARSER_NAME_MP3 = "android.media.mediaparser.Mp3Parser";
- /** Parser for the ADTS container format, as defined in ISO/IEC 13818-7. */
- public static final String PARSER_NAME_ADTS = "android.media.mediaparser.AdtsParser";
- /**
- * Parser for the AC-3 container format, as defined in Digital Audio Compression Standard
- * (AC-3).
- */
- public static final String PARSER_NAME_AC3 = "android.media.mediaparser.Ac3Parser";
- /** Parser for the TS container format, as defined in ISO/IEC 13818-1. */
- public static final String PARSER_NAME_TS = "android.media.mediaparser.TsParser";
- /**
- * Parser for the FLV container format, as defined in Adobe Flash Video File Format
- * Specification.
- */
- public static final String PARSER_NAME_FLV = "android.media.mediaparser.FlvParser";
- /** Parser for the OGG container format, as defined in RFC 3533. */
- public static final String PARSER_NAME_OGG = "android.media.mediaparser.OggParser";
- /** Parser for the PS container format, as defined in ISO/IEC 11172-1. */
- public static final String PARSER_NAME_PS = "android.media.mediaparser.PsParser";
- /**
- * Parser for the WAV container format, as defined in Multimedia Programming Interface and Data
- * Specifications.
- */
- public static final String PARSER_NAME_WAV = "android.media.mediaparser.WavParser";
- /** Parser for the AMR container format, as defined in RFC 4867. */
- public static final String PARSER_NAME_AMR = "android.media.mediaparser.AmrParser";
- /**
- * Parser for the AC-4 container format, as defined by Dolby AC-4: Audio delivery for
- * Next-Generation Entertainment Services.
- */
- public static final String PARSER_NAME_AC4 = "android.media.mediaparser.Ac4Parser";
- /**
- * Parser for the FLAC container format, as defined in the <a
- * href="https://xiph.org/flac/">spec</a>.
- */
- public static final String PARSER_NAME_FLAC = "android.media.mediaparser.FlacParser";
-
- // MediaParser parameters.
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @StringDef(
- prefix = {"PARAMETER_"},
- value = {
- PARAMETER_ADTS_ENABLE_CBR_SEEKING,
- PARAMETER_AMR_ENABLE_CBR_SEEKING,
- PARAMETER_FLAC_DISABLE_ID3,
- PARAMETER_MP4_IGNORE_EDIT_LISTS,
- PARAMETER_MP4_IGNORE_TFDT_BOX,
- PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES,
- PARAMETER_MATROSKA_DISABLE_CUES_SEEKING,
- PARAMETER_MP3_DISABLE_ID3,
- PARAMETER_MP3_ENABLE_CBR_SEEKING,
- PARAMETER_MP3_ENABLE_INDEX_SEEKING,
- PARAMETER_TS_MODE,
- PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES,
- PARAMETER_TS_IGNORE_AAC_STREAM,
- PARAMETER_TS_IGNORE_AVC_STREAM,
- PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM,
- PARAMETER_TS_DETECT_ACCESS_UNITS,
- PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS,
- PARAMETER_IN_BAND_CRYPTO_INFO,
- PARAMETER_INCLUDE_SUPPLEMENTAL_DATA
- })
- public @interface ParameterName {}
-
- /**
- * Sets whether constant bitrate seeking should be enabled for ADTS parsing. {@code boolean}
- * expected. Default value is {@code false}.
- */
- public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING =
- "android.media.mediaparser.adts.enableCbrSeeking";
- /**
- * Sets whether constant bitrate seeking should be enabled for AMR. {@code boolean} expected.
- * Default value is {@code false}.
- */
- public static final String PARAMETER_AMR_ENABLE_CBR_SEEKING =
- "android.media.mediaparser.amr.enableCbrSeeking";
- /**
- * Sets whether the ID3 track should be disabled for FLAC. {@code boolean} expected. Default
- * value is {@code false}.
- */
- public static final String PARAMETER_FLAC_DISABLE_ID3 =
- "android.media.mediaparser.flac.disableId3";
- /**
- * Sets whether MP4 parsing should ignore edit lists. {@code boolean} expected. Default value is
- * {@code false}.
- */
- public static final String PARAMETER_MP4_IGNORE_EDIT_LISTS =
- "android.media.mediaparser.mp4.ignoreEditLists";
- /**
- * Sets whether MP4 parsing should ignore the tfdt box. {@code boolean} expected. Default value
- * is {@code false}.
- */
- public static final String PARAMETER_MP4_IGNORE_TFDT_BOX =
- "android.media.mediaparser.mp4.ignoreTfdtBox";
- /**
- * Sets whether MP4 parsing should treat all video frames as key frames. {@code boolean}
- * expected. Default value is {@code false}.
- */
- public static final String PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES =
- "android.media.mediaparser.mp4.treatVideoFramesAsKeyframes";
- /**
- * Sets whether Matroska parsing should avoid seeking to the cues element. {@code boolean}
- * expected. Default value is {@code false}.
- *
- * <p>If this flag is enabled and the cues element occurs after the first cluster, then the
- * media is treated as unseekable.
- */
- public static final String PARAMETER_MATROSKA_DISABLE_CUES_SEEKING =
- "android.media.mediaparser.matroska.disableCuesSeeking";
- /**
- * Sets whether the ID3 track should be disabled for MP3. {@code boolean} expected. Default
- * value is {@code false}.
- */
- public static final String PARAMETER_MP3_DISABLE_ID3 =
- "android.media.mediaparser.mp3.disableId3";
- /**
- * Sets whether constant bitrate seeking should be enabled for MP3. {@code boolean} expected.
- * Default value is {@code false}.
- */
- public static final String PARAMETER_MP3_ENABLE_CBR_SEEKING =
- "android.media.mediaparser.mp3.enableCbrSeeking";
- /**
- * Sets whether MP3 parsing should generate a time-to-byte mapping. {@code boolean} expected.
- * Default value is {@code false}.
- *
- * <p>Enabling this flag may require to scan a significant portion of the file to compute a seek
- * point. Therefore, it should only be used if:
- *
- * <ul>
- * <li>the file is small, or
- * <li>the bitrate is variable (or the type of bitrate is unknown) and the seeking metadata
- * provided in the file is not precise enough (or is not present).
- * </ul>
- */
- public static final String PARAMETER_MP3_ENABLE_INDEX_SEEKING =
- "android.media.mediaparser.mp3.enableIndexSeeking";
- /**
- * Sets the operation mode for TS parsing. {@code String} expected. Valid values are {@code
- * "single_pmt"}, {@code "multi_pmt"}, and {@code "hls"}. Default value is {@code "single_pmt"}.
- *
- * <p>The operation modes alter the way TS behaves so that it can handle certain kinds of
- * commonly-occurring malformed media.
- *
- * <ul>
- * <li>{@code "single_pmt"}: Only the first found PMT is parsed. Others are ignored, even if
- * more PMTs are declared in the PAT.
- * <li>{@code "multi_pmt"}: Behave as described in ISO/IEC 13818-1.
- * <li>{@code "hls"}: Enable {@code "single_pmt"} mode, and ignore continuity counters.
- * </ul>
- */
- public static final String PARAMETER_TS_MODE = "android.media.mediaparser.ts.mode";
- /**
- * Sets whether TS should treat samples consisting of non-IDR I slices as synchronization
- * samples (key-frames). {@code boolean} expected. Default value is {@code false}.
- */
- public static final String PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES =
- "android.media.mediaparser.ts.allowNonIdrAvcKeyframes";
- /**
- * Sets whether TS parsing should ignore AAC elementary streams. {@code boolean} expected.
- * Default value is {@code false}.
- */
- public static final String PARAMETER_TS_IGNORE_AAC_STREAM =
- "android.media.mediaparser.ts.ignoreAacStream";
- /**
- * Sets whether TS parsing should ignore AVC elementary streams. {@code boolean} expected.
- * Default value is {@code false}.
- */
- public static final String PARAMETER_TS_IGNORE_AVC_STREAM =
- "android.media.mediaparser.ts.ignoreAvcStream";
- /**
- * Sets whether TS parsing should ignore splice information streams. {@code boolean} expected.
- * Default value is {@code false}.
- */
- public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM =
- "android.media.mediaparser.ts.ignoreSpliceInfoStream";
- /**
- * Sets whether TS parsing should split AVC stream into access units based on slice headers.
- * {@code boolean} expected. Default value is {@code false}.
- *
- * <p>This flag should be left disabled if the stream contains access units delimiters in order
- * to avoid unnecessary computational costs.
- */
- public static final String PARAMETER_TS_DETECT_ACCESS_UNITS =
- "android.media.mediaparser.ts.ignoreDetectAccessUnits";
- /**
- * Sets whether TS parsing should handle HDMV DTS audio streams. {@code boolean} expected.
- * Default value is {@code false}.
- *
- * <p>Enabling this flag will disable the detection of SCTE subtitles.
- */
- public static final String PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS =
- "android.media.mediaparser.ts.enableHdmvDtsAudioStreams";
- /**
- * Sets whether encryption data should be sent in-band with the sample data, as per {@link
- * OutputConsumer#onSampleDataFound}. {@code boolean} expected. Default value is {@code false}.
- *
- * <p>If this parameter is set, encrypted samples' data will be prefixed with the encryption
- * information bytes. The format for in-band encryption information is:
- *
- * <ul>
- * <li>(1 byte) {@code encryption_signal_byte}: Most significant bit signals whether the
- * encryption data contains subsample encryption data. The remaining bits contain {@code
- * initialization_vector_size}.
- * <li>({@code initialization_vector_size} bytes) Initialization vector.
- * <li>If subsample encryption data is present, as per {@code encryption_signal_byte}, the
- * encryption data also contains:
- * <ul>
- * <li>(2 bytes) {@code subsample_encryption_data_length}.
- * <li>({@code subsample_encryption_data_length * 6} bytes) Subsample encryption data
- * (repeated {@code subsample_encryption_data_length} times):
- * <ul>
- * <li>(2 bytes) Size of a clear section in sample.
- * <li>(4 bytes) Size of an encryption section in sample.
- * </ul>
- * </ul>
- * </ul>
- *
- * @hide
- */
- public static final String PARAMETER_IN_BAND_CRYPTO_INFO =
- "android.media.mediaparser.inBandCryptoInfo";
- /**
- * Sets whether supplemental data should be included as part of the sample data. {@code boolean}
- * expected. Default value is {@code false}. See {@link #SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA} for
- * information about the sample data format.
- *
- * @hide
- */
- public static final String PARAMETER_INCLUDE_SUPPLEMENTAL_DATA =
- "android.media.mediaparser.includeSupplementalData";
- /**
- * Sets whether sample timestamps may start from non-zero offsets. {@code boolean} expected.
- * Default value is {@code false}.
- *
- * <p>When set to true, sample timestamps will not be offset to start from zero, and the media
- * provided timestamps will be used instead. For example, transport stream sample timestamps
- * will not be converted to a zero-based timebase.
- *
- * @hide
- */
- public static final String PARAMETER_IGNORE_TIMESTAMP_OFFSET =
- "android.media.mediaparser.ignoreTimestampOffset";
- /**
- * Sets whether each track type should be eagerly exposed. {@code boolean} expected. Default
- * value is {@code false}.
- *
- * <p>When set to true, each track type will be eagerly exposed through a call to {@link
- * OutputConsumer#onTrackDataFound} containing a single-value {@link MediaFormat}. The key for
- * the track type is {@code "track-type-string"}, and the possible values are {@code "video"},
- * {@code "audio"}, {@code "text"}, {@code "metadata"}, and {@code "unknown"}.
- *
- * @hide
- */
- public static final String PARAMETER_EAGERLY_EXPOSE_TRACKTYPE =
- "android.media.mediaparser.eagerlyExposeTrackType";
- /**
- * Sets whether a dummy {@link SeekMap} should be exposed before starting extraction. {@code
- * boolean} expected. Default value is {@code false}.
- *
- * <p>For each {@link SeekMap#getSeekPoints} call, the dummy {@link SeekMap} returns a single
- * {@link SeekPoint} whose {@link SeekPoint#timeMicros} matches the requested timestamp, and
- * whose {@link SeekPoint#position} is 0.
- *
- * @hide
- */
- public static final String PARAMETER_EXPOSE_DUMMY_SEEKMAP =
- "android.media.mediaparser.exposeDummySeekMap";
-
- /**
- * Sets whether chunk indices available in the extracted media should be exposed as {@link
- * MediaFormat MediaFormats}. {@code boolean} expected. Default value is {@link false}.
- *
- * <p>When set to true, any information about media segmentation will be exposed as a {@link
- * MediaFormat} (with track index 0) containing four {@link ByteBuffer} elements under the
- * following keys:
- *
- * <ul>
- * <li>"chunk-index-int-sizes": Contains {@code ints} representing the sizes in bytes of each
- * of the media segments.
- * <li>"chunk-index-long-offsets": Contains {@code longs} representing the byte offsets of
- * each segment in the stream.
- * <li>"chunk-index-long-us-durations": Contains {@code longs} representing the media duration
- * of each segment, in microseconds.
- * <li>"chunk-index-long-us-times": Contains {@code longs} representing the start time of each
- * segment, in microseconds.
- * </ul>
- *
- * @hide
- */
- public static final String PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT =
- "android.media.mediaParser.exposeChunkIndexAsMediaFormat";
- /**
- * Sets a list of closed-caption {@link MediaFormat MediaFormats} that should be exposed as part
- * of the extracted media. {@code List<MediaFormat>} expected. Default value is an empty list.
- *
- * <p>Expected keys in the {@link MediaFormat} are:
- *
- * <ul>
- * <p>{@link MediaFormat#KEY_MIME}: Determine the type of captions (for example,
- * application/cea-608). Mandatory.
- * <p>{@link MediaFormat#KEY_CAPTION_SERVICE_NUMBER}: Determine the channel on which the
- * captions are transmitted. Optional.
- * </ul>
- *
- * @hide
- */
- public static final String PARAMETER_EXPOSE_CAPTION_FORMATS =
- "android.media.mediaParser.exposeCaptionFormats";
- /**
- * Sets whether the value associated with {@link #PARAMETER_EXPOSE_CAPTION_FORMATS} should
- * override any in-band caption service declarations. {@code boolean} expected. Default value is
- * {@link false}.
- *
- * <p>When {@code false}, any present in-band caption services information will override the
- * values associated with {@link #PARAMETER_EXPOSE_CAPTION_FORMATS}.
- *
- * @hide
- */
- public static final String PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS =
- "android.media.mediaParser.overrideInBandCaptionDeclarations";
- /**
- * Sets whether a track for EMSG events should be exposed in case of parsing a container that
- * supports them. {@code boolean} expected. Default value is {@link false}.
- *
- * @hide
- */
- public static final String PARAMETER_EXPOSE_EMSG_TRACK =
- "android.media.mediaParser.exposeEmsgTrack";
-
- // Private constants.
-
- private static final String TAG = "MediaParser";
- private static final String JNI_LIBRARY_NAME = "mediaparser-jni";
- private static final Map<String, ExtractorFactory> EXTRACTOR_FACTORIES_BY_NAME;
- private static final Map<String, Class> EXPECTED_TYPE_BY_PARAMETER_NAME;
- private static final String TS_MODE_SINGLE_PMT = "single_pmt";
- private static final String TS_MODE_MULTI_PMT = "multi_pmt";
- private static final String TS_MODE_HLS = "hls";
- private static final int BYTES_PER_SUBSAMPLE_ENCRYPTION_ENTRY = 6;
- private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
- private static final String MEDIAMETRICS_ELEMENT_SEPARATOR = "|";
- private static final int MEDIAMETRICS_MAX_STRING_SIZE = 200;
- private static final int MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH;
- /**
- * Intentional error introduced to reported metrics to prevent identification of the parsed
- * media. Note: Increasing this value may cause older hostside CTS tests to fail.
- */
- private static final float MEDIAMETRICS_DITHER = .02f;
-
- @IntDef(
- value = {
- STATE_READING_SIGNAL_BYTE,
- STATE_READING_INIT_VECTOR,
- STATE_READING_SUBSAMPLE_ENCRYPTION_SIZE,
- STATE_READING_SUBSAMPLE_ENCRYPTION_DATA
- })
- private @interface EncryptionDataReadState {}
-
- private static final int STATE_READING_SIGNAL_BYTE = 0;
- private static final int STATE_READING_INIT_VECTOR = 1;
- private static final int STATE_READING_SUBSAMPLE_ENCRYPTION_SIZE = 2;
- private static final int STATE_READING_SUBSAMPLE_ENCRYPTION_DATA = 3;
-
- // Instance creation methods.
-
- /**
- * Creates an instance backed by the parser with the given {@code name}. The returned instance
- * will attempt parsing without sniffing the content.
- *
- * @param name The name of the parser that will be associated with the created instance.
- * @param outputConsumer The {@link OutputConsumer} to which track data and samples are pushed.
- * @return A new instance.
- * @throws IllegalArgumentException If an invalid name is provided.
- */
- @NonNull
- public static MediaParser createByName(
- @NonNull @ParserName String name, @NonNull OutputConsumer outputConsumer) {
- String[] nameAsArray = new String[] {name};
- assertValidNames(nameAsArray);
- return new MediaParser(outputConsumer, /* createdByName= */ true, name);
- }
-
- /**
- * Creates an instance whose backing parser will be selected by sniffing the content during the
- * first {@link #advance} call. Parser implementations will sniff the content in order of
- * appearance in {@code parserNames}.
- *
- * @param outputConsumer The {@link OutputConsumer} to which extracted data is output.
- * @param parserNames The names of the parsers to sniff the content with. If empty, a default
- * array of names is used.
- * @return A new instance.
- */
- @NonNull
- public static MediaParser create(
- @NonNull OutputConsumer outputConsumer, @NonNull @ParserName String... parserNames) {
- assertValidNames(parserNames);
- if (parserNames.length == 0) {
- parserNames = EXTRACTOR_FACTORIES_BY_NAME.keySet().toArray(new String[0]);
- }
- return new MediaParser(outputConsumer, /* createdByName= */ false, parserNames);
- }
-
- // Misc static methods.
-
- /**
- * Returns an immutable list with the names of the parsers that are suitable for container
- * formats with the given {@link MediaFormat}.
- *
- * <p>A parser supports a {@link MediaFormat} if the mime type associated with {@link
- * MediaFormat#KEY_MIME} corresponds to the supported container format.
- *
- * @param mediaFormat The {@link MediaFormat} to check support for.
- * @return The parser names that support the given {@code mediaFormat}, or the list of all
- * parsers available if no container specific format information is provided.
- */
- @NonNull
- @ParserName
- public static List<String> getParserNames(@NonNull MediaFormat mediaFormat) {
- String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
- mimeType = mimeType == null ? null : Util.toLowerInvariant(mimeType.trim());
- if (TextUtils.isEmpty(mimeType)) {
- // No MIME type provided. Return all.
- return Collections.unmodifiableList(
- new ArrayList<>(EXTRACTOR_FACTORIES_BY_NAME.keySet()));
- }
- ArrayList<String> result = new ArrayList<>();
- switch (mimeType) {
- case "video/x-matroska":
- case "audio/x-matroska":
- case "video/x-webm":
- case "audio/x-webm":
- result.add(PARSER_NAME_MATROSKA);
- break;
- case "video/mp4":
- case "audio/mp4":
- case "application/mp4":
- result.add(PARSER_NAME_MP4);
- result.add(PARSER_NAME_FMP4);
- break;
- case "audio/mpeg":
- result.add(PARSER_NAME_MP3);
- break;
- case "audio/aac":
- result.add(PARSER_NAME_ADTS);
- break;
- case "audio/ac3":
- result.add(PARSER_NAME_AC3);
- break;
- case "video/mp2t":
- case "audio/mp2t":
- result.add(PARSER_NAME_TS);
- break;
- case "video/x-flv":
- result.add(PARSER_NAME_FLV);
- break;
- case "video/ogg":
- case "audio/ogg":
- case "application/ogg":
- result.add(PARSER_NAME_OGG);
- break;
- case "video/mp2p":
- case "video/mp1s":
- result.add(PARSER_NAME_PS);
- break;
- case "audio/vnd.wave":
- case "audio/wav":
- case "audio/wave":
- case "audio/x-wav":
- result.add(PARSER_NAME_WAV);
- break;
- case "audio/amr":
- result.add(PARSER_NAME_AMR);
- break;
- case "audio/ac4":
- result.add(PARSER_NAME_AC4);
- break;
- case "audio/flac":
- case "audio/x-flac":
- result.add(PARSER_NAME_FLAC);
- break;
- default:
- // No parsers support the given mime type. Do nothing.
- break;
- }
- return Collections.unmodifiableList(result);
- }
-
- // Private fields.
-
- private final Map<String, Object> mParserParameters;
- private final OutputConsumer mOutputConsumer;
- private final String[] mParserNamesPool;
- private final PositionHolder mPositionHolder;
- private final InputReadingDataReader mExoDataReader;
- private final DataReaderAdapter mScratchDataReaderAdapter;
- private final ParsableByteArrayAdapter mScratchParsableByteArrayAdapter;
- @Nullable private final Constructor<DrmInitData.SchemeInitData> mSchemeInitDataConstructor;
- private final ArrayList<Format> mMuxedCaptionFormats;
- private boolean mInBandCryptoInfo;
- private boolean mIncludeSupplementalData;
- private boolean mIgnoreTimestampOffset;
- private boolean mEagerlyExposeTrackType;
- private boolean mExposeDummySeekMap;
- private boolean mExposeChunkIndexAsMediaFormat;
- private String mParserName;
- private Extractor mExtractor;
- private ExtractorInput mExtractorInput;
- private boolean mPendingExtractorInit;
- private long mPendingSeekPosition;
- private long mPendingSeekTimeMicros;
- private boolean mLoggedSchemeInitDataCreationException;
- private boolean mReleased;
-
- // MediaMetrics fields.
- @Nullable private LogSessionId mLogSessionId;
- private final boolean mCreatedByName;
- private final SparseArray<Format> mTrackFormats;
- private String mLastObservedExceptionName;
- private long mDurationMillis;
- private long mResourceByteCount;
-
- // Public methods.
-
- /**
- * Sets parser-specific parameters which allow customizing behavior.
- *
- * <p>Must be called before the first call to {@link #advance}.
- *
- * @param parameterName The name of the parameter to set. See {@code PARAMETER_*} constants for
- * documentation on possible values.
- * @param value The value to set for the given {@code parameterName}. See {@code PARAMETER_*}
- * constants for documentation on the expected types.
- * @return This instance, for convenience.
- * @throws IllegalStateException If called after calling {@link #advance} on the same instance.
- */
- @NonNull
- public MediaParser setParameter(
- @NonNull @ParameterName String parameterName, @NonNull Object value) {
- if (mExtractor != null) {
- throw new IllegalStateException(
- "setParameters() must be called before the first advance() call.");
- }
- Class expectedType = EXPECTED_TYPE_BY_PARAMETER_NAME.get(parameterName);
- // Ignore parameter names that are not contained in the map, in case the client is passing
- // a parameter that is being added in a future version of this library.
- if (expectedType != null && !expectedType.isInstance(value)) {
- throw new IllegalArgumentException(
- parameterName
- + " expects a "
- + expectedType.getSimpleName()
- + " but a "
- + value.getClass().getSimpleName()
- + " was passed.");
- }
- if (PARAMETER_TS_MODE.equals(parameterName)
- && !TS_MODE_SINGLE_PMT.equals(value)
- && !TS_MODE_HLS.equals(value)
- && !TS_MODE_MULTI_PMT.equals(value)) {
- throw new IllegalArgumentException(PARAMETER_TS_MODE + " does not accept: " + value);
- }
- if (PARAMETER_IN_BAND_CRYPTO_INFO.equals(parameterName)) {
- mInBandCryptoInfo = (boolean) value;
- }
- if (PARAMETER_INCLUDE_SUPPLEMENTAL_DATA.equals(parameterName)) {
- mIncludeSupplementalData = (boolean) value;
- }
- if (PARAMETER_IGNORE_TIMESTAMP_OFFSET.equals(parameterName)) {
- mIgnoreTimestampOffset = (boolean) value;
- }
- if (PARAMETER_EAGERLY_EXPOSE_TRACKTYPE.equals(parameterName)) {
- mEagerlyExposeTrackType = (boolean) value;
- }
- if (PARAMETER_EXPOSE_DUMMY_SEEKMAP.equals(parameterName)) {
- mExposeDummySeekMap = (boolean) value;
- }
- if (PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT.equals(parameterName)) {
- mExposeChunkIndexAsMediaFormat = (boolean) value;
- }
- if (PARAMETER_EXPOSE_CAPTION_FORMATS.equals(parameterName)) {
- setMuxedCaptionFormats((List<MediaFormat>) value);
- }
- mParserParameters.put(parameterName, value);
- return this;
- }
-
- /**
- * Returns whether the given {@code parameterName} is supported by this parser.
- *
- * @param parameterName The parameter name to check support for. One of the {@code PARAMETER_*}
- * constants.
- * @return Whether the given {@code parameterName} is supported.
- */
- public boolean supportsParameter(@NonNull @ParameterName String parameterName) {
- return EXPECTED_TYPE_BY_PARAMETER_NAME.containsKey(parameterName);
- }
-
- /**
- * Returns the name of the backing parser implementation.
- *
- * <p>If this instance was creating using {@link #createByName}, the provided name is returned.
- * If this instance was created using {@link #create}, this method will return {@link
- * #PARSER_NAME_UNKNOWN} until the first call to {@link #advance}, after which the name of the
- * backing parser implementation is returned.
- *
- * @return The name of the backing parser implementation, or null if the backing parser
- * implementation has not yet been selected.
- */
- @NonNull
- @ParserName
- public String getParserName() {
- return mParserName;
- }
-
- /**
- * Makes progress in the extraction of the input media stream, unless the end of the input has
- * been reached.
- *
- * <p>This method will block until some progress has been made.
- *
- * <p>If this instance was created using {@link #create}, the first call to this method will
- * sniff the content using the selected parser implementations.
- *
- * @param seekableInputReader The {@link SeekableInputReader} from which to obtain the media
- * container data.
- * @return Whether there is any data left to extract. Returns false if the end of input has been
- * reached.
- * @throws IOException If an error occurs while reading from the {@link SeekableInputReader}.
- * @throws UnrecognizedInputFormatException If the format cannot be recognized by any of the
- * underlying parser implementations.
- */
- public boolean advance(@NonNull SeekableInputReader seekableInputReader) throws IOException {
- if (mExtractorInput == null) {
- // TODO: For efficiency, the same implementation should be used, by providing a
- // clearBuffers() method, or similar.
- long resourceLength = seekableInputReader.getLength();
- if (mResourceByteCount == 0) {
- // For resource byte count metric collection, we only take into account the length
- // of the first provided input reader.
- mResourceByteCount = resourceLength;
- }
- mExtractorInput =
- new DefaultExtractorInput(
- mExoDataReader, seekableInputReader.getPosition(), resourceLength);
- }
- mExoDataReader.mInputReader = seekableInputReader;
-
- if (mExtractor == null) {
- mPendingExtractorInit = true;
- if (!mParserName.equals(PARSER_NAME_UNKNOWN)) {
- mExtractor = createExtractor(mParserName);
- } else {
- for (String parserName : mParserNamesPool) {
- Extractor extractor = createExtractor(parserName);
- try {
- if (extractor.sniff(mExtractorInput)) {
- mParserName = parserName;
- mExtractor = extractor;
- mPendingExtractorInit = true;
- break;
- }
- } catch (EOFException e) {
- // Do nothing.
- } finally {
- mExtractorInput.resetPeekPosition();
- }
- }
- if (mExtractor == null) {
- UnrecognizedInputFormatException exception =
- UnrecognizedInputFormatException.createForExtractors(mParserNamesPool);
- mLastObservedExceptionName = exception.getClass().getName();
- throw exception;
- }
- return true;
- }
- }
-
- if (mPendingExtractorInit) {
- if (mExposeDummySeekMap) {
- // We propagate the dummy seek map before initializing the extractor, in case the
- // extractor initialization outputs a seek map.
- mOutputConsumer.onSeekMapFound(SeekMap.DUMMY);
- }
- mExtractor.init(new ExtractorOutputAdapter());
- mPendingExtractorInit = false;
- // We return after initialization to allow clients use any output information before
- // starting actual extraction.
- return true;
- }
-
- if (isPendingSeek()) {
- mExtractor.seek(mPendingSeekPosition, mPendingSeekTimeMicros);
- removePendingSeek();
- }
-
- mPositionHolder.position = seekableInputReader.getPosition();
- int result;
- try {
- result = mExtractor.read(mExtractorInput, mPositionHolder);
- } catch (Exception e) {
- mLastObservedExceptionName = e.getClass().getName();
- if (e instanceof ParserException) {
- throw new ParsingException((ParserException) e);
- } else {
- throw e;
- }
- }
- if (result == Extractor.RESULT_END_OF_INPUT) {
- mExtractorInput = null;
- return false;
- }
- if (result == Extractor.RESULT_SEEK) {
- mExtractorInput = null;
- seekableInputReader.seekToPosition(mPositionHolder.position);
- }
- return true;
- }
-
- /**
- * Seeks within the media container being extracted.
- *
- * <p>{@link SeekPoint SeekPoints} can be obtained from the {@link SeekMap} passed to {@link
- * OutputConsumer#onSeekMapFound(SeekMap)}.
- *
- * <p>Following a call to this method, the {@link InputReader} passed to the next invocation of
- * {@link #advance} must provide data starting from {@link SeekPoint#position} in the stream.
- *
- * @param seekPoint The {@link SeekPoint} to seek to.
- */
- public void seek(@NonNull SeekPoint seekPoint) {
- if (mExtractor == null) {
- mPendingSeekPosition = seekPoint.position;
- mPendingSeekTimeMicros = seekPoint.timeMicros;
- } else {
- mExtractor.seek(seekPoint.position, seekPoint.timeMicros);
- }
- }
-
- /**
- * Releases any acquired resources.
- *
- * <p>After calling this method, this instance becomes unusable and no other methods should be
- * invoked.
- */
- public void release() {
- mExtractorInput = null;
- mExtractor = null;
- if (mReleased) {
- // Nothing to do.
- return;
- }
- mReleased = true;
-
- String trackMimeTypes = buildMediaMetricsString(format -> format.sampleMimeType);
- String trackCodecs = buildMediaMetricsString(format -> format.codecs);
- int videoWidth = -1;
- int videoHeight = -1;
- for (int i = 0; i < mTrackFormats.size(); i++) {
- Format format = mTrackFormats.valueAt(i);
- if (format.width != Format.NO_VALUE && format.height != Format.NO_VALUE) {
- videoWidth = format.width;
- videoHeight = format.height;
- break;
- }
- }
-
- String alteredParameters =
- String.join(
- MEDIAMETRICS_ELEMENT_SEPARATOR,
- mParserParameters.keySet().toArray(new String[0]));
- alteredParameters =
- alteredParameters.substring(
- 0,
- Math.min(
- alteredParameters.length(),
- MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH));
-
- nativeSubmitMetrics(
- SdkLevel.isAtLeastS() ? getLogSessionIdStringV31() : "",
- mParserName,
- mCreatedByName,
- String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool),
- mLastObservedExceptionName,
- addDither(mResourceByteCount),
- addDither(mDurationMillis),
- trackMimeTypes,
- trackCodecs,
- alteredParameters,
- videoWidth,
- videoHeight);
- }
-
- @RequiresApi(31)
- public void setLogSessionId(@NonNull LogSessionId logSessionId) {
- this.mLogSessionId = Objects.requireNonNull(logSessionId);
- }
-
- @RequiresApi(31)
- @NonNull
- public LogSessionId getLogSessionId() {
- return mLogSessionId != null ? mLogSessionId : LogSessionId.LOG_SESSION_ID_NONE;
- }
-
- // Private methods.
-
- private MediaParser(
- OutputConsumer outputConsumer, boolean createdByName, String... parserNamesPool) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
- throw new UnsupportedOperationException("Android version must be R or greater.");
- }
- mParserParameters = new HashMap<>();
- mOutputConsumer = outputConsumer;
- mParserNamesPool = parserNamesPool;
- mCreatedByName = createdByName;
- mParserName = createdByName ? parserNamesPool[0] : PARSER_NAME_UNKNOWN;
- mPositionHolder = new PositionHolder();
- mExoDataReader = new InputReadingDataReader();
- removePendingSeek();
- mScratchDataReaderAdapter = new DataReaderAdapter();
- mScratchParsableByteArrayAdapter = new ParsableByteArrayAdapter();
- mSchemeInitDataConstructor = getSchemeInitDataConstructor();
- mMuxedCaptionFormats = new ArrayList<>();
-
- // MediaMetrics.
- mTrackFormats = new SparseArray<>();
- mLastObservedExceptionName = "";
- mDurationMillis = -1;
- }
-
- private String buildMediaMetricsString(Function<Format, String> formatFieldGetter) {
- StringBuilder stringBuilder = new StringBuilder();
- for (int i = 0; i < mTrackFormats.size(); i++) {
- if (i > 0) {
- stringBuilder.append(MEDIAMETRICS_ELEMENT_SEPARATOR);
- }
- String fieldValue = formatFieldGetter.apply(mTrackFormats.valueAt(i));
- stringBuilder.append(fieldValue != null ? fieldValue : "");
- }
- return stringBuilder.substring(
- 0, Math.min(stringBuilder.length(), MEDIAMETRICS_MAX_STRING_SIZE));
- }
-
- private void setMuxedCaptionFormats(List<MediaFormat> mediaFormats) {
- mMuxedCaptionFormats.clear();
- for (MediaFormat mediaFormat : mediaFormats) {
- mMuxedCaptionFormats.add(toExoPlayerCaptionFormat(mediaFormat));
- }
- }
-
- private boolean isPendingSeek() {
- return mPendingSeekPosition >= 0;
- }
-
- private void removePendingSeek() {
- mPendingSeekPosition = -1;
- mPendingSeekTimeMicros = -1;
- }
-
- private Extractor createExtractor(String parserName) {
- int flags = 0;
- TimestampAdjuster timestampAdjuster = null;
- if (mIgnoreTimestampOffset) {
- timestampAdjuster = new TimestampAdjuster(TimestampAdjuster.DO_NOT_OFFSET);
- }
- switch (parserName) {
- case PARSER_NAME_MATROSKA:
- flags =
- getBooleanParameter(PARAMETER_MATROSKA_DISABLE_CUES_SEEKING)
- ? MatroskaExtractor.FLAG_DISABLE_SEEK_FOR_CUES
- : 0;
- return new MatroskaExtractor(flags);
- case PARSER_NAME_FMP4:
- flags |=
- getBooleanParameter(PARAMETER_EXPOSE_EMSG_TRACK)
- ? FragmentedMp4Extractor.FLAG_ENABLE_EMSG_TRACK
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_MP4_IGNORE_EDIT_LISTS)
- ? FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_MP4_IGNORE_TFDT_BOX)
- ? FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_TFDT_BOX
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES)
- ? FragmentedMp4Extractor
- .FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME
- : 0;
- return new FragmentedMp4Extractor(
- flags,
- timestampAdjuster,
- /* sideloadedTrack= */ null,
- mMuxedCaptionFormats);
- case PARSER_NAME_MP4:
- flags |=
- getBooleanParameter(PARAMETER_MP4_IGNORE_EDIT_LISTS)
- ? Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS
- : 0;
- return new Mp4Extractor(flags);
- case PARSER_NAME_MP3:
- flags |=
- getBooleanParameter(PARAMETER_MP3_DISABLE_ID3)
- ? Mp3Extractor.FLAG_DISABLE_ID3_METADATA
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_MP3_ENABLE_CBR_SEEKING)
- ? Mp3Extractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING
- : 0;
- // TODO: Add index seeking once we update the ExoPlayer version.
- return new Mp3Extractor(flags);
- case PARSER_NAME_ADTS:
- flags |=
- getBooleanParameter(PARAMETER_ADTS_ENABLE_CBR_SEEKING)
- ? AdtsExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING
- : 0;
- return new AdtsExtractor(flags);
- case PARSER_NAME_AC3:
- return new Ac3Extractor();
- case PARSER_NAME_TS:
- flags |=
- getBooleanParameter(PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES)
- ? DefaultTsPayloadReaderFactory.FLAG_ALLOW_NON_IDR_KEYFRAMES
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_TS_DETECT_ACCESS_UNITS)
- ? DefaultTsPayloadReaderFactory.FLAG_DETECT_ACCESS_UNITS
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS)
- ? DefaultTsPayloadReaderFactory.FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_TS_IGNORE_AAC_STREAM)
- ? DefaultTsPayloadReaderFactory.FLAG_IGNORE_AAC_STREAM
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_TS_IGNORE_AVC_STREAM)
- ? DefaultTsPayloadReaderFactory.FLAG_IGNORE_H264_STREAM
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM)
- ? DefaultTsPayloadReaderFactory.FLAG_IGNORE_SPLICE_INFO_STREAM
- : 0;
- flags |=
- getBooleanParameter(PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS)
- ? DefaultTsPayloadReaderFactory.FLAG_OVERRIDE_CAPTION_DESCRIPTORS
- : 0;
- String tsMode = getStringParameter(PARAMETER_TS_MODE, TS_MODE_SINGLE_PMT);
- int hlsMode =
- TS_MODE_SINGLE_PMT.equals(tsMode)
- ? TsExtractor.MODE_SINGLE_PMT
- : TS_MODE_HLS.equals(tsMode)
- ? TsExtractor.MODE_HLS
- : TsExtractor.MODE_MULTI_PMT;
- return new TsExtractor(
- hlsMode,
- timestampAdjuster != null
- ? timestampAdjuster
- : new TimestampAdjuster(/* firstSampleTimestampUs= */ 0),
- new DefaultTsPayloadReaderFactory(flags, mMuxedCaptionFormats));
- case PARSER_NAME_FLV:
- return new FlvExtractor();
- case PARSER_NAME_OGG:
- return new OggExtractor();
- case PARSER_NAME_PS:
- return new PsExtractor();
- case PARSER_NAME_WAV:
- return new WavExtractor();
- case PARSER_NAME_AMR:
- flags |=
- getBooleanParameter(PARAMETER_AMR_ENABLE_CBR_SEEKING)
- ? AmrExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING
- : 0;
- return new AmrExtractor(flags);
- case PARSER_NAME_AC4:
- return new Ac4Extractor();
- case PARSER_NAME_FLAC:
- flags |=
- getBooleanParameter(PARAMETER_FLAC_DISABLE_ID3)
- ? FlacExtractor.FLAG_DISABLE_ID3_METADATA
- : 0;
- return new FlacExtractor(flags);
- default:
- // Should never happen.
- throw new IllegalStateException("Unexpected attempt to create: " + parserName);
- }
- }
-
- private boolean getBooleanParameter(String name) {
- return (boolean) mParserParameters.getOrDefault(name, false);
- }
-
- private String getStringParameter(String name, String defaultValue) {
- return (String) mParserParameters.getOrDefault(name, defaultValue);
- }
-
- @RequiresApi(31)
- private String getLogSessionIdStringV31() {
- return mLogSessionId != null ? mLogSessionId.getStringId() : "";
- }
-
- // Private classes.
-
- private static final class InputReadingDataReader implements DataReader {
-
- public InputReader mInputReader;
-
- @Override
- public int read(byte[] buffer, int offset, int readLength) throws IOException {
- return mInputReader.read(buffer, offset, readLength);
- }
- }
-
- private final class MediaParserDrmInitData extends DrmInitData {
-
- private final SchemeInitData[] mSchemeDatas;
-
- private MediaParserDrmInitData(com.google.android.exoplayer2.drm.DrmInitData exoDrmInitData)
- throws IllegalAccessException, InstantiationException, InvocationTargetException {
- mSchemeDatas = new SchemeInitData[exoDrmInitData.schemeDataCount];
- for (int i = 0; i < mSchemeDatas.length; i++) {
- mSchemeDatas[i] = toFrameworkSchemeInitData(exoDrmInitData.get(i));
- }
- }
-
- @Override
- @Nullable
- public SchemeInitData get(UUID schemeUuid) {
- for (SchemeInitData schemeInitData : mSchemeDatas) {
- if (schemeInitData.uuid.equals(schemeUuid)) {
- return schemeInitData;
- }
- }
- return null;
- }
-
- @Override
- public SchemeInitData getSchemeInitDataAt(int index) {
- return mSchemeDatas[index];
- }
-
- @Override
- public int getSchemeInitDataCount() {
- return mSchemeDatas.length;
- }
-
- private DrmInitData.SchemeInitData toFrameworkSchemeInitData(SchemeData exoSchemeData)
- throws IllegalAccessException, InvocationTargetException, InstantiationException {
- return mSchemeInitDataConstructor.newInstance(
- exoSchemeData.uuid, exoSchemeData.mimeType, exoSchemeData.data);
- }
- }
-
- private final class ExtractorOutputAdapter implements ExtractorOutput {
-
- private final SparseArray<TrackOutput> mTrackOutputAdapters;
- private boolean mTracksEnded;
-
- private ExtractorOutputAdapter() {
- mTrackOutputAdapters = new SparseArray<>();
- }
-
- @Override
- public TrackOutput track(int id, int type) {
- TrackOutput trackOutput = mTrackOutputAdapters.get(id);
- if (trackOutput == null) {
- int trackIndex = mTrackOutputAdapters.size();
- trackOutput = new TrackOutputAdapter(trackIndex);
- mTrackOutputAdapters.put(id, trackOutput);
- if (mEagerlyExposeTrackType) {
- MediaFormat mediaFormat = new MediaFormat();
- mediaFormat.setString("track-type-string", toTypeString(type));
- mOutputConsumer.onTrackDataFound(
- trackIndex, new TrackData(mediaFormat, /* drmInitData= */ null));
- }
- }
- return trackOutput;
- }
-
- @Override
- public void endTracks() {
- mOutputConsumer.onTrackCountFound(mTrackOutputAdapters.size());
- }
-
- @Override
- public void seekMap(com.google.android.exoplayer2.extractor.SeekMap exoplayerSeekMap) {
- long durationUs = exoplayerSeekMap.getDurationUs();
- if (durationUs != C.TIME_UNSET) {
- mDurationMillis = C.usToMs(durationUs);
- }
- if (mExposeChunkIndexAsMediaFormat && exoplayerSeekMap instanceof ChunkIndex) {
- ChunkIndex chunkIndex = (ChunkIndex) exoplayerSeekMap;
- MediaFormat mediaFormat = new MediaFormat();
- mediaFormat.setByteBuffer("chunk-index-int-sizes", toByteBuffer(chunkIndex.sizes));
- mediaFormat.setByteBuffer(
- "chunk-index-long-offsets", toByteBuffer(chunkIndex.offsets));
- mediaFormat.setByteBuffer(
- "chunk-index-long-us-durations", toByteBuffer(chunkIndex.durationsUs));
- mediaFormat.setByteBuffer(
- "chunk-index-long-us-times", toByteBuffer(chunkIndex.timesUs));
- mOutputConsumer.onTrackDataFound(
- /* trackIndex= */ 0, new TrackData(mediaFormat, /* drmInitData= */ null));
- }
- mOutputConsumer.onSeekMapFound(new SeekMap(exoplayerSeekMap));
- }
- }
-
- private class TrackOutputAdapter implements TrackOutput {
-
- private final int mTrackIndex;
-
- private CryptoInfo mLastOutputCryptoInfo;
- private CryptoInfo.Pattern mLastOutputEncryptionPattern;
- private CryptoData mLastReceivedCryptoData;
-
- @EncryptionDataReadState private int mEncryptionDataReadState;
- private int mEncryptionDataSizeToSubtractFromSampleDataSize;
- private int mEncryptionVectorSize;
- private byte[] mScratchIvSpace;
- private int mSubsampleEncryptionDataSize;
- private int[] mScratchSubsampleEncryptedBytesCount;
- private int[] mScratchSubsampleClearBytesCount;
- private boolean mHasSubsampleEncryptionData;
- private int mSkippedSupplementalDataBytes;
-
- private TrackOutputAdapter(int trackIndex) {
- mTrackIndex = trackIndex;
- mScratchIvSpace = new byte[16]; // Size documented in CryptoInfo.
- mScratchSubsampleEncryptedBytesCount = new int[32];
- mScratchSubsampleClearBytesCount = new int[32];
- mEncryptionDataReadState = STATE_READING_SIGNAL_BYTE;
- mLastOutputEncryptionPattern =
- new CryptoInfo.Pattern(/* blocksToEncrypt= */ 0, /* blocksToSkip= */ 0);
- }
-
- @Override
- public void format(Format format) {
- mTrackFormats.put(mTrackIndex, format);
- mOutputConsumer.onTrackDataFound(
- mTrackIndex,
- new TrackData(
- toMediaFormat(format), toFrameworkDrmInitData(format.drmInitData)));
- }
-
- @Override
- public int sampleData(
- DataReader input,
- int length,
- boolean allowEndOfInput,
- @SampleDataPart int sampleDataPart)
- throws IOException {
- mScratchDataReaderAdapter.setDataReader(input, length);
- long positionBeforeReading = mScratchDataReaderAdapter.getPosition();
- mOutputConsumer.onSampleDataFound(mTrackIndex, mScratchDataReaderAdapter);
- return (int) (mScratchDataReaderAdapter.getPosition() - positionBeforeReading);
- }
-
- @Override
- public void sampleData(
- ParsableByteArray data, int length, @SampleDataPart int sampleDataPart) {
- if (sampleDataPart == SAMPLE_DATA_PART_ENCRYPTION && !mInBandCryptoInfo) {
- while (length > 0) {
- switch (mEncryptionDataReadState) {
- case STATE_READING_SIGNAL_BYTE:
- int encryptionSignalByte = data.readUnsignedByte();
- length--;
- mHasSubsampleEncryptionData = ((encryptionSignalByte >> 7) & 1) != 0;
- mEncryptionVectorSize = encryptionSignalByte & 0x7F;
- mEncryptionDataSizeToSubtractFromSampleDataSize =
- mEncryptionVectorSize + 1; // Signal byte.
- mEncryptionDataReadState = STATE_READING_INIT_VECTOR;
- break;
- case STATE_READING_INIT_VECTOR:
- Arrays.fill(mScratchIvSpace, (byte) 0); // Ensure 0-padding.
- data.readBytes(mScratchIvSpace, /* offset= */ 0, mEncryptionVectorSize);
- length -= mEncryptionVectorSize;
- if (mHasSubsampleEncryptionData) {
- mEncryptionDataReadState = STATE_READING_SUBSAMPLE_ENCRYPTION_SIZE;
- } else {
- mSubsampleEncryptionDataSize = 0;
- mEncryptionDataReadState = STATE_READING_SIGNAL_BYTE;
- }
- break;
- case STATE_READING_SUBSAMPLE_ENCRYPTION_SIZE:
- mSubsampleEncryptionDataSize = data.readUnsignedShort();
- if (mScratchSubsampleClearBytesCount.length
- < mSubsampleEncryptionDataSize) {
- mScratchSubsampleClearBytesCount =
- new int[mSubsampleEncryptionDataSize];
- mScratchSubsampleEncryptedBytesCount =
- new int[mSubsampleEncryptionDataSize];
- }
- length -= 2;
- mEncryptionDataSizeToSubtractFromSampleDataSize +=
- 2
- + mSubsampleEncryptionDataSize
- * BYTES_PER_SUBSAMPLE_ENCRYPTION_ENTRY;
- mEncryptionDataReadState = STATE_READING_SUBSAMPLE_ENCRYPTION_DATA;
- break;
- case STATE_READING_SUBSAMPLE_ENCRYPTION_DATA:
- for (int i = 0; i < mSubsampleEncryptionDataSize; i++) {
- mScratchSubsampleClearBytesCount[i] = data.readUnsignedShort();
- mScratchSubsampleEncryptedBytesCount[i] = data.readInt();
- }
- length -=
- mSubsampleEncryptionDataSize
- * BYTES_PER_SUBSAMPLE_ENCRYPTION_ENTRY;
- mEncryptionDataReadState = STATE_READING_SIGNAL_BYTE;
- if (length != 0) {
- throw new IllegalStateException();
- }
- break;
- default:
- // Never happens.
- throw new IllegalStateException();
- }
- }
- } else if (sampleDataPart == SAMPLE_DATA_PART_SUPPLEMENTAL
- && !mIncludeSupplementalData) {
- mSkippedSupplementalDataBytes += length;
- data.skipBytes(length);
- } else {
- outputSampleData(data, length);
- }
- }
-
- @Override
- public void sampleMetadata(
- long timeUs, int flags, int size, int offset, @Nullable CryptoData cryptoData) {
- size -= mSkippedSupplementalDataBytes;
- mSkippedSupplementalDataBytes = 0;
- mOutputConsumer.onSampleCompleted(
- mTrackIndex,
- timeUs,
- getMediaParserFlags(flags),
- size - mEncryptionDataSizeToSubtractFromSampleDataSize,
- offset,
- getPopulatedCryptoInfo(cryptoData));
- mEncryptionDataReadState = STATE_READING_SIGNAL_BYTE;
- mEncryptionDataSizeToSubtractFromSampleDataSize = 0;
- }
-
- @Nullable
- private CryptoInfo getPopulatedCryptoInfo(@Nullable CryptoData cryptoData) {
- if (cryptoData == null) {
- // The sample is not encrypted.
- return null;
- } else if (mInBandCryptoInfo) {
- if (cryptoData != mLastReceivedCryptoData) {
- mLastOutputCryptoInfo =
- createNewCryptoInfoAndPopulateWithCryptoData(cryptoData);
- // We are using in-band crypto info, so the IV will be ignored. But we prevent
- // it from being null because toString assumes it non-null.
- mLastOutputCryptoInfo.iv = EMPTY_BYTE_ARRAY;
- }
- } else /* We must populate the full CryptoInfo. */ {
- // CryptoInfo.pattern is not accessible to the user, so the user needs to feed
- // this CryptoInfo directly to MediaCodec. We need to create a new CryptoInfo per
- // sample because of per-sample initialization vector changes.
- CryptoInfo newCryptoInfo = createNewCryptoInfoAndPopulateWithCryptoData(cryptoData);
- newCryptoInfo.iv = Arrays.copyOf(mScratchIvSpace, mScratchIvSpace.length);
- boolean canReuseSubsampleInfo =
- mLastOutputCryptoInfo != null
- && mLastOutputCryptoInfo.numSubSamples
- == mSubsampleEncryptionDataSize;
- for (int i = 0; i < mSubsampleEncryptionDataSize && canReuseSubsampleInfo; i++) {
- canReuseSubsampleInfo =
- mLastOutputCryptoInfo.numBytesOfClearData[i]
- == mScratchSubsampleClearBytesCount[i]
- && mLastOutputCryptoInfo.numBytesOfEncryptedData[i]
- == mScratchSubsampleEncryptedBytesCount[i];
- }
- newCryptoInfo.numSubSamples = mSubsampleEncryptionDataSize;
- if (canReuseSubsampleInfo) {
- newCryptoInfo.numBytesOfClearData = mLastOutputCryptoInfo.numBytesOfClearData;
- newCryptoInfo.numBytesOfEncryptedData =
- mLastOutputCryptoInfo.numBytesOfEncryptedData;
- } else {
- newCryptoInfo.numBytesOfClearData =
- Arrays.copyOf(
- mScratchSubsampleClearBytesCount, mSubsampleEncryptionDataSize);
- newCryptoInfo.numBytesOfEncryptedData =
- Arrays.copyOf(
- mScratchSubsampleEncryptedBytesCount,
- mSubsampleEncryptionDataSize);
- }
- mLastOutputCryptoInfo = newCryptoInfo;
- }
- mLastReceivedCryptoData = cryptoData;
- return mLastOutputCryptoInfo;
- }
-
- private CryptoInfo createNewCryptoInfoAndPopulateWithCryptoData(CryptoData cryptoData) {
- CryptoInfo cryptoInfo = new CryptoInfo();
- cryptoInfo.key = cryptoData.encryptionKey;
- cryptoInfo.mode = cryptoData.cryptoMode;
- if (cryptoData.clearBlocks != mLastOutputEncryptionPattern.getSkipBlocks()
- || cryptoData.encryptedBlocks
- != mLastOutputEncryptionPattern.getEncryptBlocks()) {
- mLastOutputEncryptionPattern =
- new CryptoInfo.Pattern(cryptoData.encryptedBlocks, cryptoData.clearBlocks);
- }
- cryptoInfo.setPattern(mLastOutputEncryptionPattern);
- return cryptoInfo;
- }
-
- private void outputSampleData(ParsableByteArray data, int length) {
- mScratchParsableByteArrayAdapter.resetWithByteArray(data, length);
- try {
- // Read all bytes from data. ExoPlayer extractors expect all sample data to be
- // consumed by TrackOutput implementations when passing a ParsableByteArray.
- while (mScratchParsableByteArrayAdapter.getLength() > 0) {
- mOutputConsumer.onSampleDataFound(
- mTrackIndex, mScratchParsableByteArrayAdapter);
- }
- } catch (IOException e) {
- // Unexpected.
- throw new RuntimeException(e);
- }
- }
- }
-
- private static final class DataReaderAdapter implements InputReader {
-
- private DataReader mDataReader;
- private int mCurrentPosition;
- private long mLength;
-
- public void setDataReader(DataReader dataReader, long length) {
- mDataReader = dataReader;
- mCurrentPosition = 0;
- mLength = length;
- }
-
- // Input implementation.
-
- @Override
- public int read(byte[] buffer, int offset, int readLength) throws IOException {
- int readBytes = 0;
- readBytes = mDataReader.read(buffer, offset, readLength);
- mCurrentPosition += readBytes;
- return readBytes;
- }
-
- @Override
- public long getPosition() {
- return mCurrentPosition;
- }
-
- @Override
- public long getLength() {
- return mLength - mCurrentPosition;
- }
- }
-
- private static final class ParsableByteArrayAdapter implements InputReader {
-
- private ParsableByteArray mByteArray;
- private long mLength;
- private int mCurrentPosition;
-
- public void resetWithByteArray(ParsableByteArray byteArray, long length) {
- mByteArray = byteArray;
- mCurrentPosition = 0;
- mLength = length;
- }
-
- // Input implementation.
-
- @Override
- public int read(byte[] buffer, int offset, int readLength) {
- mByteArray.readBytes(buffer, offset, readLength);
- mCurrentPosition += readLength;
- return readLength;
- }
-
- @Override
- public long getPosition() {
- return mCurrentPosition;
- }
-
- @Override
- public long getLength() {
- return mLength - mCurrentPosition;
- }
- }
-
- private static final class DummyExoPlayerSeekMap
- implements com.google.android.exoplayer2.extractor.SeekMap {
-
- @Override
- public boolean isSeekable() {
- return true;
- }
-
- @Override
- public long getDurationUs() {
- return C.TIME_UNSET;
- }
-
- @Override
- public SeekPoints getSeekPoints(long timeUs) {
- com.google.android.exoplayer2.extractor.SeekPoint seekPoint =
- new com.google.android.exoplayer2.extractor.SeekPoint(
- timeUs, /* position= */ 0);
- return new SeekPoints(seekPoint, seekPoint);
- }
- }
-
- /** Creates extractor instances. */
- private interface ExtractorFactory {
-
- /** Returns a new extractor instance. */
- Extractor createInstance();
- }
-
- // Private static methods.
-
- private static Format toExoPlayerCaptionFormat(MediaFormat mediaFormat) {
- Format.Builder formatBuilder =
- new Format.Builder().setSampleMimeType(mediaFormat.getString(MediaFormat.KEY_MIME));
- if (mediaFormat.containsKey(MediaFormat.KEY_CAPTION_SERVICE_NUMBER)) {
- formatBuilder.setAccessibilityChannel(
- mediaFormat.getInteger(MediaFormat.KEY_CAPTION_SERVICE_NUMBER));
- }
- return formatBuilder.build();
- }
-
- private static MediaFormat toMediaFormat(Format format) {
- MediaFormat result = new MediaFormat();
- setOptionalMediaFormatInt(result, MediaFormat.KEY_BIT_RATE, format.bitrate);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_CHANNEL_COUNT, format.channelCount);
-
- ColorInfo colorInfo = format.colorInfo;
- if (colorInfo != null) {
- setOptionalMediaFormatInt(
- result, MediaFormat.KEY_COLOR_TRANSFER, colorInfo.colorTransfer);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_COLOR_RANGE, colorInfo.colorRange);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_COLOR_STANDARD, colorInfo.colorSpace);
-
- if (format.colorInfo.hdrStaticInfo != null) {
- result.setByteBuffer(
- MediaFormat.KEY_HDR_STATIC_INFO,
- ByteBuffer.wrap(format.colorInfo.hdrStaticInfo));
- }
- }
-
- setOptionalMediaFormatString(result, MediaFormat.KEY_MIME, format.sampleMimeType);
- setOptionalMediaFormatString(result, MediaFormat.KEY_CODECS_STRING, format.codecs);
- if (format.frameRate != Format.NO_VALUE) {
- result.setFloat(MediaFormat.KEY_FRAME_RATE, format.frameRate);
- }
- setOptionalMediaFormatInt(result, MediaFormat.KEY_WIDTH, format.width);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_HEIGHT, format.height);
-
- List<byte[]> initData = format.initializationData;
- for (int i = 0; i < initData.size(); i++) {
- result.setByteBuffer("csd-" + i, ByteBuffer.wrap(initData.get(i)));
- }
- setPcmEncoding(format, result);
- setOptionalMediaFormatString(result, MediaFormat.KEY_LANGUAGE, format.language);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_MAX_INPUT_SIZE, format.maxInputSize);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_ROTATION, format.rotationDegrees);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_SAMPLE_RATE, format.sampleRate);
- setOptionalMediaFormatInt(
- result, MediaFormat.KEY_CAPTION_SERVICE_NUMBER, format.accessibilityChannel);
-
- int selectionFlags = format.selectionFlags;
- result.setInteger(
- MediaFormat.KEY_IS_AUTOSELECT, selectionFlags & C.SELECTION_FLAG_AUTOSELECT);
- result.setInteger(MediaFormat.KEY_IS_DEFAULT, selectionFlags & C.SELECTION_FLAG_DEFAULT);
- result.setInteger(
- MediaFormat.KEY_IS_FORCED_SUBTITLE, selectionFlags & C.SELECTION_FLAG_FORCED);
-
- setOptionalMediaFormatInt(result, MediaFormat.KEY_ENCODER_DELAY, format.encoderDelay);
- setOptionalMediaFormatInt(result, MediaFormat.KEY_ENCODER_PADDING, format.encoderPadding);
-
- if (format.pixelWidthHeightRatio != Format.NO_VALUE && format.pixelWidthHeightRatio != 0) {
- int parWidth = 1;
- int parHeight = 1;
- if (format.pixelWidthHeightRatio < 1.0f) {
- parHeight = 1 << 30;
- parWidth = (int) (format.pixelWidthHeightRatio * parHeight);
- } else if (format.pixelWidthHeightRatio > 1.0f) {
- parWidth = 1 << 30;
- parHeight = (int) (parWidth / format.pixelWidthHeightRatio);
- }
- result.setInteger(MediaFormat.KEY_PIXEL_ASPECT_RATIO_WIDTH, parWidth);
- result.setInteger(MediaFormat.KEY_PIXEL_ASPECT_RATIO_HEIGHT, parHeight);
- result.setFloat("pixel-width-height-ratio-float", format.pixelWidthHeightRatio);
- }
- if (format.drmInitData != null) {
- // The crypto mode is propagated along with sample metadata. We also include it in the
- // format for convenient use from ExoPlayer.
- result.setString("crypto-mode-fourcc", format.drmInitData.schemeType);
- }
- if (format.subsampleOffsetUs != Format.OFFSET_SAMPLE_RELATIVE) {
- result.setLong("subsample-offset-us-long", format.subsampleOffsetUs);
- }
- // LACK OF SUPPORT FOR:
- // format.id;
- // format.metadata;
- // format.stereoMode;
- return result;
- }
-
- private static ByteBuffer toByteBuffer(long[] longArray) {
- ByteBuffer byteBuffer = ByteBuffer.allocateDirect(longArray.length * Long.BYTES);
- for (long element : longArray) {
- byteBuffer.putLong(element);
- }
- byteBuffer.flip();
- return byteBuffer;
- }
-
- private static ByteBuffer toByteBuffer(int[] intArray) {
- ByteBuffer byteBuffer = ByteBuffer.allocateDirect(intArray.length * Integer.BYTES);
- for (int element : intArray) {
- byteBuffer.putInt(element);
- }
- byteBuffer.flip();
- return byteBuffer;
- }
-
- private static String toTypeString(int type) {
- switch (type) {
- case C.TRACK_TYPE_VIDEO:
- return "video";
- case C.TRACK_TYPE_AUDIO:
- return "audio";
- case C.TRACK_TYPE_TEXT:
- return "text";
- case C.TRACK_TYPE_METADATA:
- return "metadata";
- default:
- return "unknown";
- }
- }
-
- private static void setPcmEncoding(Format format, MediaFormat result) {
- int exoPcmEncoding = format.pcmEncoding;
- setOptionalMediaFormatInt(result, "exo-pcm-encoding", format.pcmEncoding);
- int mediaFormatPcmEncoding;
- switch (exoPcmEncoding) {
- case C.ENCODING_PCM_8BIT:
- mediaFormatPcmEncoding = AudioFormat.ENCODING_PCM_8BIT;
- break;
- case C.ENCODING_PCM_16BIT:
- mediaFormatPcmEncoding = AudioFormat.ENCODING_PCM_16BIT;
- break;
- case C.ENCODING_PCM_FLOAT:
- mediaFormatPcmEncoding = AudioFormat.ENCODING_PCM_FLOAT;
- break;
- default:
- // No matching value. Do nothing.
- return;
- }
- result.setInteger(MediaFormat.KEY_PCM_ENCODING, mediaFormatPcmEncoding);
- }
-
- private static void setOptionalMediaFormatInt(MediaFormat mediaFormat, String key, int value) {
- if (value != Format.NO_VALUE) {
- mediaFormat.setInteger(key, value);
- }
- }
-
- private static void setOptionalMediaFormatString(
- MediaFormat mediaFormat, String key, @Nullable String value) {
- if (value != null) {
- mediaFormat.setString(key, value);
- }
- }
-
- private DrmInitData toFrameworkDrmInitData(
- com.google.android.exoplayer2.drm.DrmInitData exoDrmInitData) {
- try {
- return exoDrmInitData != null && mSchemeInitDataConstructor != null
- ? new MediaParserDrmInitData(exoDrmInitData)
- : null;
- } catch (Throwable e) {
- if (!mLoggedSchemeInitDataCreationException) {
- mLoggedSchemeInitDataCreationException = true;
- Log.e(TAG, "Unable to create SchemeInitData instance.");
- }
- return null;
- }
- }
-
- /** Returns a new {@link SeekPoint} equivalent to the given {@code exoPlayerSeekPoint}. */
- private static SeekPoint toSeekPoint(
- com.google.android.exoplayer2.extractor.SeekPoint exoPlayerSeekPoint) {
- return new SeekPoint(exoPlayerSeekPoint.timeUs, exoPlayerSeekPoint.position);
- }
-
- /**
- * Introduces random error to the given metric value in order to prevent the identification of
- * the parsed media.
- */
- private static long addDither(long value) {
- // Generate a random in [0, 1].
- double randomDither = ThreadLocalRandom.current().nextFloat();
- // Clamp the random number to [0, 2 * MEDIAMETRICS_DITHER].
- randomDither *= 2 * MEDIAMETRICS_DITHER;
- // Translate the random number to [1 - MEDIAMETRICS_DITHER, 1 + MEDIAMETRICS_DITHER].
- randomDither += 1 - MEDIAMETRICS_DITHER;
- return value != -1 ? (long) (value * randomDither) : -1;
- }
-
- private static void assertValidNames(@NonNull String[] names) {
- for (String name : names) {
- if (!EXTRACTOR_FACTORIES_BY_NAME.containsKey(name)) {
- throw new IllegalArgumentException(
- "Invalid extractor name: "
- + name
- + ". Supported parsers are: "
- + TextUtils.join(", ", EXTRACTOR_FACTORIES_BY_NAME.keySet())
- + ".");
- }
- }
- }
-
- private int getMediaParserFlags(int flags) {
- @SampleFlags int result = 0;
- result |= (flags & C.BUFFER_FLAG_ENCRYPTED) != 0 ? SAMPLE_FLAG_ENCRYPTED : 0;
- result |= (flags & C.BUFFER_FLAG_KEY_FRAME) != 0 ? SAMPLE_FLAG_KEY_FRAME : 0;
- result |= (flags & C.BUFFER_FLAG_DECODE_ONLY) != 0 ? SAMPLE_FLAG_DECODE_ONLY : 0;
- result |=
- (flags & C.BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA) != 0 && mIncludeSupplementalData
- ? SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA
- : 0;
- result |= (flags & C.BUFFER_FLAG_LAST_SAMPLE) != 0 ? SAMPLE_FLAG_LAST_SAMPLE : 0;
- return result;
- }
-
- @Nullable
- private static Constructor<DrmInitData.SchemeInitData> getSchemeInitDataConstructor() {
- // TODO: Use constructor statically when available.
- Constructor<DrmInitData.SchemeInitData> constructor;
- try {
- return DrmInitData.SchemeInitData.class.getConstructor(
- UUID.class, String.class, byte[].class);
- } catch (Throwable e) {
- Log.e(TAG, "Unable to get SchemeInitData constructor.");
- return null;
- }
- }
-
- // Native methods.
-
- private native void nativeSubmitMetrics(
- String logSessionId,
- String parserName,
- boolean createdByName,
- String parserPool,
- String lastObservedExceptionName,
- long resourceByteCount,
- long durationMillis,
- String trackMimeTypes,
- String trackCodecs,
- String alteredParameters,
- int videoWidth,
- int videoHeight);
-
- // Static initialization.
-
- static {
- System.loadLibrary(JNI_LIBRARY_NAME);
-
- // Using a LinkedHashMap to keep the insertion order when iterating over the keys.
- LinkedHashMap<String, ExtractorFactory> extractorFactoriesByName = new LinkedHashMap<>();
- // Parsers are ordered to match ExoPlayer's DefaultExtractorsFactory extractor ordering,
- // which in turn aims to minimize the chances of incorrect extractor selections.
- extractorFactoriesByName.put(PARSER_NAME_MATROSKA, MatroskaExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_FMP4, FragmentedMp4Extractor::new);
- extractorFactoriesByName.put(PARSER_NAME_MP4, Mp4Extractor::new);
- extractorFactoriesByName.put(PARSER_NAME_MP3, Mp3Extractor::new);
- extractorFactoriesByName.put(PARSER_NAME_ADTS, AdtsExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_AC3, Ac3Extractor::new);
- extractorFactoriesByName.put(PARSER_NAME_TS, TsExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_FLV, FlvExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_OGG, OggExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_PS, PsExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_WAV, WavExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_AMR, AmrExtractor::new);
- extractorFactoriesByName.put(PARSER_NAME_AC4, Ac4Extractor::new);
- extractorFactoriesByName.put(PARSER_NAME_FLAC, FlacExtractor::new);
- EXTRACTOR_FACTORIES_BY_NAME = Collections.unmodifiableMap(extractorFactoriesByName);
-
- HashMap<String, Class> expectedTypeByParameterName = new HashMap<>();
- expectedTypeByParameterName.put(PARAMETER_ADTS_ENABLE_CBR_SEEKING, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_AMR_ENABLE_CBR_SEEKING, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_FLAC_DISABLE_ID3, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_MP4_IGNORE_EDIT_LISTS, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_MP4_IGNORE_TFDT_BOX, Boolean.class);
- expectedTypeByParameterName.put(
- PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_MATROSKA_DISABLE_CUES_SEEKING, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_MP3_DISABLE_ID3, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_MP3_ENABLE_CBR_SEEKING, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_MP3_ENABLE_INDEX_SEEKING, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_TS_MODE, String.class);
- expectedTypeByParameterName.put(PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_TS_IGNORE_AAC_STREAM, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_TS_IGNORE_AVC_STREAM, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_TS_DETECT_ACCESS_UNITS, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_IN_BAND_CRYPTO_INFO, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_INCLUDE_SUPPLEMENTAL_DATA, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_IGNORE_TIMESTAMP_OFFSET, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_EAGERLY_EXPOSE_TRACKTYPE, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_EXPOSE_DUMMY_SEEKMAP, Boolean.class);
- expectedTypeByParameterName.put(
- PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT, Boolean.class);
- expectedTypeByParameterName.put(
- PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS, Boolean.class);
- expectedTypeByParameterName.put(PARAMETER_EXPOSE_EMSG_TRACK, Boolean.class);
- // We do not check PARAMETER_EXPOSE_CAPTION_FORMATS here, and we do it in setParameters
- // instead. Checking that the value is a List is insufficient to catch wrong parameter
- // value types.
- int sumOfParameterNameLengths =
- expectedTypeByParameterName.keySet().stream()
- .map(String::length)
- .reduce(0, Integer::sum);
- sumOfParameterNameLengths += PARAMETER_EXPOSE_CAPTION_FORMATS.length();
- // Add space for any required separators.
- MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH =
- sumOfParameterNameLengths + expectedTypeByParameterName.size();
-
- EXPECTED_TYPE_BY_PARAMETER_NAME = Collections.unmodifiableMap(expectedTypeByParameterName);
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaSession2.java b/apex/media/framework/java/android/media/MediaSession2.java
deleted file mode 100644
index 7d07eb3..0000000
--- a/apex/media/framework/java/android/media/MediaSession2.java
+++ /dev/null
@@ -1,932 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import static android.media.MediaConstants.KEY_ALLOWED_COMMANDS;
-import static android.media.MediaConstants.KEY_CONNECTION_HINTS;
-import static android.media.MediaConstants.KEY_PACKAGE_NAME;
-import static android.media.MediaConstants.KEY_PID;
-import static android.media.MediaConstants.KEY_PLAYBACK_ACTIVE;
-import static android.media.MediaConstants.KEY_SESSION2LINK;
-import static android.media.MediaConstants.KEY_TOKEN_EXTRAS;
-import static android.media.Session2Command.Result.RESULT_ERROR_UNKNOWN_ERROR;
-import static android.media.Session2Command.Result.RESULT_INFO_SKIPPED;
-import static android.media.Session2Token.TYPE_SESSION;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.media.session.MediaSessionManager;
-import android.media.session.MediaSessionManager.RemoteUserInfo;
-import android.os.BadParcelableException;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Parcel;
-import android.os.Process;
-import android.os.ResultReceiver;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Log;
-
-import com.android.modules.utils.build.SdkLevel;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-
-/**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Allows a media app to expose its transport controls and playback information in a process to
- * other processes including the Android framework and other apps.
- */
-public class MediaSession2 implements AutoCloseable {
- static final String TAG = "MediaSession2";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- // Note: This checks the uniqueness of a session ID only in a single process.
- // When the framework becomes able to check the uniqueness, this logic should be removed.
- //@GuardedBy("MediaSession.class")
- private static final List<String> SESSION_ID_LIST = new ArrayList<>();
-
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- final Object mLock = new Object();
- //@GuardedBy("mLock")
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- final Map<Controller2Link, ControllerInfo> mConnectedControllers = new HashMap<>();
-
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- final Context mContext;
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- final Executor mCallbackExecutor;
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- final SessionCallback mCallback;
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- final Session2Link mSessionStub;
-
- private final String mSessionId;
- private final PendingIntent mSessionActivity;
- private final Session2Token mSessionToken;
- private final MediaSessionManager mMediaSessionManager;
- private final MediaCommunicationManager mCommunicationManager;
- private final Handler mResultHandler;
-
- //@GuardedBy("mLock")
- private boolean mClosed;
- //@GuardedBy("mLock")
- private boolean mPlaybackActive;
- //@GuardedBy("mLock")
- private ForegroundServiceEventCallback mForegroundServiceEventCallback;
-
- MediaSession2(@NonNull Context context, @NonNull String id, PendingIntent sessionActivity,
- @NonNull Executor callbackExecutor, @NonNull SessionCallback callback,
- @NonNull Bundle tokenExtras) {
- synchronized (MediaSession2.class) {
- if (SESSION_ID_LIST.contains(id)) {
- throw new IllegalStateException("Session ID must be unique. ID=" + id);
- }
- SESSION_ID_LIST.add(id);
- }
-
- mContext = context;
- mSessionId = id;
- mSessionActivity = sessionActivity;
- mCallbackExecutor = callbackExecutor;
- mCallback = callback;
- mSessionStub = new Session2Link(this);
- mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(),
- mSessionStub, tokenExtras);
- if (SdkLevel.isAtLeastS()) {
- mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class);
- mMediaSessionManager = null;
- } else {
- mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
- mCommunicationManager = null;
- }
- // NOTE: mResultHandler uses main looper, so this MUST NOT be blocked.
- mResultHandler = new Handler(context.getMainLooper());
- mClosed = false;
- }
-
- @Override
- public void close() {
- try {
- List<ControllerInfo> controllerInfos;
- ForegroundServiceEventCallback callback;
- synchronized (mLock) {
- if (mClosed) {
- return;
- }
- mClosed = true;
- controllerInfos = getConnectedControllers();
- mConnectedControllers.clear();
- callback = mForegroundServiceEventCallback;
- mForegroundServiceEventCallback = null;
- }
- synchronized (MediaSession2.class) {
- SESSION_ID_LIST.remove(mSessionId);
- }
- if (callback != null) {
- callback.onSessionClosed(this);
- }
- for (ControllerInfo info : controllerInfos) {
- info.notifyDisconnected();
- }
- } catch (Exception e) {
- // Should not be here.
- }
- }
-
- /**
- * Returns the session ID
- */
- @NonNull
- public String getId() {
- return mSessionId;
- }
-
- /**
- * Returns the {@link Session2Token} for creating {@link MediaController2}.
- */
- @NonNull
- public Session2Token getToken() {
- return mSessionToken;
- }
-
- /**
- * Broadcasts a session command to all the connected controllers
- * <p>
- * @param command the session command
- * @param args optional arguments
- */
- public void broadcastSessionCommand(@NonNull Session2Command command, @Nullable Bundle args) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- List<ControllerInfo> controllerInfos = getConnectedControllers();
- for (ControllerInfo controller : controllerInfos) {
- controller.sendSessionCommand(command, args, null);
- }
- }
-
- /**
- * Sends a session command to a specific controller
- * <p>
- * @param controller the controller to get the session command
- * @param command the session command
- * @param args optional arguments
- * @return a token which will be sent together in {@link SessionCallback#onCommandResult}
- * when its result is received.
- */
- @NonNull
- public Object sendSessionCommand(@NonNull ControllerInfo controller,
- @NonNull Session2Command command, @Nullable Bundle args) {
- if (controller == null) {
- throw new IllegalArgumentException("controller shouldn't be null");
- }
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- ResultReceiver resultReceiver = new ResultReceiver(mResultHandler) {
- protected void onReceiveResult(int resultCode, Bundle resultData) {
- controller.receiveCommandResult(this);
- mCallbackExecutor.execute(() -> {
- mCallback.onCommandResult(MediaSession2.this, controller, this,
- command, new Session2Command.Result(resultCode, resultData));
- });
- }
- };
- controller.sendSessionCommand(command, args, resultReceiver);
- return resultReceiver;
- }
-
- /**
- * Cancels the session command previously sent.
- *
- * @param controller the controller to get the session command
- * @param token the token which is returned from {@link #sendSessionCommand}.
- */
- public void cancelSessionCommand(@NonNull ControllerInfo controller, @NonNull Object token) {
- if (controller == null) {
- throw new IllegalArgumentException("controller shouldn't be null");
- }
- if (token == null) {
- throw new IllegalArgumentException("token shouldn't be null");
- }
- controller.cancelSessionCommand(token);
- }
-
- /**
- * Sets whether the playback is active (i.e. playing something)
- *
- * @param playbackActive {@code true} if the playback active, {@code false} otherwise.
- **/
- public void setPlaybackActive(boolean playbackActive) {
- final ForegroundServiceEventCallback serviceCallback;
- synchronized (mLock) {
- if (mPlaybackActive == playbackActive) {
- return;
- }
- mPlaybackActive = playbackActive;
- serviceCallback = mForegroundServiceEventCallback;
- }
- if (serviceCallback != null) {
- serviceCallback.onPlaybackActiveChanged(this, playbackActive);
- }
- List<ControllerInfo> controllerInfos = getConnectedControllers();
- for (ControllerInfo controller : controllerInfos) {
- controller.notifyPlaybackActiveChanged(playbackActive);
- }
- }
-
- /**
- * Returns whether the playback is active (i.e. playing something)
- *
- * @return {@code true} if the playback active, {@code false} otherwise.
- */
- public boolean isPlaybackActive() {
- synchronized (mLock) {
- return mPlaybackActive;
- }
- }
-
- /**
- * Gets the list of the connected controllers
- *
- * @return list of the connected controllers.
- */
- @NonNull
- public List<ControllerInfo> getConnectedControllers() {
- List<ControllerInfo> controllers = new ArrayList<>();
- synchronized (mLock) {
- controllers.addAll(mConnectedControllers.values());
- }
- return controllers;
- }
-
- /**
- * Returns whether the given bundle includes non-framework Parcelables.
- */
- static boolean hasCustomParcelable(@Nullable Bundle bundle) {
- if (bundle == null) {
- return false;
- }
-
- // Try writing the bundle to parcel, and read it with framework classloader.
- Parcel parcel = null;
- try {
- parcel = Parcel.obtain();
- parcel.writeBundle(bundle);
- parcel.setDataPosition(0);
- Bundle out = parcel.readBundle(null);
-
- for (String key : out.keySet()) {
- out.get(key);
- }
- } catch (BadParcelableException e) {
- Log.d(TAG, "Custom parcelable in bundle.", e);
- return true;
- } finally {
- if (parcel != null) {
- parcel.recycle();
- }
- }
- return false;
- }
-
- boolean isClosed() {
- synchronized (mLock) {
- return mClosed;
- }
- }
-
- SessionCallback getCallback() {
- return mCallback;
- }
-
- boolean isTrustedForMediaControl(RemoteUserInfo remoteUserInfo) {
- if (SdkLevel.isAtLeastS()) {
- return mCommunicationManager.isTrustedForMediaControl(remoteUserInfo);
- } else {
- return mMediaSessionManager.isTrustedForMediaControl(remoteUserInfo);
- }
- }
-
- void setForegroundServiceEventCallback(ForegroundServiceEventCallback callback) {
- synchronized (mLock) {
- if (mForegroundServiceEventCallback == callback) {
- return;
- }
- if (mForegroundServiceEventCallback != null && callback != null) {
- throw new IllegalStateException("A session cannot be added to multiple services");
- }
- mForegroundServiceEventCallback = callback;
- }
- }
-
- // Called by Session2Link.onConnect and MediaSession2Service.MediaSession2ServiceStub.connect
- void onConnect(final Controller2Link controller, int callingPid, int callingUid, int seq,
- Bundle connectionRequest) {
- if (callingPid == 0) {
- // The pid here is from Binder.getCallingPid(), which can be 0 for an oneway call from
- // the remote process. If it's the case, use PID from the connectionRequest.
- callingPid = connectionRequest.getInt(KEY_PID);
- }
- String callingPkg = connectionRequest.getString(KEY_PACKAGE_NAME);
-
- RemoteUserInfo remoteUserInfo = new RemoteUserInfo(callingPkg, callingPid, callingUid);
-
- Bundle connectionHints = connectionRequest.getBundle(KEY_CONNECTION_HINTS);
- if (connectionHints == null) {
- Log.w(TAG, "connectionHints shouldn't be null.");
- connectionHints = Bundle.EMPTY;
- } else if (hasCustomParcelable(connectionHints)) {
- Log.w(TAG, "connectionHints contain custom parcelable. Ignoring.");
- connectionHints = Bundle.EMPTY;
- }
-
- final ControllerInfo controllerInfo = new ControllerInfo(
- remoteUserInfo,
- isTrustedForMediaControl(remoteUserInfo),
- controller,
- connectionHints);
- mCallbackExecutor.execute(() -> {
- boolean connected = false;
- try {
- if (isClosed()) {
- return;
- }
- controllerInfo.mAllowedCommands =
- mCallback.onConnect(MediaSession2.this, controllerInfo);
- // Don't reject connection for the request from trusted app.
- // Otherwise server will fail to retrieve session's information to dispatch
- // media keys to.
- if (controllerInfo.mAllowedCommands == null && !controllerInfo.isTrusted()) {
- return;
- }
- if (controllerInfo.mAllowedCommands == null) {
- // For trusted apps, send non-null allowed commands to keep
- // connection.
- controllerInfo.mAllowedCommands =
- new Session2CommandGroup.Builder().build();
- }
- if (DEBUG) {
- Log.d(TAG, "Accepting connection: " + controllerInfo);
- }
- // If connection is accepted, notify the current state to the controller.
- // It's needed because we cannot call synchronous calls between
- // session/controller.
- Bundle connectionResult = new Bundle();
- connectionResult.putParcelable(KEY_SESSION2LINK, mSessionStub);
- connectionResult.putParcelable(KEY_ALLOWED_COMMANDS,
- controllerInfo.mAllowedCommands);
- connectionResult.putBoolean(KEY_PLAYBACK_ACTIVE, isPlaybackActive());
- connectionResult.putBundle(KEY_TOKEN_EXTRAS, mSessionToken.getExtras());
-
- // Double check if session is still there, because close() can be called in
- // another thread.
- if (isClosed()) {
- return;
- }
- controllerInfo.notifyConnected(connectionResult);
- synchronized (mLock) {
- if (mConnectedControllers.containsKey(controller)) {
- Log.w(TAG, "Controller " + controllerInfo + " has sent connection"
- + " request multiple times");
- }
- mConnectedControllers.put(controller, controllerInfo);
- }
- mCallback.onPostConnect(MediaSession2.this, controllerInfo);
- connected = true;
- } finally {
- if (!connected || isClosed()) {
- if (DEBUG) {
- Log.d(TAG, "Rejecting connection or notifying that session is closed"
- + ", controllerInfo=" + controllerInfo);
- }
- synchronized (mLock) {
- mConnectedControllers.remove(controller);
- }
- controllerInfo.notifyDisconnected();
- }
- }
- });
- }
-
- // Called by Session2Link.onDisconnect
- void onDisconnect(@NonNull final Controller2Link controller, int seq) {
- final ControllerInfo controllerInfo;
- synchronized (mLock) {
- controllerInfo = mConnectedControllers.remove(controller);
- }
- if (controllerInfo == null) {
- return;
- }
- mCallbackExecutor.execute(() -> {
- mCallback.onDisconnected(MediaSession2.this, controllerInfo);
- });
- }
-
- // Called by Session2Link.onSessionCommand
- void onSessionCommand(@NonNull final Controller2Link controller, final int seq,
- final Session2Command command, final Bundle args,
- @Nullable ResultReceiver resultReceiver) {
- if (controller == null) {
- return;
- }
- final ControllerInfo controllerInfo;
- synchronized (mLock) {
- controllerInfo = mConnectedControllers.get(controller);
- }
- if (controllerInfo == null) {
- return;
- }
-
- // TODO: check allowed commands.
- synchronized (mLock) {
- controllerInfo.addRequestedCommandSeqNumber(seq);
- }
- mCallbackExecutor.execute(() -> {
- if (!controllerInfo.removeRequestedCommandSeqNumber(seq)) {
- if (resultReceiver != null) {
- resultReceiver.send(RESULT_INFO_SKIPPED, null);
- }
- return;
- }
- Session2Command.Result result = mCallback.onSessionCommand(
- MediaSession2.this, controllerInfo, command, args);
- if (resultReceiver != null) {
- if (result == null) {
- resultReceiver.send(RESULT_INFO_SKIPPED, null);
- } else {
- resultReceiver.send(result.getResultCode(), result.getResultData());
- }
- }
- });
- }
-
- // Called by Session2Link.onCancelCommand
- void onCancelCommand(@NonNull final Controller2Link controller, final int seq) {
- final ControllerInfo controllerInfo;
- synchronized (mLock) {
- controllerInfo = mConnectedControllers.get(controller);
- }
- if (controllerInfo == null) {
- return;
- }
- controllerInfo.removeRequestedCommandSeqNumber(seq);
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Builder for {@link MediaSession2}.
- * <p>
- * Any incoming event from the {@link MediaController2} will be handled on the callback
- * executor. If it's not set, {@link Context#getMainExecutor()} will be used by default.
- */
- public static final class Builder {
- private Context mContext;
- private String mId;
- private PendingIntent mSessionActivity;
- private Executor mCallbackExecutor;
- private SessionCallback mCallback;
- private Bundle mExtras;
-
- /**
- * Creates a builder for {@link MediaSession2}.
- *
- * @param context Context
- * @throws IllegalArgumentException if context is {@code null}.
- */
- public Builder(@NonNull Context context) {
- if (context == null) {
- throw new IllegalArgumentException("context shouldn't be null");
- }
- mContext = context;
- }
-
- /**
- * Set an intent for launching UI for this Session. This can be used as a
- * quick link to an ongoing media screen. The intent should be for an
- * activity that may be started using {@link Context#startActivity(Intent)}.
- *
- * @param pi The intent to launch to show UI for this session.
- * @return The Builder to allow chaining
- */
- @NonNull
- public Builder setSessionActivity(@Nullable PendingIntent pi) {
- mSessionActivity = pi;
- return this;
- }
-
- /**
- * Set ID of the session. If it's not set, an empty string will be used to create a session.
- * <p>
- * Use this if and only if your app supports multiple playback at the same time and also
- * wants to provide external apps to have finer controls of them.
- *
- * @param id id of the session. Must be unique per package.
- * @throws IllegalArgumentException if id is {@code null}.
- * @return The Builder to allow chaining
- */
- @NonNull
- public Builder setId(@NonNull String id) {
- if (id == null) {
- throw new IllegalArgumentException("id shouldn't be null");
- }
- mId = id;
- return this;
- }
-
- /**
- * Set callback for the session and its executor.
- *
- * @param executor callback executor
- * @param callback session callback.
- * @return The Builder to allow chaining
- */
- @NonNull
- public Builder setSessionCallback(@NonNull Executor executor,
- @NonNull SessionCallback callback) {
- mCallbackExecutor = executor;
- mCallback = callback;
- return this;
- }
-
- /**
- * Set extras for the session token. If null or not set, {@link Session2Token#getExtras()}
- * will return an empty {@link Bundle}. An {@link IllegalArgumentException} will be thrown
- * if the bundle contains any non-framework Parcelable objects.
- *
- * @return The Builder to allow chaining
- * @see Session2Token#getExtras()
- */
- @NonNull
- public Builder setExtras(@NonNull Bundle extras) {
- if (extras == null) {
- throw new NullPointerException("extras shouldn't be null");
- }
- if (hasCustomParcelable(extras)) {
- throw new IllegalArgumentException(
- "extras shouldn't contain any custom parcelables");
- }
- mExtras = new Bundle(extras);
- return this;
- }
-
- /**
- * Build {@link MediaSession2}.
- *
- * @return a new session
- * @throws IllegalStateException if the session with the same id is already exists for the
- * package.
- */
- @NonNull
- public MediaSession2 build() {
- if (mCallbackExecutor == null) {
- mCallbackExecutor = mContext.getMainExecutor();
- }
- if (mCallback == null) {
- mCallback = new SessionCallback() {};
- }
- if (mId == null) {
- mId = "";
- }
- if (mExtras == null) {
- mExtras = Bundle.EMPTY;
- }
- MediaSession2 session2 = new MediaSession2(mContext, mId, mSessionActivity,
- mCallbackExecutor, mCallback, mExtras);
-
- // Notify framework about the newly create session after the constructor is finished.
- // Otherwise, framework may access the session before the initialization is finished.
- try {
- if (SdkLevel.isAtLeastS()) {
- MediaCommunicationManager manager =
- mContext.getSystemService(MediaCommunicationManager.class);
- manager.notifySession2Created(session2.getToken());
- } else {
- MediaSessionManager manager =
- mContext.getSystemService(MediaSessionManager.class);
- manager.notifySession2Created(session2.getToken());
- }
- } catch (Exception e) {
- session2.close();
- throw e;
- }
-
- return session2;
- }
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Information of a controller.
- */
- public static final class ControllerInfo {
- private final RemoteUserInfo mRemoteUserInfo;
- private final boolean mIsTrusted;
- private final Controller2Link mControllerBinder;
- private final Bundle mConnectionHints;
- private final Object mLock = new Object();
- //@GuardedBy("mLock")
- private int mNextSeqNumber;
- //@GuardedBy("mLock")
- private ArrayMap<ResultReceiver, Integer> mPendingCommands;
- //@GuardedBy("mLock")
- private ArraySet<Integer> mRequestedCommandSeqNumbers;
-
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- Session2CommandGroup mAllowedCommands;
-
- /**
- * @param remoteUserInfo remote user info
- * @param trusted {@code true} if trusted, {@code false} otherwise
- * @param controllerBinder Controller2Link for the connected controller.
- * @param connectionHints a session-specific argument sent from the controller for the
- * connection. The contents of this bundle may affect the
- * connection result.
- */
- ControllerInfo(@NonNull RemoteUserInfo remoteUserInfo, boolean trusted,
- @Nullable Controller2Link controllerBinder, @NonNull Bundle connectionHints) {
- mRemoteUserInfo = remoteUserInfo;
- mIsTrusted = trusted;
- mControllerBinder = controllerBinder;
- mConnectionHints = connectionHints;
- mPendingCommands = new ArrayMap<>();
- mRequestedCommandSeqNumbers = new ArraySet<>();
- }
-
- /**
- * @return remote user info of the controller.
- */
- @NonNull
- public RemoteUserInfo getRemoteUserInfo() {
- return mRemoteUserInfo;
- }
-
- /**
- * @return package name of the controller.
- */
- @NonNull
- public String getPackageName() {
- return mRemoteUserInfo.getPackageName();
- }
-
- /**
- * @return uid of the controller. Can be a negative value if the uid cannot be obtained.
- */
- public int getUid() {
- return mRemoteUserInfo.getUid();
- }
-
- /**
- * @return connection hints sent from controller.
- */
- @NonNull
- public Bundle getConnectionHints() {
- return new Bundle(mConnectionHints);
- }
-
- /**
- * Return if the controller has granted {@code android.permission.MEDIA_CONTENT_CONTROL} or
- * has a enabled notification listener so can be trusted to accept connection and incoming
- * command request.
- *
- * @return {@code true} if the controller is trusted.
- * @hide
- */
- public boolean isTrusted() {
- return mIsTrusted;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mControllerBinder, mRemoteUserInfo);
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (!(obj instanceof ControllerInfo)) return false;
- if (this == obj) return true;
-
- ControllerInfo other = (ControllerInfo) obj;
- if (mControllerBinder != null || other.mControllerBinder != null) {
- return Objects.equals(mControllerBinder, other.mControllerBinder);
- }
- return mRemoteUserInfo.equals(other.mRemoteUserInfo);
- }
-
- @Override
- @NonNull
- public String toString() {
- return "ControllerInfo {pkg=" + mRemoteUserInfo.getPackageName() + ", uid="
- + mRemoteUserInfo.getUid() + ", allowedCommands=" + mAllowedCommands + "})";
- }
-
- void notifyConnected(Bundle connectionResult) {
- if (mControllerBinder == null) return;
-
- try {
- mControllerBinder.notifyConnected(getNextSeqNumber(), connectionResult);
- } catch (RuntimeException e) {
- // Controller may be died prematurely.
- }
- }
-
- void notifyDisconnected() {
- if (mControllerBinder == null) return;
-
- try {
- mControllerBinder.notifyDisconnected(getNextSeqNumber());
- } catch (RuntimeException e) {
- // Controller may be died prematurely.
- }
- }
-
- void notifyPlaybackActiveChanged(boolean playbackActive) {
- if (mControllerBinder == null) return;
-
- try {
- mControllerBinder.notifyPlaybackActiveChanged(getNextSeqNumber(), playbackActive);
- } catch (RuntimeException e) {
- // Controller may be died prematurely.
- }
- }
-
- void sendSessionCommand(Session2Command command, Bundle args,
- ResultReceiver resultReceiver) {
- if (mControllerBinder == null) return;
-
- try {
- int seq = getNextSeqNumber();
- synchronized (mLock) {
- mPendingCommands.put(resultReceiver, seq);
- }
- mControllerBinder.sendSessionCommand(seq, command, args, resultReceiver);
- } catch (RuntimeException e) {
- // Controller may be died prematurely.
- synchronized (mLock) {
- mPendingCommands.remove(resultReceiver);
- }
- resultReceiver.send(RESULT_ERROR_UNKNOWN_ERROR, null);
- }
- }
-
- void cancelSessionCommand(@NonNull Object token) {
- if (mControllerBinder == null) return;
- Integer seq;
- synchronized (mLock) {
- seq = mPendingCommands.remove(token);
- }
- if (seq != null) {
- mControllerBinder.cancelSessionCommand(seq);
- }
- }
-
- void receiveCommandResult(ResultReceiver resultReceiver) {
- synchronized (mLock) {
- mPendingCommands.remove(resultReceiver);
- }
- }
-
- void addRequestedCommandSeqNumber(int seq) {
- synchronized (mLock) {
- mRequestedCommandSeqNumbers.add(seq);
- }
- }
-
- boolean removeRequestedCommandSeqNumber(int seq) {
- synchronized (mLock) {
- return mRequestedCommandSeqNumbers.remove(seq);
- }
- }
-
- private int getNextSeqNumber() {
- synchronized (mLock) {
- return mNextSeqNumber++;
- }
- }
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Callback to be called for all incoming commands from {@link MediaController2}s.
- */
- public abstract static class SessionCallback {
- /**
- * Called when a controller is created for this session. Return allowed commands for
- * controller. By default it returns {@code null}.
- * <p>
- * You can reject the connection by returning {@code null}. In that case, controller
- * receives {@link MediaController2.ControllerCallback#onDisconnected(MediaController2)}
- * and cannot be used.
- * <p>
- * The controller hasn't connected yet in this method, so calls to the controller
- * (e.g. {@link #sendSessionCommand}) would be ignored. Override {@link #onPostConnect} for
- * the custom initialization for the controller instead.
- *
- * @param session the session for this event
- * @param controller controller information.
- * @return allowed commands. Can be {@code null} to reject connection.
- */
- @Nullable
- public Session2CommandGroup onConnect(@NonNull MediaSession2 session,
- @NonNull ControllerInfo controller) {
- return null;
- }
-
- /**
- * Called immediately after a controller is connected. This is a convenient method to add
- * custom initialization between the session and a controller.
- * <p>
- * Note that calls to the controller (e.g. {@link #sendSessionCommand}) work here but don't
- * work in {@link #onConnect} because the controller hasn't connected yet in
- * {@link #onConnect}.
- *
- * @param session the session for this event
- * @param controller controller information.
- */
- public void onPostConnect(@NonNull MediaSession2 session,
- @NonNull ControllerInfo controller) {
- }
-
- /**
- * Called when a controller is disconnected
- *
- * @param session the session for this event
- * @param controller controller information
- */
- public void onDisconnected(@NonNull MediaSession2 session,
- @NonNull ControllerInfo controller) {}
-
- /**
- * Called when a controller sent a session command.
- *
- * @param session the session for this event
- * @param controller controller information
- * @param command the session command
- * @param args optional arguments
- * @return the result for the session command. If {@code null}, RESULT_INFO_SKIPPED
- * will be sent to the session.
- */
- @Nullable
- public Session2Command.Result onSessionCommand(@NonNull MediaSession2 session,
- @NonNull ControllerInfo controller, @NonNull Session2Command command,
- @Nullable Bundle args) {
- return null;
- }
-
- /**
- * Called when the command sent to the controller is finished.
- *
- * @param session the session for this event
- * @param controller controller information
- * @param token the token got from {@link MediaSession2#sendSessionCommand}
- * @param command the session command
- * @param result the result of the session command
- */
- public void onCommandResult(@NonNull MediaSession2 session,
- @NonNull ControllerInfo controller, @NonNull Object token,
- @NonNull Session2Command command, @NonNull Session2Command.Result result) {}
- }
-
- abstract static class ForegroundServiceEventCallback {
- public void onPlaybackActiveChanged(MediaSession2 session, boolean playbackActive) {}
- public void onSessionClosed(MediaSession2 session) {}
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaSession2Service.java b/apex/media/framework/java/android/media/MediaSession2Service.java
deleted file mode 100644
index 9f80c43..0000000
--- a/apex/media/framework/java/android/media/MediaSession2Service.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import static android.media.MediaConstants.KEY_CONNECTION_HINTS;
-import static android.media.MediaConstants.KEY_PACKAGE_NAME;
-import static android.media.MediaConstants.KEY_PID;
-
-import android.annotation.CallSuper;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.media.MediaSession2.ControllerInfo;
-import android.media.session.MediaSessionManager;
-import android.media.session.MediaSessionManager.RemoteUserInfo;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Service containing {@link MediaSession2}.
- */
-public abstract class MediaSession2Service extends Service {
- /**
- * The {@link Intent} that must be declared as handled by the service.
- */
- public static final String SERVICE_INTERFACE = "android.media.MediaSession2Service";
-
- private static final String TAG = "MediaSession2Service";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final MediaSession2.ForegroundServiceEventCallback mForegroundServiceEventCallback =
- new MediaSession2.ForegroundServiceEventCallback() {
- @Override
- public void onPlaybackActiveChanged(MediaSession2 session, boolean playbackActive) {
- MediaSession2Service.this.onPlaybackActiveChanged(session, playbackActive);
- }
-
- @Override
- public void onSessionClosed(MediaSession2 session) {
- removeSession(session);
- }
- };
-
- private final Object mLock = new Object();
- //@GuardedBy("mLock")
- private NotificationManager mNotificationManager;
- //@GuardedBy("mLock")
- private MediaSessionManager mMediaSessionManager;
- //@GuardedBy("mLock")
- private Intent mStartSelfIntent;
- //@GuardedBy("mLock")
- private Map<String, MediaSession2> mSessions = new ArrayMap<>();
- //@GuardedBy("mLock")
- private Map<MediaSession2, MediaNotification> mNotifications = new ArrayMap<>();
- //@GuardedBy("mLock")
- private MediaSession2ServiceStub mStub;
-
- /**
- * Called by the system when the service is first created. Do not call this method directly.
- * <p>
- * Override this method if you need your own initialization. Derived classes MUST call through
- * to the super class's implementation of this method.
- */
- @CallSuper
- @Override
- public void onCreate() {
- super.onCreate();
- synchronized (mLock) {
- mStub = new MediaSession2ServiceStub(this);
- mStartSelfIntent = new Intent(this, this.getClass());
- mNotificationManager =
- (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- mMediaSessionManager =
- (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
- }
- }
-
- @CallSuper
- @Override
- @Nullable
- public IBinder onBind(@NonNull Intent intent) {
- if (SERVICE_INTERFACE.equals(intent.getAction())) {
- synchronized (mLock) {
- return mStub;
- }
- }
- return null;
- }
-
- /**
- * Called by the system to notify that it is no longer used and is being removed. Do not call
- * this method directly.
- * <p>
- * Override this method if you need your own clean up. Derived classes MUST call through
- * to the super class's implementation of this method.
- */
- @CallSuper
- @Override
- public void onDestroy() {
- super.onDestroy();
- synchronized (mLock) {
- List<MediaSession2> sessions = getSessions();
- for (MediaSession2 session : sessions) {
- removeSession(session);
- }
- mSessions.clear();
- mNotifications.clear();
- }
- mStub.close();
- }
-
- /**
- * Called when a {@link MediaController2} is created with the this service's
- * {@link Session2Token}. Return the session for telling the controller which session to
- * connect. Return {@code null} to reject the connection from this controller.
- * <p>
- * Session returned here will be added to this service automatically. You don't need to call
- * {@link #addSession(MediaSession2)} for that.
- * <p>
- * This method is always called on the main thread.
- *
- * @param controllerInfo information of the controller which is trying to connect.
- * @return a {@link MediaSession2} instance for the controller to connect to, or {@code null}
- * to reject connection
- * @see MediaSession2.Builder
- * @see #getSessions()
- */
- @Nullable
- public abstract MediaSession2 onGetSession(@NonNull ControllerInfo controllerInfo);
-
- /**
- * Called to update the media notification when the playback state changes.
- * <p>
- * If playback is active and a notification is returned, the service uses it to become a
- * foreground service. If playback is not active then the notification is still posted, but the
- * service does not become a foreground service.
- * <p>
- * Apps must request the {@link android.Manifest.permission#FOREGROUND_SERVICE} permission
- * in order to use this API. For apps targeting {@link android.os.Build.VERSION_CODES#TIRAMISU}
- * or later, notifications will only be posted if the app has also been granted the
- * {@link android.Manifest.permission#POST_NOTIFICATIONS} permission.
- *
- * @param session the session for which an updated media notification is required.
- * @return the {@link MediaNotification}. Can be {@code null}.
- */
- @Nullable
- public abstract MediaNotification onUpdateNotification(@NonNull MediaSession2 session);
-
- /**
- * Adds a session to this service.
- * <p>
- * Added session will be removed automatically when it's closed, or removed when
- * {@link #removeSession} is called.
- *
- * @param session a session to be added.
- * @see #removeSession(MediaSession2)
- */
- public final void addSession(@NonNull MediaSession2 session) {
- if (session == null) {
- throw new IllegalArgumentException("session shouldn't be null");
- }
- if (session.isClosed()) {
- throw new IllegalArgumentException("session is already closed");
- }
- synchronized (mLock) {
- MediaSession2 previousSession = mSessions.get(session.getId());
- if (previousSession != null) {
- if (previousSession != session) {
- Log.w(TAG, "Session ID should be unique, ID=" + session.getId()
- + ", previous=" + previousSession + ", session=" + session);
- }
- return;
- }
- mSessions.put(session.getId(), session);
- session.setForegroundServiceEventCallback(mForegroundServiceEventCallback);
- }
- }
-
- /**
- * Removes a session from this service.
- *
- * @param session a session to be removed.
- * @see #addSession(MediaSession2)
- */
- public final void removeSession(@NonNull MediaSession2 session) {
- if (session == null) {
- throw new IllegalArgumentException("session shouldn't be null");
- }
- MediaNotification notification;
- synchronized (mLock) {
- if (mSessions.get(session.getId()) != session) {
- // Session isn't added or removed already.
- return;
- }
- mSessions.remove(session.getId());
- notification = mNotifications.remove(session);
- }
- session.setForegroundServiceEventCallback(null);
- if (notification != null) {
- mNotificationManager.cancel(notification.getNotificationId());
- }
- if (getSessions().isEmpty()) {
- stopForeground(false);
- }
- }
-
- /**
- * Gets the list of {@link MediaSession2}s that you've added to this service.
- *
- * @return sessions
- */
- public final @NonNull List<MediaSession2> getSessions() {
- List<MediaSession2> list = new ArrayList<>();
- synchronized (mLock) {
- list.addAll(mSessions.values());
- }
- return list;
- }
-
- /**
- * Returns the {@link MediaSessionManager}.
- */
- @NonNull
- MediaSessionManager getMediaSessionManager() {
- synchronized (mLock) {
- return mMediaSessionManager;
- }
- }
-
- /**
- * Called by registered {@link MediaSession2.ForegroundServiceEventCallback}
- *
- * @param session session with change
- * @param playbackActive {@code true} if playback is active.
- */
- void onPlaybackActiveChanged(MediaSession2 session, boolean playbackActive) {
- MediaNotification mediaNotification = onUpdateNotification(session);
- if (mediaNotification == null) {
- // The service implementation doesn't want to use the automatic start/stopForeground
- // feature.
- return;
- }
- synchronized (mLock) {
- mNotifications.put(session, mediaNotification);
- }
- int id = mediaNotification.getNotificationId();
- Notification notification = mediaNotification.getNotification();
- if (!playbackActive) {
- mNotificationManager.notify(id, notification);
- return;
- }
- // playbackActive == true
- startForegroundService(mStartSelfIntent);
- startForeground(id, notification);
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Returned by {@link #onUpdateNotification(MediaSession2)} for making session service
- * foreground service to keep playback running in the background. It's highly recommended to
- * show media style notification here.
- */
- public static class MediaNotification {
- private final int mNotificationId;
- private final Notification mNotification;
-
- /**
- * Default constructor
- *
- * @param notificationId notification id to be used for
- * {@link NotificationManager#notify(int, Notification)}.
- * @param notification a notification to make session service run in the foreground. Media
- * style notification is recommended here.
- */
- public MediaNotification(int notificationId, @NonNull Notification notification) {
- if (notification == null) {
- throw new IllegalArgumentException("notification shouldn't be null");
- }
- mNotificationId = notificationId;
- mNotification = notification;
- }
-
- /**
- * Gets the id of the notification.
- *
- * @return the notification id
- */
- public int getNotificationId() {
- return mNotificationId;
- }
-
- /**
- * Gets the notification.
- *
- * @return the notification
- */
- @NonNull
- public Notification getNotification() {
- return mNotification;
- }
- }
-
- private static final class MediaSession2ServiceStub extends IMediaSession2Service.Stub
- implements AutoCloseable {
- final WeakReference<MediaSession2Service> mService;
- final Handler mHandler;
-
- MediaSession2ServiceStub(MediaSession2Service service) {
- mService = new WeakReference<>(service);
- mHandler = new Handler(service.getMainLooper());
- }
-
- @Override
- public void connect(Controller2Link caller, int seq, Bundle connectionRequest) {
- if (mService.get() == null) {
- if (DEBUG) {
- Log.d(TAG, "Service is already destroyed");
- }
- return;
- }
- if (caller == null || connectionRequest == null) {
- if (DEBUG) {
- Log.d(TAG, "Ignoring calls with illegal arguments, caller=" + caller
- + ", connectionRequest=" + connectionRequest);
- }
- return;
- }
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- mHandler.post(() -> {
- boolean shouldNotifyDisconnected = true;
- try {
- final MediaSession2Service service = mService.get();
- if (service == null) {
- if (DEBUG) {
- Log.d(TAG, "Service isn't available");
- }
- return;
- }
-
- String callingPkg = connectionRequest.getString(KEY_PACKAGE_NAME);
- // The Binder.getCallingPid() can be 0 for an oneway call from the
- // remote process. If it's the case, use PID from the connectionRequest.
- RemoteUserInfo remoteUserInfo = new RemoteUserInfo(
- callingPkg,
- pid == 0 ? connectionRequest.getInt(KEY_PID) : pid,
- uid);
-
- Bundle connectionHints = connectionRequest.getBundle(KEY_CONNECTION_HINTS);
- if (connectionHints == null) {
- Log.w(TAG, "connectionHints shouldn't be null.");
- connectionHints = Bundle.EMPTY;
- } else if (MediaSession2.hasCustomParcelable(connectionHints)) {
- Log.w(TAG, "connectionHints contain custom parcelable. Ignoring.");
- connectionHints = Bundle.EMPTY;
- }
-
- final ControllerInfo controllerInfo = new ControllerInfo(
- remoteUserInfo,
- service.getMediaSessionManager()
- .isTrustedForMediaControl(remoteUserInfo),
- caller,
- connectionHints);
-
- if (DEBUG) {
- Log.d(TAG, "Handling incoming connection request from the"
- + " controller=" + controllerInfo);
- }
-
- final MediaSession2 session;
- session = service.onGetSession(controllerInfo);
-
- if (session == null) {
- if (DEBUG) {
- Log.d(TAG, "Rejecting incoming connection request from the"
- + " controller=" + controllerInfo);
- }
- // Note: Trusted controllers also can be rejected according to the
- // service implementation.
- return;
- }
- service.addSession(session);
- shouldNotifyDisconnected = false;
- session.onConnect(caller, pid, uid, seq, connectionRequest);
- } catch (Exception e) {
- // Don't propagate exception in service to the controller.
- Log.w(TAG, "Failed to add a session to session service", e);
- } finally {
- // Trick to call onDisconnected() in one place.
- if (shouldNotifyDisconnected) {
- if (DEBUG) {
- Log.d(TAG, "Notifying the controller of its disconnection");
- }
- try {
- caller.notifyDisconnected(0);
- } catch (RuntimeException e) {
- // Controller may be died prematurely.
- // Not an issue because we'll ignore it anyway.
- }
- }
- }
- });
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void close() {
- mHandler.removeCallbacksAndMessages(null);
- mService.clear();
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/MediaTranscodingManager.java b/apex/media/framework/java/android/media/MediaTranscodingManager.java
deleted file mode 100644
index aff3204..0000000
--- a/apex/media/framework/java/android/media/MediaTranscodingManager.java
+++ /dev/null
@@ -1,1749 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.CallbackExecutor;
-import android.annotation.IntDef;
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.AssetFileDescriptor;
-import android.net.Uri;
-import android.os.Build;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.os.ServiceSpecificException;
-import android.system.Os;
-import android.util.Log;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.modules.annotation.MinSdk;
-import com.android.modules.utils.build.SdkLevel;
-
-import java.io.FileNotFoundException;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- Android 12 introduces Compatible media transcoding feature. See
- <a href="https://developer.android.com/about/versions/12/features#compatible_media_transcoding">
- Compatible media transcoding</a>. MediaTranscodingManager provides an interface to the system's media
- transcoding service and can be used to transcode media files, e.g. transcoding a video from HEVC to
- AVC.
-
- <h3>Transcoding Types</h3>
- <h4>Video Transcoding</h4>
- When transcoding a video file, the video track will be transcoded based on the desired track format
- and the audio track will be pass through without any modification.
- <p class=note>
- Note that currently only support transcoding video file in mp4 format and with single video track.
-
- <h3>Transcoding Request</h3>
- <p>
- To transcode a media file, first create a {@link TranscodingRequest} through its builder class
- {@link VideoTranscodingRequest.Builder}. Transcode requests are then enqueue to the manager through
- {@link MediaTranscodingManager#enqueueRequest(
- TranscodingRequest, Executor, OnTranscodingFinishedListener)}
- TranscodeRequest are processed based on client process's priority and request priority. When a
- transcode operation is completed the caller is notified via its
- {@link OnTranscodingFinishedListener}.
- In the meantime the caller may use the returned TranscodingSession object to cancel or check the
- status of a specific transcode operation.
- <p>
- Here is an example where <code>Builder</code> is used to specify all parameters
-
- <pre class=prettyprint>
- VideoTranscodingRequest request =
- new VideoTranscodingRequest.Builder(srcUri, dstUri, videoFormat).build();
- }</pre>
- @hide
- */
-@MinSdk(Build.VERSION_CODES.S)
-@RequiresApi(Build.VERSION_CODES.S)
-@SystemApi
-public final class MediaTranscodingManager {
- private static final String TAG = "MediaTranscodingManager";
-
- /** Maximum number of retry to connect to the service. */
- private static final int CONNECT_SERVICE_RETRY_COUNT = 100;
-
- /** Interval between trying to reconnect to the service. */
- private static final int INTERVAL_CONNECT_SERVICE_RETRY_MS = 40;
-
- /** Default bpp(bits-per-pixel) to use for calculating default bitrate. */
- private static final float BPP = 0.25f;
-
- /**
- * Listener that gets notified when a transcoding operation has finished.
- * This listener gets notified regardless of how the operation finished. It is up to the
- * listener implementation to check the result and take appropriate action.
- */
- @FunctionalInterface
- public interface OnTranscodingFinishedListener {
- /**
- * Called when the transcoding operation has finished. The receiver may use the
- * TranscodingSession to check the result, i.e. whether the operation succeeded, was
- * canceled or if an error occurred.
- *
- * @param session The TranscodingSession instance for the finished transcoding operation.
- */
- void onTranscodingFinished(@NonNull TranscodingSession session);
- }
-
- private final Context mContext;
- private ContentResolver mContentResolver;
- private final String mPackageName;
- private final int mPid;
- private final int mUid;
- private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
- private final HashMap<Integer, TranscodingSession> mPendingTranscodingSessions = new HashMap();
- private final Object mLock = new Object();
- @GuardedBy("mLock")
- @NonNull private ITranscodingClient mTranscodingClient = null;
- private static MediaTranscodingManager sMediaTranscodingManager;
-
- private void handleTranscodingFinished(int sessionId, TranscodingResultParcel result) {
- synchronized (mPendingTranscodingSessions) {
- // Gets the session associated with the sessionId and removes it from
- // mPendingTranscodingSessions.
- final TranscodingSession session = mPendingTranscodingSessions.remove(sessionId);
-
- if (session == null) {
- // This should not happen in reality.
- Log.e(TAG, "Session " + sessionId + " is not in Pendingsessions");
- return;
- }
-
- // Updates the session status and result.
- session.updateStatusAndResult(TranscodingSession.STATUS_FINISHED,
- TranscodingSession.RESULT_SUCCESS,
- TranscodingSession.ERROR_NONE);
-
- // Notifies client the session is done.
- if (session.mListener != null && session.mListenerExecutor != null) {
- session.mListenerExecutor.execute(
- () -> session.mListener.onTranscodingFinished(session));
- }
- }
- }
-
- private void handleTranscodingFailed(int sessionId, int errorCode) {
- synchronized (mPendingTranscodingSessions) {
- // Gets the session associated with the sessionId and removes it from
- // mPendingTranscodingSessions.
- final TranscodingSession session = mPendingTranscodingSessions.remove(sessionId);
-
- if (session == null) {
- // This should not happen in reality.
- Log.e(TAG, "Session " + sessionId + " is not in Pendingsessions");
- return;
- }
-
- // Updates the session status and result.
- session.updateStatusAndResult(TranscodingSession.STATUS_FINISHED,
- TranscodingSession.RESULT_ERROR, errorCode);
-
- // Notifies client the session failed.
- if (session.mListener != null && session.mListenerExecutor != null) {
- session.mListenerExecutor.execute(
- () -> session.mListener.onTranscodingFinished(session));
- }
- }
- }
-
- private void handleTranscodingProgressUpdate(int sessionId, int newProgress) {
- synchronized (mPendingTranscodingSessions) {
- // Gets the session associated with the sessionId.
- final TranscodingSession session = mPendingTranscodingSessions.get(sessionId);
-
- if (session == null) {
- // This should not happen in reality.
- Log.e(TAG, "Session " + sessionId + " is not in Pendingsessions");
- return;
- }
-
- // Updates the session progress.
- session.updateProgress(newProgress);
-
- // Notifies client the progress update.
- if (session.mProgressUpdateExecutor != null
- && session.mProgressUpdateListener != null) {
- session.mProgressUpdateExecutor.execute(
- () -> session.mProgressUpdateListener.onProgressUpdate(session,
- newProgress));
- }
- }
- }
-
- private IMediaTranscodingService getService(boolean retry) {
- // Do not try to get the service on pre-S. The service is lazy-start and getting the
- // service could block.
- if (!SdkLevel.isAtLeastS()) {
- return null;
- }
-
- int retryCount = !retry ? 1 : CONNECT_SERVICE_RETRY_COUNT;
- Log.i(TAG, "get service with retry " + retryCount);
- for (int count = 1; count <= retryCount; count++) {
- Log.d(TAG, "Trying to connect to service. Try count: " + count);
- IMediaTranscodingService service = IMediaTranscodingService.Stub.asInterface(
- MediaFrameworkInitializer
- .getMediaServiceManager()
- .getMediaTranscodingServiceRegisterer()
- .get());
- if (service != null) {
- return service;
- }
- try {
- // Sleep a bit before retry.
- Thread.sleep(INTERVAL_CONNECT_SERVICE_RETRY_MS);
- } catch (InterruptedException ie) {
- /* ignore */
- }
- }
- Log.w(TAG, "Failed to get service");
- return null;
- }
-
- /*
- * Handle client binder died event.
- * Upon receiving a binder died event of the client, we will do the following:
- * 1) For the session that is running, notify the client that the session is failed with
- * error code, so client could choose to retry the session or not.
- * TODO(hkuang): Add a new error code to signal service died error.
- * 2) For the sessions that is still pending or paused, we will resubmit the session
- * once we successfully reconnect to the service and register a new client.
- * 3) When trying to connect to the service and register a new client. The service may need time
- * to reboot or never boot up again. So we will retry for a number of times. If we still
- * could not connect, we will notify client session failure for the pending and paused
- * sessions.
- */
- private void onClientDied() {
- synchronized (mLock) {
- mTranscodingClient = null;
- }
-
- // Delegates the session notification and retry to the executor as it may take some time.
- mExecutor.execute(() -> {
- // List to track the sessions that we want to retry.
- List<TranscodingSession> retrySessions = new ArrayList<TranscodingSession>();
-
- // First notify the client of session failure for all the running sessions.
- synchronized (mPendingTranscodingSessions) {
- for (Map.Entry<Integer, TranscodingSession> entry :
- mPendingTranscodingSessions.entrySet()) {
- TranscodingSession session = entry.getValue();
-
- if (session.getStatus() == TranscodingSession.STATUS_RUNNING) {
- session.updateStatusAndResult(TranscodingSession.STATUS_FINISHED,
- TranscodingSession.RESULT_ERROR,
- TranscodingSession.ERROR_SERVICE_DIED);
-
- // Remove the session from pending sessions.
- mPendingTranscodingSessions.remove(entry.getKey());
-
- if (session.mListener != null && session.mListenerExecutor != null) {
- Log.i(TAG, "Notify client session failed");
- session.mListenerExecutor.execute(
- () -> session.mListener.onTranscodingFinished(session));
- }
- } else if (session.getStatus() == TranscodingSession.STATUS_PENDING
- || session.getStatus() == TranscodingSession.STATUS_PAUSED) {
- // Add the session to retrySessions to handle them later.
- retrySessions.add(session);
- }
- }
- }
-
- // Try to register with the service once it boots up.
- IMediaTranscodingService service = getService(true /*retry*/);
- boolean haveTranscodingClient = false;
- if (service != null) {
- synchronized (mLock) {
- mTranscodingClient = registerClient(service);
- if (mTranscodingClient != null) {
- haveTranscodingClient = true;
- }
- }
- }
-
- for (TranscodingSession session : retrySessions) {
- // Notify the session failure if we fails to connect to the service or fail
- // to retry the session.
- if (!haveTranscodingClient) {
- // TODO(hkuang): Return correct error code to the client.
- handleTranscodingFailed(session.getSessionId(), 0 /*unused */);
- }
-
- try {
- // Do not set hasRetried for retry initiated by MediaTranscodingManager.
- session.retryInternal(false /*setHasRetried*/);
- } catch (Exception re) {
- // TODO(hkuang): Return correct error code to the client.
- handleTranscodingFailed(session.getSessionId(), 0 /*unused */);
- }
- }
- });
- }
-
- private void updateStatus(int sessionId, int status) {
- synchronized (mPendingTranscodingSessions) {
- final TranscodingSession session = mPendingTranscodingSessions.get(sessionId);
-
- if (session == null) {
- // This should not happen in reality.
- Log.e(TAG, "Session " + sessionId + " is not in Pendingsessions");
- return;
- }
-
- // Updates the session status.
- session.updateStatus(status);
- }
- }
-
- // Just forwards all the events to the event handler.
- private ITranscodingClientCallback mTranscodingClientCallback =
- new ITranscodingClientCallback.Stub() {
- // TODO(hkuang): Add more unit test to test difference file open mode.
- @Override
- public ParcelFileDescriptor openFileDescriptor(String fileUri, String mode)
- throws RemoteException {
- if (!mode.equals("r") && !mode.equals("w") && !mode.equals("rw")) {
- Log.e(TAG, "Unsupport mode: " + mode);
- return null;
- }
-
- Uri uri = Uri.parse(fileUri);
- try {
- AssetFileDescriptor afd = mContentResolver.openAssetFileDescriptor(uri,
- mode);
- if (afd != null) {
- return afd.getParcelFileDescriptor();
- }
- } catch (FileNotFoundException e) {
- Log.w(TAG, "Cannot find content uri: " + uri, e);
- } catch (SecurityException e) {
- Log.w(TAG, "Cannot open content uri: " + uri, e);
- } catch (Exception e) {
- Log.w(TAG, "Unknown content uri: " + uri, e);
- }
- return null;
- }
-
- @Override
- public void onTranscodingStarted(int sessionId) throws RemoteException {
- updateStatus(sessionId, TranscodingSession.STATUS_RUNNING);
- }
-
- @Override
- public void onTranscodingPaused(int sessionId) throws RemoteException {
- updateStatus(sessionId, TranscodingSession.STATUS_PAUSED);
- }
-
- @Override
- public void onTranscodingResumed(int sessionId) throws RemoteException {
- updateStatus(sessionId, TranscodingSession.STATUS_RUNNING);
- }
-
- @Override
- public void onTranscodingFinished(int sessionId, TranscodingResultParcel result)
- throws RemoteException {
- handleTranscodingFinished(sessionId, result);
- }
-
- @Override
- public void onTranscodingFailed(int sessionId, int errorCode)
- throws RemoteException {
- handleTranscodingFailed(sessionId, errorCode);
- }
-
- @Override
- public void onAwaitNumberOfSessionsChanged(int sessionId, int oldAwaitNumber,
- int newAwaitNumber) throws RemoteException {
- //TODO(hkuang): Implement this.
- }
-
- @Override
- public void onProgressUpdate(int sessionId, int newProgress)
- throws RemoteException {
- handleTranscodingProgressUpdate(sessionId, newProgress);
- }
- };
-
- private ITranscodingClient registerClient(IMediaTranscodingService service) {
- synchronized (mLock) {
- try {
- // Registers the client with MediaTranscoding service.
- mTranscodingClient = service.registerClient(
- mTranscodingClientCallback,
- mPackageName,
- mPackageName);
-
- if (mTranscodingClient != null) {
- mTranscodingClient.asBinder().linkToDeath(() -> onClientDied(), /* flags */ 0);
- }
- } catch (Exception ex) {
- Log.e(TAG, "Failed to register new client due to exception " + ex);
- mTranscodingClient = null;
- }
- }
- return mTranscodingClient;
- }
-
- /**
- * @hide
- */
- public MediaTranscodingManager(@NonNull Context context) {
- mContext = context;
- mContentResolver = mContext.getContentResolver();
- mPackageName = mContext.getPackageName();
- mUid = Os.getuid();
- mPid = Os.getpid();
- }
-
- /**
- * Abstract base class for all the TranscodingRequest.
- * <p> TranscodingRequest encapsulates the desired configuration for the transcoding.
- */
- public abstract static class TranscodingRequest {
- /**
- *
- * Default transcoding type.
- * @hide
- */
- public static final int TRANSCODING_TYPE_UNKNOWN = 0;
-
- /**
- * TRANSCODING_TYPE_VIDEO indicates that client wants to perform transcoding on a video.
- * <p>Note that currently only support transcoding video file in mp4 format.
- * @hide
- */
- public static final int TRANSCODING_TYPE_VIDEO = 1;
-
- /**
- * TRANSCODING_TYPE_IMAGE indicates that client wants to perform transcoding on an image.
- * @hide
- */
- public static final int TRANSCODING_TYPE_IMAGE = 2;
-
- /** @hide */
- @IntDef(prefix = {"TRANSCODING_TYPE_"}, value = {
- TRANSCODING_TYPE_UNKNOWN,
- TRANSCODING_TYPE_VIDEO,
- TRANSCODING_TYPE_IMAGE,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface TranscodingType {}
-
- /**
- * Default value.
- *
- * @hide
- */
- public static final int PRIORITY_UNKNOWN = 0;
- /**
- * PRIORITY_REALTIME indicates that the transcoding request is time-critical and that the
- * client wants the transcoding result as soon as possible.
- * <p> Set PRIORITY_REALTIME only if the transcoding is time-critical as it will involve
- * performance penalty due to resource reallocation to prioritize the sessions with higher
- * priority.
- *
- * @hide
- */
- public static final int PRIORITY_REALTIME = 1;
-
- /**
- * PRIORITY_OFFLINE indicates the transcoding is not time-critical and the client does not
- * need the transcoding result as soon as possible.
- * <p>Sessions with PRIORITY_OFFLINE will be scheduled behind PRIORITY_REALTIME. Always set
- * to
- * PRIORITY_OFFLINE if client does not need the result as soon as possible and could accept
- * delay of the transcoding result.
- *
- * @hide
- *
- */
- public static final int PRIORITY_OFFLINE = 2;
-
- /** @hide */
- @IntDef(prefix = {"PRIORITY_"}, value = {
- PRIORITY_UNKNOWN,
- PRIORITY_REALTIME,
- PRIORITY_OFFLINE,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface TranscodingPriority {}
-
- /** Uri of the source media file. */
- private @NonNull Uri mSourceUri;
-
- /** Uri of the destination media file. */
- private @NonNull Uri mDestinationUri;
-
- /** FileDescriptor of the source media file. */
- private @Nullable ParcelFileDescriptor mSourceFileDescriptor;
-
- /** FileDescriptor of the destination media file. */
- private @Nullable ParcelFileDescriptor mDestinationFileDescriptor;
-
- /**
- * The UID of the client that the TranscodingRequest is for. Only privileged caller could
- * set this Uid as only they could do the transcoding on behalf of the client.
- * -1 means not available.
- */
- private int mClientUid = -1;
-
- /**
- * The Pid of the client that the TranscodingRequest is for. Only privileged caller could
- * set this Uid as only they could do the transcoding on behalf of the client.
- * -1 means not available.
- */
- private int mClientPid = -1;
-
- /** Type of the transcoding. */
- private @TranscodingType int mType = TRANSCODING_TYPE_UNKNOWN;
-
- /** Priority of the transcoding. */
- private @TranscodingPriority int mPriority = PRIORITY_UNKNOWN;
-
- /**
- * Desired image format for the destination file.
- * <p> If this is null, source file's image track will be passed through and copied to the
- * destination file.
- * @hide
- */
- private @Nullable MediaFormat mImageFormat = null;
-
- @VisibleForTesting
- private TranscodingTestConfig mTestConfig = null;
-
- /**
- * Prevent public constructor access.
- */
- /* package private */ TranscodingRequest() {
- }
-
- private TranscodingRequest(Builder b) {
- mSourceUri = b.mSourceUri;
- mSourceFileDescriptor = b.mSourceFileDescriptor;
- mDestinationUri = b.mDestinationUri;
- mDestinationFileDescriptor = b.mDestinationFileDescriptor;
- mClientUid = b.mClientUid;
- mClientPid = b.mClientPid;
- mPriority = b.mPriority;
- mType = b.mType;
- mTestConfig = b.mTestConfig;
- }
-
- /**
- * Return the type of the transcoding.
- * @hide
- */
- @TranscodingType
- public int getType() {
- return mType;
- }
-
- /** Return source uri of the transcoding. */
- @NonNull
- public Uri getSourceUri() {
- return mSourceUri;
- }
-
- /**
- * Return source file descriptor of the transcoding.
- * This will be null if client has not provided it.
- */
- @Nullable
- public ParcelFileDescriptor getSourceFileDescriptor() {
- return mSourceFileDescriptor;
- }
-
- /** Return the UID of the client that this request is for. -1 means not available. */
- public int getClientUid() {
- return mClientUid;
- }
-
- /** Return the PID of the client that this request is for. -1 means not available. */
- public int getClientPid() {
- return mClientPid;
- }
-
- /** Return destination uri of the transcoding. */
- @NonNull
- public Uri getDestinationUri() {
- return mDestinationUri;
- }
-
- /**
- * Return destination file descriptor of the transcoding.
- * This will be null if client has not provided it.
- */
- @Nullable
- public ParcelFileDescriptor getDestinationFileDescriptor() {
- return mDestinationFileDescriptor;
- }
-
- /**
- * Return priority of the transcoding.
- * @hide
- */
- @TranscodingPriority
- public int getPriority() {
- return mPriority;
- }
-
- /**
- * Return TestConfig of the transcoding.
- * @hide
- */
- @Nullable
- public TranscodingTestConfig getTestConfig() {
- return mTestConfig;
- }
-
- abstract void writeFormatToParcel(TranscodingRequestParcel parcel);
-
- /* Writes the TranscodingRequest to a parcel. */
- private TranscodingRequestParcel writeToParcel(@NonNull Context context) {
- TranscodingRequestParcel parcel = new TranscodingRequestParcel();
- switch (mPriority) {
- case PRIORITY_OFFLINE:
- parcel.priority = TranscodingSessionPriority.kUnspecified;
- break;
- case PRIORITY_REALTIME:
- case PRIORITY_UNKNOWN:
- default:
- parcel.priority = TranscodingSessionPriority.kNormal;
- break;
- }
- parcel.transcodingType = mType;
- parcel.sourceFilePath = mSourceUri.toString();
- parcel.sourceFd = mSourceFileDescriptor;
- parcel.destinationFilePath = mDestinationUri.toString();
- parcel.destinationFd = mDestinationFileDescriptor;
- parcel.clientUid = mClientUid;
- parcel.clientPid = mClientPid;
- if (mClientUid < 0) {
- parcel.clientPackageName = context.getPackageName();
- } else {
- String packageName = context.getPackageManager().getNameForUid(mClientUid);
- // PackageName is optional as some uid does not have package name. Set to
- // "Unavailable" string in this case.
- if (packageName == null) {
- Log.w(TAG, "Failed to find package for uid: " + mClientUid);
- packageName = "Unavailable";
- }
- parcel.clientPackageName = packageName;
- }
- writeFormatToParcel(parcel);
- if (mTestConfig != null) {
- parcel.isForTesting = true;
- parcel.testConfig = mTestConfig;
- }
- return parcel;
- }
-
- /**
- * Builder to build a {@link TranscodingRequest} object.
- *
- * @param <T> The subclass to be built.
- */
- abstract static class Builder<T extends Builder<T>> {
- private @NonNull Uri mSourceUri;
- private @NonNull Uri mDestinationUri;
- private @Nullable ParcelFileDescriptor mSourceFileDescriptor = null;
- private @Nullable ParcelFileDescriptor mDestinationFileDescriptor = null;
- private int mClientUid = -1;
- private int mClientPid = -1;
- private @TranscodingType int mType = TRANSCODING_TYPE_UNKNOWN;
- private @TranscodingPriority int mPriority = PRIORITY_UNKNOWN;
- private TranscodingTestConfig mTestConfig;
-
- abstract T self();
-
- /**
- * Creates a builder for building {@link TranscodingRequest}s.
- *
- * Client must set the source Uri. If client also provides the source fileDescriptor
- * through is provided by {@link #setSourceFileDescriptor(ParcelFileDescriptor)},
- * TranscodingSession will use the fd instead of calling back to the client to open the
- * sourceUri.
- *
- *
- * @param type The transcoding type.
- * @param sourceUri Content uri for the source media file.
- * @param destinationUri Content uri for the destination media file.
- *
- */
- private Builder(@TranscodingType int type, @NonNull Uri sourceUri,
- @NonNull Uri destinationUri) {
- mType = type;
-
- if (sourceUri == null || Uri.EMPTY.equals(sourceUri)) {
- throw new IllegalArgumentException(
- "You must specify a non-empty source Uri.");
- }
- mSourceUri = sourceUri;
-
- if (destinationUri == null || Uri.EMPTY.equals(destinationUri)) {
- throw new IllegalArgumentException(
- "You must specify a non-empty destination Uri.");
- }
- mDestinationUri = destinationUri;
- }
-
- /**
- * Specifies the fileDescriptor opened from the source media file.
- *
- * This call is optional. If the source fileDescriptor is provided, TranscodingSession
- * will use it directly instead of opening the uri from {@link #Builder(int, Uri, Uri)}.
- * It is client's responsibility to make sure the fileDescriptor is opened from the
- * source uri.
- * @param fileDescriptor a {@link ParcelFileDescriptor} opened from source media file.
- * @return The same builder instance.
- * @throws IllegalArgumentException if fileDescriptor is invalid.
- */
- @NonNull
- public T setSourceFileDescriptor(@NonNull ParcelFileDescriptor fileDescriptor) {
- if (fileDescriptor == null || fileDescriptor.getFd() < 0) {
- throw new IllegalArgumentException(
- "Invalid source descriptor.");
- }
- mSourceFileDescriptor = fileDescriptor;
- return self();
- }
-
- /**
- * Specifies the fileDescriptor opened from the destination media file.
- *
- * This call is optional. If the destination fileDescriptor is provided,
- * TranscodingSession will use it directly instead of opening the source uri from
- * {@link #Builder(int, Uri, Uri)} upon transcoding starts. It is client's
- * responsibility to make sure the fileDescriptor is opened from the destination uri.
- * @param fileDescriptor a {@link ParcelFileDescriptor} opened from destination media
- * file.
- * @return The same builder instance.
- * @throws IllegalArgumentException if fileDescriptor is invalid.
- */
- @NonNull
- public T setDestinationFileDescriptor(
- @NonNull ParcelFileDescriptor fileDescriptor) {
- if (fileDescriptor == null || fileDescriptor.getFd() < 0) {
- throw new IllegalArgumentException(
- "Invalid destination descriptor.");
- }
- mDestinationFileDescriptor = fileDescriptor;
- return self();
- }
-
- /**
- * Specify the UID of the client that this request is for.
- * <p>
- * Only privilege caller with android.permission.WRITE_MEDIA_STORAGE could forward the
- * pid. Note that the permission check happens on the service side upon starting the
- * transcoding. If the client does not have the permission, the transcoding will fail.
- *
- * @param uid client Uid.
- * @return The same builder instance.
- * @throws IllegalArgumentException if uid is invalid.
- */
- @NonNull
- public T setClientUid(int uid) {
- if (uid < 0) {
- throw new IllegalArgumentException("Invalid Uid");
- }
- mClientUid = uid;
- return self();
- }
-
- /**
- * Specify the pid of the client that this request is for.
- * <p>
- * Only privilege caller with android.permission.WRITE_MEDIA_STORAGE could forward the
- * pid. Note that the permission check happens on the service side upon starting the
- * transcoding. If the client does not have the permission, the transcoding will fail.
- *
- * @param pid client Pid.
- * @return The same builder instance.
- * @throws IllegalArgumentException if pid is invalid.
- */
- @NonNull
- public T setClientPid(int pid) {
- if (pid < 0) {
- throw new IllegalArgumentException("Invalid pid");
- }
- mClientPid = pid;
- return self();
- }
-
- /**
- * Specifies the priority of the transcoding.
- *
- * @param priority Must be one of the {@code PRIORITY_*}
- * @return The same builder instance.
- * @throws IllegalArgumentException if flags is invalid.
- * @hide
- */
- @NonNull
- public T setPriority(@TranscodingPriority int priority) {
- if (priority != PRIORITY_OFFLINE && priority != PRIORITY_REALTIME) {
- throw new IllegalArgumentException("Invalid priority: " + priority);
- }
- mPriority = priority;
- return self();
- }
-
- /**
- * Sets the delay in processing this request.
- * @param config test config.
- * @return The same builder instance.
- * @hide
- */
- @VisibleForTesting
- @NonNull
- public T setTestConfig(@NonNull TranscodingTestConfig config) {
- mTestConfig = config;
- return self();
- }
- }
-
- /**
- * Abstract base class for all the format resolvers.
- */
- abstract static class MediaFormatResolver {
- private @NonNull ApplicationMediaCapabilities mClientCaps;
-
- /**
- * Prevents public constructor access.
- */
- /* package private */ MediaFormatResolver() {
- }
-
- /**
- * Constructs MediaFormatResolver object.
- *
- * @param clientCaps An ApplicationMediaCapabilities object containing the client's
- * capabilities.
- */
- MediaFormatResolver(@NonNull ApplicationMediaCapabilities clientCaps) {
- if (clientCaps == null) {
- throw new IllegalArgumentException("Client capabilities must not be null");
- }
- mClientCaps = clientCaps;
- }
-
- /**
- * Returns the client capabilities.
- */
- @NonNull
- /* package */ ApplicationMediaCapabilities getClientCapabilities() {
- return mClientCaps;
- }
-
- abstract boolean shouldTranscode();
- }
-
- /**
- * VideoFormatResolver for deciding if video transcoding is needed, and if so, the track
- * formats to use.
- */
- public static class VideoFormatResolver extends MediaFormatResolver {
- private static final int BIT_RATE = 20000000; // 20Mbps
-
- private MediaFormat mSrcVideoFormatHint;
- private MediaFormat mSrcAudioFormatHint;
-
- /**
- * Constructs a new VideoFormatResolver object.
- *
- * @param clientCaps An ApplicationMediaCapabilities object containing the client's
- * capabilities.
- * @param srcVideoFormatHint A MediaFormat object containing information about the
- * source's video track format that could affect the
- * transcoding decision. Such information could include video
- * codec types, color spaces, whether special format info (eg.
- * slow-motion markers) are present, etc.. If a particular
- * information is not present, it will not be used to make the
- * decision.
- */
- public VideoFormatResolver(@NonNull ApplicationMediaCapabilities clientCaps,
- @NonNull MediaFormat srcVideoFormatHint) {
- super(clientCaps);
- mSrcVideoFormatHint = srcVideoFormatHint;
- }
-
- /**
- * Constructs a new VideoFormatResolver object.
- *
- * @param clientCaps An ApplicationMediaCapabilities object containing the client's
- * capabilities.
- * @param srcVideoFormatHint A MediaFormat object containing information about the
- * source's video track format that could affect the
- * transcoding decision. Such information could include video
- * codec types, color spaces, whether special format info (eg.
- * slow-motion markers) are present, etc.. If a particular
- * information is not present, it will not be used to make the
- * decision.
- * @param srcAudioFormatHint A MediaFormat object containing information about the
- * source's audio track format that could affect the
- * transcoding decision.
- * @hide
- */
- VideoFormatResolver(@NonNull ApplicationMediaCapabilities clientCaps,
- @NonNull MediaFormat srcVideoFormatHint,
- @NonNull MediaFormat srcAudioFormatHint) {
- super(clientCaps);
- mSrcVideoFormatHint = srcVideoFormatHint;
- mSrcAudioFormatHint = srcAudioFormatHint;
- }
-
- /**
- * Returns whether the source content should be transcoded.
- *
- * @return true if the source should be transcoded.
- */
- public boolean shouldTranscode() {
- boolean supportHevc = getClientCapabilities().isVideoMimeTypeSupported(
- MediaFormat.MIMETYPE_VIDEO_HEVC);
- if (!supportHevc && MediaFormat.MIMETYPE_VIDEO_HEVC.equals(
- mSrcVideoFormatHint.getString(MediaFormat.KEY_MIME))) {
- return true;
- }
- // TODO: add more checks as needed below.
- return false;
- }
-
- /**
- * Retrieves the video track format to be used on
- * {@link VideoTranscodingRequest.Builder#setVideoTrackFormat(MediaFormat)} for this
- * configuration.
- *
- * @return the video track format to be used if transcoding should be performed,
- * and null otherwise.
- * @throws IllegalArgumentException if the hinted source video format contains invalid
- * parameters.
- */
- @Nullable
- public MediaFormat resolveVideoFormat() {
- if (!shouldTranscode()) {
- return null;
- }
-
- MediaFormat videoTrackFormat = new MediaFormat(mSrcVideoFormatHint);
- videoTrackFormat.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_VIDEO_AVC);
-
- int width = mSrcVideoFormatHint.getInteger(MediaFormat.KEY_WIDTH, -1);
- int height = mSrcVideoFormatHint.getInteger(MediaFormat.KEY_HEIGHT, -1);
- if (width <= 0 || height <= 0) {
- throw new IllegalArgumentException(
- "Source Width and height must be larger than 0");
- }
-
- float frameRate =
- mSrcVideoFormatHint.getNumber(MediaFormat.KEY_FRAME_RATE, 30.0)
- .floatValue();
- if (frameRate <= 0) {
- throw new IllegalArgumentException(
- "frameRate must be larger than 0");
- }
-
- int bitrate = getAVCBitrate(width, height, frameRate);
- videoTrackFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
- return videoTrackFormat;
- }
-
- /**
- * Generate a default bitrate with the fixed bpp(bits-per-pixel) 0.25.
- * This maps to:
- * 1080P@30fps -> 16Mbps
- * 1080P@60fps-> 32Mbps
- * 4K@30fps -> 62Mbps
- */
- private static int getDefaultBitrate(int width, int height, float frameRate) {
- return (int) (width * height * frameRate * BPP);
- }
-
- /**
- * Query the bitrate from CamcorderProfile. If there are two profiles that match the
- * width/height/framerate, we will use the higher one to get better quality.
- * Return default bitrate if could not find any match profile.
- */
- private static int getAVCBitrate(int width, int height, float frameRate) {
- int bitrate = -1;
- int[] cameraIds = {0, 1};
-
- // Profiles ordered in decreasing order of preference.
- int[] preferQualities = {
- CamcorderProfile.QUALITY_2160P,
- CamcorderProfile.QUALITY_1080P,
- CamcorderProfile.QUALITY_720P,
- CamcorderProfile.QUALITY_480P,
- CamcorderProfile.QUALITY_LOW,
- };
-
- for (int cameraId : cameraIds) {
- for (int quality : preferQualities) {
- // Check if camera id has profile for the quality level.
- if (!CamcorderProfile.hasProfile(cameraId, quality)) {
- continue;
- }
- CamcorderProfile profile = CamcorderProfile.get(cameraId, quality);
- // Check the width/height/framerate/codec, also consider portrait case.
- if (((width == profile.videoFrameWidth
- && height == profile.videoFrameHeight)
- || (height == profile.videoFrameWidth
- && width == profile.videoFrameHeight))
- && (int) frameRate == profile.videoFrameRate
- && profile.videoCodec == MediaRecorder.VideoEncoder.H264) {
- if (bitrate < profile.videoBitRate) {
- bitrate = profile.videoBitRate;
- }
- break;
- }
- }
- }
-
- if (bitrate == -1) {
- Log.w(TAG, "Failed to find CamcorderProfile for w: " + width + "h: " + height
- + " fps: "
- + frameRate);
- bitrate = getDefaultBitrate(width, height, frameRate);
- }
- Log.d(TAG, "Using bitrate " + bitrate + " for " + width + " " + height + " "
- + frameRate);
- return bitrate;
- }
-
- /**
- * Retrieves the audio track format to be used for transcoding.
- *
- * @return the audio track format to be used if transcoding should be performed, and
- * null otherwise.
- * @hide
- */
- @Nullable
- public MediaFormat resolveAudioFormat() {
- if (!shouldTranscode()) {
- return null;
- }
- // Audio transcoding is not supported yet, always return null.
- return null;
- }
- }
- }
-
- /**
- * VideoTranscodingRequest encapsulates the configuration for transcoding a video.
- */
- public static final class VideoTranscodingRequest extends TranscodingRequest {
- /**
- * Desired output video format of the destination file.
- * <p> If this is null, source file's video track will be passed through and copied to the
- * destination file.
- */
- private @Nullable MediaFormat mVideoTrackFormat = null;
-
- /**
- * Desired output audio format of the destination file.
- * <p> If this is null, source file's audio track will be passed through and copied to the
- * destination file.
- */
- private @Nullable MediaFormat mAudioTrackFormat = null;
-
- private VideoTranscodingRequest(VideoTranscodingRequest.Builder builder) {
- super(builder);
- mVideoTrackFormat = builder.mVideoTrackFormat;
- mAudioTrackFormat = builder.mAudioTrackFormat;
- }
-
- /**
- * Return the video track format of the transcoding.
- * This will be null if client has not specified the video track format.
- */
- @NonNull
- public MediaFormat getVideoTrackFormat() {
- return mVideoTrackFormat;
- }
-
- @Override
- void writeFormatToParcel(TranscodingRequestParcel parcel) {
- parcel.requestedVideoTrackFormat = convertToVideoTrackFormat(mVideoTrackFormat);
- }
-
- /* Converts the MediaFormat to TranscodingVideoTrackFormat. */
- private static TranscodingVideoTrackFormat convertToVideoTrackFormat(MediaFormat format) {
- if (format == null) {
- throw new IllegalArgumentException("Invalid MediaFormat");
- }
-
- TranscodingVideoTrackFormat trackFormat = new TranscodingVideoTrackFormat();
-
- if (format.containsKey(MediaFormat.KEY_MIME)) {
- String mime = format.getString(MediaFormat.KEY_MIME);
- if (MediaFormat.MIMETYPE_VIDEO_AVC.equals(mime)) {
- trackFormat.codecType = TranscodingVideoCodecType.kAvc;
- } else if (MediaFormat.MIMETYPE_VIDEO_HEVC.equals(mime)) {
- trackFormat.codecType = TranscodingVideoCodecType.kHevc;
- } else {
- throw new UnsupportedOperationException("Only support transcode to avc/hevc");
- }
- }
-
- if (format.containsKey(MediaFormat.KEY_BIT_RATE)) {
- int bitrateBps = format.getInteger(MediaFormat.KEY_BIT_RATE);
- if (bitrateBps <= 0) {
- throw new IllegalArgumentException("Bitrate must be larger than 0");
- }
- trackFormat.bitrateBps = bitrateBps;
- }
-
- if (format.containsKey(MediaFormat.KEY_WIDTH) && format.containsKey(
- MediaFormat.KEY_HEIGHT)) {
- int width = format.getInteger(MediaFormat.KEY_WIDTH);
- int height = format.getInteger(MediaFormat.KEY_HEIGHT);
- if (width <= 0 || height <= 0) {
- throw new IllegalArgumentException("Width and height must be larger than 0");
- }
- // TODO: Validate the aspect ratio after adding scaling.
- trackFormat.width = width;
- trackFormat.height = height;
- }
-
- if (format.containsKey(MediaFormat.KEY_PROFILE)) {
- int profile = format.getInteger(MediaFormat.KEY_PROFILE);
- if (profile <= 0) {
- throw new IllegalArgumentException("Invalid codec profile");
- }
- // TODO: Validate the profile according to codec type.
- trackFormat.profile = profile;
- }
-
- if (format.containsKey(MediaFormat.KEY_LEVEL)) {
- int level = format.getInteger(MediaFormat.KEY_LEVEL);
- if (level <= 0) {
- throw new IllegalArgumentException("Invalid codec level");
- }
- // TODO: Validate the level according to codec type.
- trackFormat.level = level;
- }
-
- return trackFormat;
- }
-
- /**
- * Builder class for {@link VideoTranscodingRequest}.
- */
- public static final class Builder extends
- TranscodingRequest.Builder<VideoTranscodingRequest.Builder> {
- /**
- * Desired output video format of the destination file.
- * <p> If this is null, source file's video track will be passed through and
- * copied to the destination file.
- */
- private @Nullable MediaFormat mVideoTrackFormat = null;
-
- /**
- * Desired output audio format of the destination file.
- * <p> If this is null, source file's audio track will be passed through and copied
- * to the destination file.
- */
- private @Nullable MediaFormat mAudioTrackFormat = null;
-
- /**
- * Creates a builder for building {@link VideoTranscodingRequest}s.
- *
- * <p> Client could only specify the settings that matters to them, e.g. codec format or
- * bitrate. And by default, transcoding will preserve the original video's settings
- * (bitrate, framerate, resolution) if not provided.
- * <p>Note that some settings may silently fail to apply if the device does not support
- * them.
- * @param sourceUri Content uri for the source media file.
- * @param destinationUri Content uri for the destination media file.
- * @param videoFormat MediaFormat containing the settings that client wants override in
- * the original video's video track.
- * @throws IllegalArgumentException if videoFormat is invalid.
- */
- public Builder(@NonNull Uri sourceUri, @NonNull Uri destinationUri,
- @NonNull MediaFormat videoFormat) {
- super(TRANSCODING_TYPE_VIDEO, sourceUri, destinationUri);
- setVideoTrackFormat(videoFormat);
- }
-
- @Override
- @NonNull
- public Builder setClientUid(int uid) {
- super.setClientUid(uid);
- return self();
- }
-
- @Override
- @NonNull
- public Builder setClientPid(int pid) {
- super.setClientPid(pid);
- return self();
- }
-
- @Override
- @NonNull
- public Builder setSourceFileDescriptor(@NonNull ParcelFileDescriptor fd) {
- super.setSourceFileDescriptor(fd);
- return self();
- }
-
- @Override
- @NonNull
- public Builder setDestinationFileDescriptor(@NonNull ParcelFileDescriptor fd) {
- super.setDestinationFileDescriptor(fd);
- return self();
- }
-
- private void setVideoTrackFormat(@NonNull MediaFormat videoFormat) {
- if (videoFormat == null) {
- throw new IllegalArgumentException("videoFormat must not be null");
- }
-
- // Check if the MediaFormat is for video by looking at the MIME type.
- String mime = videoFormat.containsKey(MediaFormat.KEY_MIME)
- ? videoFormat.getString(MediaFormat.KEY_MIME) : null;
- if (mime == null || !mime.startsWith("video/")) {
- throw new IllegalArgumentException("Invalid video format: wrong mime type");
- }
-
- mVideoTrackFormat = videoFormat;
- }
-
- /**
- * @return a new {@link TranscodingRequest} instance successfully initialized
- * with all the parameters set on this <code>Builder</code>.
- * @throws UnsupportedOperationException if the parameters set on the
- * <code>Builder</code> were incompatible, or
- * if they are not supported by the
- * device.
- */
- @NonNull
- public VideoTranscodingRequest build() {
- return new VideoTranscodingRequest(this);
- }
-
- @Override
- VideoTranscodingRequest.Builder self() {
- return this;
- }
- }
- }
-
- /**
- * Handle to an enqueued transcoding operation. An instance of this class represents a single
- * enqueued transcoding operation. The caller can use that instance to query the status or
- * progress, and to get the result once the operation has completed.
- */
- public static final class TranscodingSession {
- /** The session is enqueued but not yet running. */
- public static final int STATUS_PENDING = 1;
- /** The session is currently running. */
- public static final int STATUS_RUNNING = 2;
- /** The session is finished. */
- public static final int STATUS_FINISHED = 3;
- /** The session is paused. */
- public static final int STATUS_PAUSED = 4;
-
- /** @hide */
- @IntDef(prefix = { "STATUS_" }, value = {
- STATUS_PENDING,
- STATUS_RUNNING,
- STATUS_FINISHED,
- STATUS_PAUSED,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface Status {}
-
- /** The session does not have a result yet. */
- public static final int RESULT_NONE = 1;
- /** The session completed successfully. */
- public static final int RESULT_SUCCESS = 2;
- /** The session encountered an error while running. */
- public static final int RESULT_ERROR = 3;
- /** The session was canceled by the caller. */
- public static final int RESULT_CANCELED = 4;
-
- /** @hide */
- @IntDef(prefix = { "RESULT_" }, value = {
- RESULT_NONE,
- RESULT_SUCCESS,
- RESULT_ERROR,
- RESULT_CANCELED,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface Result {}
-
-
- // The error code exposed here should be in sync with:
- // frameworks/av/media/libmediatranscoding/aidl/android/media/TranscodingErrorCode.aidl
- /** @hide */
- @IntDef(prefix = { "TRANSCODING_SESSION_ERROR_" }, value = {
- ERROR_NONE,
- ERROR_DROPPED_BY_SERVICE,
- ERROR_SERVICE_DIED})
- @Retention(RetentionPolicy.SOURCE)
- public @interface TranscodingSessionErrorCode{}
- /**
- * Constant indicating that no error occurred.
- */
- public static final int ERROR_NONE = 0;
-
- /**
- * Constant indicating that the session is dropped by Transcoding service due to hitting
- * the limit, e.g. too many back to back transcoding happen in a short time frame.
- */
- public static final int ERROR_DROPPED_BY_SERVICE = 1;
-
- /**
- * Constant indicating the backing transcoding service is died. Client should enqueue the
- * the request again.
- */
- public static final int ERROR_SERVICE_DIED = 2;
-
- /** Listener that gets notified when the progress changes. */
- @FunctionalInterface
- public interface OnProgressUpdateListener {
- /**
- * Called when the progress changes. The progress is in percentage between 0 and 1,
- * where 0 means the session has not yet started and 100 means that it has finished.
- *
- * @param session The session associated with the progress.
- * @param progress The new progress ranging from 0 ~ 100 inclusive.
- */
- void onProgressUpdate(@NonNull TranscodingSession session,
- @IntRange(from = 0, to = 100) int progress);
- }
-
- private final MediaTranscodingManager mManager;
- private Executor mListenerExecutor;
- private OnTranscodingFinishedListener mListener;
- private int mSessionId = -1;
- // Lock for internal state.
- private final Object mLock = new Object();
- @GuardedBy("mLock")
- private Executor mProgressUpdateExecutor = null;
- @GuardedBy("mLock")
- private OnProgressUpdateListener mProgressUpdateListener = null;
- @GuardedBy("mLock")
- private int mProgress = 0;
- @GuardedBy("mLock")
- private int mProgressUpdateInterval = 0;
- @GuardedBy("mLock")
- private @Status int mStatus = STATUS_PENDING;
- @GuardedBy("mLock")
- private @Result int mResult = RESULT_NONE;
- @GuardedBy("mLock")
- private @TranscodingSessionErrorCode int mErrorCode = ERROR_NONE;
- @GuardedBy("mLock")
- private boolean mHasRetried = false;
- // The original request that associated with this session.
- private final TranscodingRequest mRequest;
-
- private TranscodingSession(
- @NonNull MediaTranscodingManager manager,
- @NonNull TranscodingRequest request,
- @NonNull TranscodingSessionParcel parcel,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull OnTranscodingFinishedListener listener) {
- Objects.requireNonNull(manager, "manager must not be null");
- Objects.requireNonNull(parcel, "parcel must not be null");
- Objects.requireNonNull(executor, "listenerExecutor must not be null");
- Objects.requireNonNull(listener, "listener must not be null");
- mManager = manager;
- mSessionId = parcel.sessionId;
- mListenerExecutor = executor;
- mListener = listener;
- mRequest = request;
- }
-
- /**
- * Set a progress listener.
- * @param executor The executor on which listener will be invoked.
- * @param listener The progress listener.
- */
- public void setOnProgressUpdateListener(
- @NonNull @CallbackExecutor Executor executor,
- @Nullable OnProgressUpdateListener listener) {
- synchronized (mLock) {
- Objects.requireNonNull(executor, "listenerExecutor must not be null");
- Objects.requireNonNull(listener, "listener must not be null");
- mProgressUpdateExecutor = executor;
- mProgressUpdateListener = listener;
- }
- }
-
- private void updateStatusAndResult(@Status int sessionStatus,
- @Result int sessionResult, @TranscodingSessionErrorCode int errorCode) {
- synchronized (mLock) {
- mStatus = sessionStatus;
- mResult = sessionResult;
- mErrorCode = errorCode;
- }
- }
-
- /**
- * Retrieve the error code associated with the RESULT_ERROR.
- */
- public @TranscodingSessionErrorCode int getErrorCode() {
- synchronized (mLock) {
- return mErrorCode;
- }
- }
-
- /**
- * Resubmit the transcoding session to the service.
- * Note that only the session that fails or gets cancelled could be retried and each session
- * could be retried only once. After that, Client need to enqueue a new request if they want
- * to try again.
- *
- * @return true if successfully resubmit the job to service. False otherwise.
- * @throws UnsupportedOperationException if the retry could not be fulfilled.
- * @hide
- */
- public boolean retry() {
- return retryInternal(true /*setHasRetried*/);
- }
-
- // TODO(hkuang): Add more test for it.
- private boolean retryInternal(boolean setHasRetried) {
- synchronized (mLock) {
- if (mStatus == STATUS_PENDING || mStatus == STATUS_RUNNING) {
- throw new UnsupportedOperationException(
- "Failed to retry as session is in processing");
- }
-
- if (mHasRetried) {
- throw new UnsupportedOperationException("Session has been retried already");
- }
-
- // Get the client interface.
- ITranscodingClient client = mManager.getTranscodingClient();
- if (client == null) {
- Log.e(TAG, "Service rebooting. Try again later");
- return false;
- }
-
- synchronized (mManager.mPendingTranscodingSessions) {
- try {
- // Submits the request to MediaTranscoding service.
- TranscodingSessionParcel sessionParcel = new TranscodingSessionParcel();
- if (!client.submitRequest(mRequest.writeToParcel(mManager.mContext),
- sessionParcel)) {
- mHasRetried = true;
- throw new UnsupportedOperationException("Failed to enqueue request");
- }
-
- // Replace the old session id wit the new one.
- mSessionId = sessionParcel.sessionId;
- // Adds the new session back into pending sessions.
- mManager.mPendingTranscodingSessions.put(mSessionId, this);
- } catch (RemoteException re) {
- return false;
- }
- mStatus = STATUS_PENDING;
- mHasRetried = setHasRetried ? true : false;
- }
- }
- return true;
- }
-
- /**
- * Cancels the transcoding session and notify the listener.
- * If the session happened to finish before being canceled this call is effectively a no-op
- * and will not update the result in that case.
- */
- public void cancel() {
- synchronized (mLock) {
- // Check if the session is finished already.
- if (mStatus != STATUS_FINISHED) {
- try {
- ITranscodingClient client = mManager.getTranscodingClient();
- // The client may be gone.
- if (client != null) {
- client.cancelSession(mSessionId);
- }
- } catch (RemoteException re) {
- //TODO(hkuang): Find out what to do if failing to cancel the session.
- Log.e(TAG, "Failed to cancel the session due to exception: " + re);
- }
- mStatus = STATUS_FINISHED;
- mResult = RESULT_CANCELED;
-
- // Notifies client the session is canceled.
- mListenerExecutor.execute(() -> mListener.onTranscodingFinished(this));
- }
- }
- }
-
- /**
- * Gets the progress of the transcoding session. The progress is between 0 and 100, where 0
- * means that the session has not yet started and 100 means that it is finished. For the
- * cancelled session, the progress will be the last updated progress before it is cancelled.
- * @return The progress.
- */
- @IntRange(from = 0, to = 100)
- public int getProgress() {
- synchronized (mLock) {
- return mProgress;
- }
- }
-
- /**
- * Gets the status of the transcoding session.
- * @return The status.
- */
- public @Status int getStatus() {
- synchronized (mLock) {
- return mStatus;
- }
- }
-
- /**
- * Adds a client uid that is also waiting for this transcoding session.
- * <p>
- * Only privilege caller with android.permission.WRITE_MEDIA_STORAGE could add the
- * uid. Note that the permission check happens on the service side upon starting the
- * transcoding. If the client does not have the permission, the transcoding will fail.
- * @param uid the additional client uid to be added.
- * @return true if successfully added, false otherwise.
- */
- public boolean addClientUid(int uid) {
- if (uid < 0) {
- throw new IllegalArgumentException("Invalid Uid");
- }
-
- // Get the client interface.
- ITranscodingClient client = mManager.getTranscodingClient();
- if (client == null) {
- Log.e(TAG, "Service is dead...");
- return false;
- }
-
- try {
- if (!client.addClientUid(mSessionId, uid)) {
- Log.e(TAG, "Failed to add client uid");
- return false;
- }
- } catch (Exception ex) {
- Log.e(TAG, "Failed to get client uids due to " + ex);
- return false;
- }
- return true;
- }
-
- /**
- * Query all the client that waiting for this transcoding session
- * @return a list containing all the client uids.
- */
- @NonNull
- public List<Integer> getClientUids() {
- List<Integer> uidList = new ArrayList<Integer>();
-
- // Get the client interface.
- ITranscodingClient client = mManager.getTranscodingClient();
- if (client == null) {
- Log.e(TAG, "Service is dead...");
- return uidList;
- }
-
- try {
- int[] clientUids = client.getClientUids(mSessionId);
- for (int i : clientUids) {
- uidList.add(i);
- }
- } catch (Exception ex) {
- Log.e(TAG, "Failed to get client uids due to " + ex);
- }
-
- return uidList;
- }
-
- /**
- * Gets sessionId of the transcoding session.
- * @return session id.
- */
- public int getSessionId() {
- return mSessionId;
- }
-
- /**
- * Gets the result of the transcoding session.
- * @return The result.
- */
- public @Result int getResult() {
- synchronized (mLock) {
- return mResult;
- }
- }
-
- @Override
- public String toString() {
- String result;
- String status;
-
- switch (mResult) {
- case RESULT_NONE:
- result = "RESULT_NONE";
- break;
- case RESULT_SUCCESS:
- result = "RESULT_SUCCESS";
- break;
- case RESULT_ERROR:
- result = "RESULT_ERROR(" + mErrorCode + ")";
- break;
- case RESULT_CANCELED:
- result = "RESULT_CANCELED";
- break;
- default:
- result = String.valueOf(mResult);
- break;
- }
-
- switch (mStatus) {
- case STATUS_PENDING:
- status = "STATUS_PENDING";
- break;
- case STATUS_PAUSED:
- status = "STATUS_PAUSED";
- break;
- case STATUS_RUNNING:
- status = "STATUS_RUNNING";
- break;
- case STATUS_FINISHED:
- status = "STATUS_FINISHED";
- break;
- default:
- status = String.valueOf(mStatus);
- break;
- }
- return String.format(" session: {id: %d, status: %s, result: %s, progress: %d}",
- mSessionId, status, result, mProgress);
- }
-
- private void updateProgress(int newProgress) {
- synchronized (mLock) {
- mProgress = newProgress;
- }
- }
-
- private void updateStatus(int newStatus) {
- synchronized (mLock) {
- mStatus = newStatus;
- }
- }
- }
-
- private ITranscodingClient getTranscodingClient() {
- synchronized (mLock) {
- return mTranscodingClient;
- }
- }
-
- /**
- * Enqueues a TranscodingRequest for execution.
- * <p> Upon successfully accepting the request, MediaTranscodingManager will return a
- * {@link TranscodingSession} to the client. Client should use {@link TranscodingSession} to
- * track the progress and get the result.
- * <p> MediaTranscodingManager will return null if fails to accept the request due to service
- * rebooting. Client could retry again after receiving null.
- *
- * @param transcodingRequest The TranscodingRequest to enqueue.
- * @param listenerExecutor Executor on which the listener is notified.
- * @param listener Listener to get notified when the transcoding session is finished.
- * @return A TranscodingSession for this operation.
- * @throws UnsupportedOperationException if the request could not be fulfilled.
- */
- @Nullable
- public TranscodingSession enqueueRequest(
- @NonNull TranscodingRequest transcodingRequest,
- @NonNull @CallbackExecutor Executor listenerExecutor,
- @NonNull OnTranscodingFinishedListener listener) {
- Log.i(TAG, "enqueueRequest called.");
- Objects.requireNonNull(transcodingRequest, "transcodingRequest must not be null");
- Objects.requireNonNull(listenerExecutor, "listenerExecutor must not be null");
- Objects.requireNonNull(listener, "listener must not be null");
-
- // Converts the request to TranscodingRequestParcel.
- TranscodingRequestParcel requestParcel = transcodingRequest.writeToParcel(mContext);
-
- Log.i(TAG, "Getting transcoding request " + transcodingRequest.getSourceUri());
-
- // Submits the request to MediaTranscoding service.
- try {
- TranscodingSessionParcel sessionParcel = new TranscodingSessionParcel();
- // Synchronizes the access to mPendingTranscodingSessions to make sure the session Id is
- // inserted in the mPendingTranscodingSessions in the callback handler.
- synchronized (mPendingTranscodingSessions) {
- synchronized (mLock) {
- if (mTranscodingClient == null) {
- // Try to register with the service again.
- IMediaTranscodingService service = getService(false /*retry*/);
- if (service == null) {
- Log.w(TAG, "Service rebooting. Try again later");
- return null;
- }
- mTranscodingClient = registerClient(service);
- // If still fails, throws an exception to tell client to try later.
- if (mTranscodingClient == null) {
- Log.w(TAG, "Service rebooting. Try again later");
- return null;
- }
- }
-
- if (!mTranscodingClient.submitRequest(requestParcel, sessionParcel)) {
- throw new UnsupportedOperationException("Failed to enqueue request");
- }
- }
-
- // Wraps the TranscodingSessionParcel into a TranscodingSession and returns it to
- // client for tracking.
- TranscodingSession session = new TranscodingSession(this, transcodingRequest,
- sessionParcel,
- listenerExecutor,
- listener);
-
- // Adds the new session into pending sessions.
- mPendingTranscodingSessions.put(session.getSessionId(), session);
- return session;
- }
- } catch (RemoteException ex) {
- Log.w(TAG, "Service rebooting. Try again later");
- return null;
- } catch (ServiceSpecificException ex) {
- throw new UnsupportedOperationException(
- "Failed to submit request to Transcoding service. Error: " + ex);
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/ProxyDataSourceCallback.java b/apex/media/framework/java/android/media/ProxyDataSourceCallback.java
deleted file mode 100644
index 14d3ce8..0000000
--- a/apex/media/framework/java/android/media/ProxyDataSourceCallback.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.os.ParcelFileDescriptor;
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.OsConstants;
-import android.util.Log;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-
-/**
- * A DataSourceCallback that is backed by a ParcelFileDescriptor.
- */
-class ProxyDataSourceCallback extends DataSourceCallback {
- private static final String TAG = "TestDataSourceCallback";
-
- ParcelFileDescriptor mPFD;
- FileDescriptor mFD;
-
- ProxyDataSourceCallback(ParcelFileDescriptor pfd) throws IOException {
- mPFD = pfd.dup();
- mFD = mPFD.getFileDescriptor();
- }
-
- @Override
- public synchronized int readAt(long position, byte[] buffer, int offset, int size)
- throws IOException {
- try {
- Os.lseek(mFD, position, OsConstants.SEEK_SET);
- int ret = Os.read(mFD, buffer, offset, size);
- return (ret == 0) ? END_OF_STREAM : ret;
- } catch (ErrnoException e) {
- throw new IOException(e);
- }
- }
-
- @Override
- public synchronized long getSize() throws IOException {
- return mPFD.getStatSize();
- }
-
- @Override
- public synchronized void close() {
- try {
- mPFD.close();
- } catch (IOException e) {
- Log.e(TAG, "Failed to close the PFD.", e);
- }
- }
-}
-
diff --git a/apex/media/framework/java/android/media/RoutingDelegate.java b/apex/media/framework/java/android/media/RoutingDelegate.java
deleted file mode 100644
index 2359813..0000000
--- a/apex/media/framework/java/android/media/RoutingDelegate.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.os.Handler;
-
-class RoutingDelegate implements AudioRouting.OnRoutingChangedListener {
- private AudioRouting mAudioRouting;
- private AudioRouting.OnRoutingChangedListener mOnRoutingChangedListener;
- private Handler mHandler;
-
- RoutingDelegate(final AudioRouting audioRouting,
- final AudioRouting.OnRoutingChangedListener listener,
- Handler handler) {
- mAudioRouting = audioRouting;
- mOnRoutingChangedListener = listener;
- mHandler = handler;
- }
-
- public AudioRouting.OnRoutingChangedListener getListener() {
- return mOnRoutingChangedListener;
- }
-
- public Handler getHandler() {
- return mHandler;
- }
-
- @Override
- public void onRoutingChanged(AudioRouting router) {
- if (mOnRoutingChangedListener != null) {
- mOnRoutingChangedListener.onRoutingChanged(mAudioRouting);
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/Session2Command.java b/apex/media/framework/java/android/media/Session2Command.java
deleted file mode 100644
index 7e71591..0000000
--- a/apex/media/framework/java/android/media/Session2Command.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.util.Objects;
-
-/**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Define a command that a {@link MediaController2} can send to a {@link MediaSession2}.
- * <p>
- * If {@link #getCommandCode()} isn't {@link #COMMAND_CODE_CUSTOM}), it's predefined command.
- * If {@link #getCommandCode()} is {@link #COMMAND_CODE_CUSTOM}), it's custom command and
- * {@link #getCustomAction()} shouldn't be {@code null}.
- * <p>
- * Refer to the <a href="{@docRoot}reference/androidx/media2/session/SessionCommand.html">
- * AndroidX SessionCommand</a> class for the list of valid commands.
- */
-public final class Session2Command implements Parcelable {
- /**
- * Command code for the custom command which can be defined by string action in the
- * {@link Session2Command}.
- */
- public static final int COMMAND_CODE_CUSTOM = 0;
-
- public static final @android.annotation.NonNull Parcelable.Creator<Session2Command> CREATOR =
- new Parcelable.Creator<Session2Command>() {
- @Override
- public Session2Command createFromParcel(Parcel in) {
- return new Session2Command(in);
- }
-
- @Override
- public Session2Command[] newArray(int size) {
- return new Session2Command[size];
- }
- };
-
- private final int mCommandCode;
- // Nonnull if it's custom command
- private final String mCustomAction;
- private final Bundle mCustomExtras;
-
- /**
- * Constructor for creating a command predefined in AndroidX media2.
- *
- * @param commandCode A command code for a command predefined in AndroidX media2.
- */
- public Session2Command(int commandCode) {
- if (commandCode == COMMAND_CODE_CUSTOM) {
- throw new IllegalArgumentException("commandCode shouldn't be COMMAND_CODE_CUSTOM");
- }
- mCommandCode = commandCode;
- mCustomAction = null;
- mCustomExtras = null;
- }
-
- /**
- * Constructor for creating a custom command.
- *
- * @param action The action of this custom command.
- * @param extras An extra bundle for this custom command.
- */
- public Session2Command(@NonNull String action, @Nullable Bundle extras) {
- if (action == null) {
- throw new IllegalArgumentException("action shouldn't be null");
- }
- mCommandCode = COMMAND_CODE_CUSTOM;
- mCustomAction = action;
- mCustomExtras = extras;
- }
-
- /**
- * Used by parcelable creator.
- */
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- Session2Command(Parcel in) {
- mCommandCode = in.readInt();
- mCustomAction = in.readString();
- mCustomExtras = in.readBundle();
- }
-
- /**
- * Gets the command code of a predefined command.
- * This will return {@link #COMMAND_CODE_CUSTOM} for a custom command.
- */
- public int getCommandCode() {
- return mCommandCode;
- }
-
- /**
- * Gets the action of a custom command.
- * This will return {@code null} for a predefined command.
- */
- @Nullable
- public String getCustomAction() {
- return mCustomAction;
- }
-
- /**
- * Gets the extra bundle of a custom command.
- * This will return {@code null} for a predefined command.
- */
- @Nullable
- public Bundle getCustomExtras() {
- return mCustomExtras;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel dest, int flags) {
- if (dest == null) {
- throw new IllegalArgumentException("parcel shouldn't be null");
- }
- dest.writeInt(mCommandCode);
- dest.writeString(mCustomAction);
- dest.writeBundle(mCustomExtras);
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (!(obj instanceof Session2Command)) {
- return false;
- }
- Session2Command other = (Session2Command) obj;
- return mCommandCode == other.mCommandCode
- && TextUtils.equals(mCustomAction, other.mCustomAction);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mCustomAction, mCommandCode);
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Contains the result of {@link Session2Command}.
- */
- public static final class Result {
- private final int mResultCode;
- private final Bundle mResultData;
-
- /**
- * Result code representing that the command is skipped or canceled. For an example, a seek
- * command can be skipped if it is followed by another seek command.
- */
- public static final int RESULT_INFO_SKIPPED = 1;
-
- /**
- * Result code representing that the command is successfully completed.
- */
- public static final int RESULT_SUCCESS = 0;
-
- /**
- * Result code represents that call is ended with an unknown error.
- */
- public static final int RESULT_ERROR_UNKNOWN_ERROR = -1;
-
- /**
- * Constructor of {@link Result}.
- *
- * @param resultCode result code
- * @param resultData result data
- */
- public Result(int resultCode, @Nullable Bundle resultData) {
- mResultCode = resultCode;
- mResultData = resultData;
- }
-
- /**
- * Returns the result code.
- */
- public int getResultCode() {
- return mResultCode;
- }
-
- /**
- * Returns the result data.
- */
- @Nullable
- public Bundle getResultData() {
- return mResultData;
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/Session2CommandGroup.java b/apex/media/framework/java/android/media/Session2CommandGroup.java
deleted file mode 100644
index af8184a..0000000
--- a/apex/media/framework/java/android/media/Session2CommandGroup.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import static android.media.Session2Command.COMMAND_CODE_CUSTOM;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * A set of {@link Session2Command} which represents a command group.
- */
-public final class Session2CommandGroup implements Parcelable {
- private static final String TAG = "Session2CommandGroup";
-
- public static final @android.annotation.NonNull Parcelable.Creator<Session2CommandGroup>
- CREATOR = new Parcelable.Creator<Session2CommandGroup>() {
- @Override
- public Session2CommandGroup createFromParcel(Parcel in) {
- return new Session2CommandGroup(in);
- }
-
- @Override
- public Session2CommandGroup[] newArray(int size) {
- return new Session2CommandGroup[size];
- }
- };
-
- Set<Session2Command> mCommands = new HashSet<>();
-
- /**
- * Creates a new Session2CommandGroup with commands copied from another object.
- *
- * @param commands The collection of commands to copy.
- */
- @SuppressWarnings("WeakerAccess") /* synthetic access */
- Session2CommandGroup(@Nullable Collection<Session2Command> commands) {
- if (commands != null) {
- mCommands.addAll(commands);
- }
- }
-
- /**
- * Used by parcelable creator.
- */
- @SuppressWarnings({"WeakerAccess", "UnsafeParcelApi"}) /* synthetic access */
- Session2CommandGroup(Parcel in) {
- Parcelable[] commands = in.readParcelableArray(Session2Command.class.getClassLoader());
- if (commands != null) {
- for (Parcelable command : commands) {
- mCommands.add((Session2Command) command);
- }
- }
- }
-
- /**
- * Checks whether this command group has a command that matches given {@code command}.
- *
- * @param command A command to find. Shouldn't be {@code null}.
- */
- public boolean hasCommand(@NonNull Session2Command command) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- return mCommands.contains(command);
- }
-
- /**
- * Checks whether this command group has a command that matches given {@code commandCode}.
- *
- * @param commandCode A command code to find.
- * Shouldn't be {@link Session2Command#COMMAND_CODE_CUSTOM}.
- */
- public boolean hasCommand(int commandCode) {
- if (commandCode == COMMAND_CODE_CUSTOM) {
- throw new IllegalArgumentException("Use hasCommand(Command) for custom command");
- }
- for (Session2Command command : mCommands) {
- if (command.getCommandCode() == commandCode) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Gets all commands of this command group.
- */
- @NonNull
- public Set<Session2Command> getCommands() {
- return new HashSet<>(mCommands);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel dest, int flags) {
- if (dest == null) {
- throw new IllegalArgumentException("parcel shouldn't be null");
- }
- dest.writeParcelableArray(mCommands.toArray(new Session2Command[0]), 0);
- }
-
- /**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Builds a {@link Session2CommandGroup} object.
- */
- public static final class Builder {
- private Set<Session2Command> mCommands;
-
- public Builder() {
- mCommands = new HashSet<>();
- }
-
- /**
- * Creates a new builder for {@link Session2CommandGroup} with commands copied from another
- * {@link Session2CommandGroup} object.
- * @param commandGroup
- */
- public Builder(@NonNull Session2CommandGroup commandGroup) {
- if (commandGroup == null) {
- throw new IllegalArgumentException("command group shouldn't be null");
- }
- mCommands = commandGroup.getCommands();
- }
-
- /**
- * Adds a command to this command group.
- *
- * @param command A command to add. Shouldn't be {@code null}.
- */
- @NonNull
- public Builder addCommand(@NonNull Session2Command command) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- mCommands.add(command);
- return this;
- }
-
- /**
- * Removes a command from this group which matches given {@code command}.
- *
- * @param command A command to find. Shouldn't be {@code null}.
- */
- @NonNull
- public Builder removeCommand(@NonNull Session2Command command) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- mCommands.remove(command);
- return this;
- }
-
- /**
- * Builds {@link Session2CommandGroup}.
- *
- * @return a new {@link Session2CommandGroup}.
- */
- @NonNull
- public Session2CommandGroup build() {
- return new Session2CommandGroup(mCommands);
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/Session2Link.java b/apex/media/framework/java/android/media/Session2Link.java
deleted file mode 100644
index 6e550e8..0000000
--- a/apex/media/framework/java/android/media/Session2Link.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.NonNull;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.util.Log;
-
-import java.util.Objects;
-
-/**
- * Handles incoming commands from {@link MediaController2} to {@link MediaSession2}.
- * @hide
- */
-// @SystemApi
-public final class Session2Link implements Parcelable {
- private static final String TAG = "Session2Link";
- private static final boolean DEBUG = MediaSession2.DEBUG;
-
- public static final @android.annotation.NonNull Parcelable.Creator<Session2Link> CREATOR =
- new Parcelable.Creator<Session2Link>() {
- @Override
- public Session2Link createFromParcel(Parcel in) {
- return new Session2Link(in);
- }
-
- @Override
- public Session2Link[] newArray(int size) {
- return new Session2Link[size];
- }
- };
-
- private final MediaSession2 mSession;
- private final IMediaSession2 mISession;
-
- public Session2Link(MediaSession2 session) {
- mSession = session;
- mISession = new Session2Stub();
- }
-
- Session2Link(Parcel in) {
- mSession = null;
- mISession = IMediaSession2.Stub.asInterface(in.readStrongBinder());
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeStrongBinder(mISession.asBinder());
- }
-
- @Override
- public int hashCode() {
- return mISession.asBinder().hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Session2Link)) {
- return false;
- }
- Session2Link other = (Session2Link) obj;
- return Objects.equals(mISession.asBinder(), other.mISession.asBinder());
- }
-
- /** Link to death with mISession */
- public void linkToDeath(@NonNull IBinder.DeathRecipient recipient, int flags) {
- if (mISession != null) {
- try {
- mISession.asBinder().linkToDeath(recipient, flags);
- } catch (RemoteException e) {
- if (DEBUG) {
- Log.d(TAG, "Session died too early.", e);
- }
- }
- }
- }
-
- /** Unlink to death with mISession */
- public boolean unlinkToDeath(@NonNull IBinder.DeathRecipient recipient, int flags) {
- if (mISession != null) {
- return mISession.asBinder().unlinkToDeath(recipient, flags);
- }
- return true;
- }
-
- /** Interface method for IMediaSession2.connect */
- public void connect(final Controller2Link caller, int seq, Bundle connectionRequest) {
- try {
- mISession.connect(caller, seq, connectionRequest);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Interface method for IMediaSession2.disconnect */
- public void disconnect(final Controller2Link caller, int seq) {
- try {
- mISession.disconnect(caller, seq);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Interface method for IMediaSession2.sendSessionCommand */
- public void sendSessionCommand(final Controller2Link caller, final int seq,
- final Session2Command command, final Bundle args, ResultReceiver resultReceiver) {
- try {
- mISession.sendSessionCommand(caller, seq, command, args, resultReceiver);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Interface method for IMediaSession2.sendSessionCommand */
- public void cancelSessionCommand(final Controller2Link caller, final int seq) {
- try {
- mISession.cancelSessionCommand(caller, seq);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- /** Stub implementation for IMediaSession2.connect */
- public void onConnect(final Controller2Link caller, int pid, int uid, int seq,
- Bundle connectionRequest) {
- mSession.onConnect(caller, pid, uid, seq, connectionRequest);
- }
-
- /** Stub implementation for IMediaSession2.disconnect */
- public void onDisconnect(final Controller2Link caller, int seq) {
- mSession.onDisconnect(caller, seq);
- }
-
- /** Stub implementation for IMediaSession2.sendSessionCommand */
- public void onSessionCommand(final Controller2Link caller, final int seq,
- final Session2Command command, final Bundle args, ResultReceiver resultReceiver) {
- mSession.onSessionCommand(caller, seq, command, args, resultReceiver);
- }
-
- /** Stub implementation for IMediaSession2.cancelSessionCommand */
- public void onCancelCommand(final Controller2Link caller, final int seq) {
- mSession.onCancelCommand(caller, seq);
- }
-
- private class Session2Stub extends IMediaSession2.Stub {
- @Override
- public void connect(final Controller2Link caller, int seq, Bundle connectionRequest) {
- if (caller == null || connectionRequest == null) {
- return;
- }
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- Session2Link.this.onConnect(caller, pid, uid, seq, connectionRequest);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void disconnect(final Controller2Link caller, int seq) {
- if (caller == null) {
- return;
- }
- final long token = Binder.clearCallingIdentity();
- try {
- Session2Link.this.onDisconnect(caller, seq);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void sendSessionCommand(final Controller2Link caller, final int seq,
- final Session2Command command, final Bundle args, ResultReceiver resultReceiver) {
- if (caller == null) {
- return;
- }
- final long token = Binder.clearCallingIdentity();
- try {
- Session2Link.this.onSessionCommand(caller, seq, command, args, resultReceiver);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void cancelSessionCommand(final Controller2Link caller, final int seq) {
- if (caller == null) {
- return;
- }
- final long token = Binder.clearCallingIdentity();
- try {
- Session2Link.this.onCancelCommand(caller, seq);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
- }
-}
diff --git a/apex/media/framework/java/android/media/Session2Token.java b/apex/media/framework/java/android/media/Session2Token.java
deleted file mode 100644
index aae2e1b..0000000
--- a/apex/media/framework/java/android/media/Session2Token.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session
- * Library</a> for consistent behavior across all devices.
- * <p>
- * Represents an ongoing {@link MediaSession2} or a {@link MediaSession2Service}.
- * If it's representing a session service, it may not be ongoing.
- * <p>
- * This may be passed to apps by the session owner to allow them to create a
- * {@link MediaController2} to communicate with the session.
- * <p>
- * It can be also obtained by {@link android.media.session.MediaSessionManager}.
- */
-public final class Session2Token implements Parcelable {
- private static final String TAG = "Session2Token";
-
- public static final @android.annotation.NonNull Creator<Session2Token> CREATOR =
- new Creator<Session2Token>() {
- @Override
- public Session2Token createFromParcel(Parcel p) {
- return new Session2Token(p);
- }
-
- @Override
- public Session2Token[] newArray(int size) {
- return new Session2Token[size];
- }
- };
-
- /**
- * @hide
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = "TYPE_", value = {TYPE_SESSION, TYPE_SESSION_SERVICE})
- public @interface TokenType {
- }
-
- /**
- * Type for {@link MediaSession2}.
- */
- public static final int TYPE_SESSION = 0;
-
- /**
- * Type for {@link MediaSession2Service}.
- */
- public static final int TYPE_SESSION_SERVICE = 1;
-
- private final int mUid;
- @TokenType
- private final int mType;
- private final String mPackageName;
- private final String mServiceName;
- private final Session2Link mSessionLink;
- private final ComponentName mComponentName;
- private final Bundle mExtras;
-
- /**
- * Constructor for the token with type {@link #TYPE_SESSION_SERVICE}.
- *
- * @param context The context.
- * @param serviceComponent The component name of the service.
- */
- public Session2Token(@NonNull Context context, @NonNull ComponentName serviceComponent) {
- if (context == null) {
- throw new IllegalArgumentException("context shouldn't be null");
- }
- if (serviceComponent == null) {
- throw new IllegalArgumentException("serviceComponent shouldn't be null");
- }
-
- final PackageManager manager = context.getPackageManager();
- final int uid = getUid(manager, serviceComponent.getPackageName());
-
- if (!isInterfaceDeclared(manager, MediaSession2Service.SERVICE_INTERFACE,
- serviceComponent)) {
- Log.w(TAG, serviceComponent + " doesn't implement MediaSession2Service.");
- }
- mComponentName = serviceComponent;
- mPackageName = serviceComponent.getPackageName();
- mServiceName = serviceComponent.getClassName();
- mUid = uid;
- mType = TYPE_SESSION_SERVICE;
- mSessionLink = null;
- mExtras = Bundle.EMPTY;
- }
-
- Session2Token(int uid, int type, String packageName, Session2Link sessionLink,
- @NonNull Bundle tokenExtras) {
- mUid = uid;
- mType = type;
- mPackageName = packageName;
- mServiceName = null;
- mComponentName = null;
- mSessionLink = sessionLink;
- mExtras = tokenExtras;
- }
-
- Session2Token(Parcel in) {
- mUid = in.readInt();
- mType = in.readInt();
- mPackageName = in.readString();
- mServiceName = in.readString();
- mSessionLink = in.readParcelable(null);
- mComponentName = ComponentName.unflattenFromString(in.readString());
-
- Bundle extras = in.readBundle();
- if (extras == null) {
- Log.w(TAG, "extras shouldn't be null.");
- extras = Bundle.EMPTY;
- } else if (MediaSession2.hasCustomParcelable(extras)) {
- Log.w(TAG, "extras contain custom parcelable. Ignoring.");
- extras = Bundle.EMPTY;
- }
- mExtras = extras;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mUid);
- dest.writeInt(mType);
- dest.writeString(mPackageName);
- dest.writeString(mServiceName);
- dest.writeParcelable(mSessionLink, flags);
- dest.writeString(mComponentName == null ? "" : mComponentName.flattenToString());
- dest.writeBundle(mExtras);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mType, mUid, mPackageName, mServiceName, mSessionLink);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Session2Token)) {
- return false;
- }
- Session2Token other = (Session2Token) obj;
- return mUid == other.mUid
- && TextUtils.equals(mPackageName, other.mPackageName)
- && TextUtils.equals(mServiceName, other.mServiceName)
- && mType == other.mType
- && Objects.equals(mSessionLink, other.mSessionLink);
- }
-
- @Override
- public String toString() {
- return "Session2Token {pkg=" + mPackageName + " type=" + mType
- + " service=" + mServiceName + " Session2Link=" + mSessionLink + "}";
- }
-
- /**
- * @return uid of the session
- */
- public int getUid() {
- return mUid;
- }
-
- /**
- * @return package name of the session
- */
- @NonNull
- public String getPackageName() {
- return mPackageName;
- }
-
- /**
- * @return service name of the session. Can be {@code null} for {@link #TYPE_SESSION}.
- */
- @Nullable
- public String getServiceName() {
- return mServiceName;
- }
-
- /**
- * @return type of the token
- * @see #TYPE_SESSION
- * @see #TYPE_SESSION_SERVICE
- */
- public @TokenType int getType() {
- return mType;
- }
-
- /**
- * @return extras of the token
- * @see MediaSession2.Builder#setExtras(Bundle)
- */
- @NonNull
- public Bundle getExtras() {
- return new Bundle(mExtras);
- }
-
- Session2Link getSessionLink() {
- return mSessionLink;
- }
-
- private static boolean isInterfaceDeclared(PackageManager manager, String serviceInterface,
- ComponentName serviceComponent) {
- Intent serviceIntent = new Intent(serviceInterface);
- // Use queryIntentServices to find services with MediaSession2Service.SERVICE_INTERFACE.
- // We cannot use resolveService with intent specified class name, because resolveService
- // ignores actions if Intent.setClassName() is specified.
- serviceIntent.setPackage(serviceComponent.getPackageName());
-
- List<ResolveInfo> list = manager.queryIntentServices(
- serviceIntent, PackageManager.GET_META_DATA);
- if (list != null) {
- for (int i = 0; i < list.size(); i++) {
- ResolveInfo resolveInfo = list.get(i);
- if (resolveInfo == null || resolveInfo.serviceInfo == null) {
- continue;
- }
- if (TextUtils.equals(
- resolveInfo.serviceInfo.name, serviceComponent.getClassName())) {
- return true;
- }
- }
- }
- return false;
- }
-
- private static int getUid(PackageManager manager, String packageName) {
- try {
- return manager.getApplicationInfo(packageName, 0).uid;
- } catch (PackageManager.NameNotFoundException e) {
- throw new IllegalArgumentException("Cannot find package " + packageName);
- }
- }
-}
diff --git a/apex/media/framework/jni/android_media_MediaParserJNI.cpp b/apex/media/framework/jni/android_media_MediaParserJNI.cpp
deleted file mode 100644
index c81152c..0000000
--- a/apex/media/framework/jni/android_media_MediaParserJNI.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2020, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <jni.h>
-#include <media/MediaMetrics.h>
-
-#define JNI_FUNCTION(RETURN_TYPE, NAME, ...) \
- extern "C" { \
- JNIEXPORT RETURN_TYPE Java_android_media_MediaParser_##NAME(JNIEnv* env, jobject thiz, \
- ##__VA_ARGS__); \
- } \
- JNIEXPORT RETURN_TYPE Java_android_media_MediaParser_##NAME(JNIEnv* env, jobject thiz, \
- ##__VA_ARGS__)
-
-namespace {
-
-constexpr char kMediaMetricsKey[] = "mediaparser";
-
-constexpr char kAttributeLogSessionId[] = "android.media.mediaparser.logSessionId";
-constexpr char kAttributeParserName[] = "android.media.mediaparser.parserName";
-constexpr char kAttributeCreatedByName[] = "android.media.mediaparser.createdByName";
-constexpr char kAttributeParserPool[] = "android.media.mediaparser.parserPool";
-constexpr char kAttributeLastException[] = "android.media.mediaparser.lastException";
-constexpr char kAttributeResourceByteCount[] = "android.media.mediaparser.resourceByteCount";
-constexpr char kAttributeDurationMillis[] = "android.media.mediaparser.durationMillis";
-constexpr char kAttributeTrackMimeTypes[] = "android.media.mediaparser.trackMimeTypes";
-constexpr char kAttributeTrackCodecs[] = "android.media.mediaparser.trackCodecs";
-constexpr char kAttributeAlteredParameters[] = "android.media.mediaparser.alteredParameters";
-constexpr char kAttributeVideoWidth[] = "android.media.mediaparser.videoWidth";
-constexpr char kAttributeVideoHeight[] = "android.media.mediaparser.videoHeight";
-
-// Util class to handle string resource management.
-class JstringHandle {
-public:
- JstringHandle(JNIEnv* env, jstring value) : mEnv(env), mJstringValue(value) {
- mCstringValue = env->GetStringUTFChars(value, /* isCopy= */ nullptr);
- }
-
- ~JstringHandle() {
- if (mCstringValue != nullptr) {
- mEnv->ReleaseStringUTFChars(mJstringValue, mCstringValue);
- }
- }
-
- [[nodiscard]] const char* value() const {
- return mCstringValue != nullptr ? mCstringValue : "";
- }
-
- JNIEnv* mEnv;
- jstring mJstringValue;
- const char* mCstringValue;
-};
-
-} // namespace
-
-JNI_FUNCTION(void, nativeSubmitMetrics, jstring logSessionIdJstring, jstring parserNameJstring,
- jboolean createdByName, jstring parserPoolJstring, jstring lastExceptionJstring,
- jlong resourceByteCount, jlong durationMillis, jstring trackMimeTypesJstring,
- jstring trackCodecsJstring, jstring alteredParameters, jint videoWidth,
- jint videoHeight) {
- mediametrics_handle_t item(mediametrics_create(kMediaMetricsKey));
- mediametrics_setCString(item, kAttributeLogSessionId,
- JstringHandle(env, logSessionIdJstring).value());
- mediametrics_setCString(item, kAttributeParserName,
- JstringHandle(env, parserNameJstring).value());
- mediametrics_setInt32(item, kAttributeCreatedByName, createdByName ? 1 : 0);
- mediametrics_setCString(item, kAttributeParserPool,
- JstringHandle(env, parserPoolJstring).value());
- mediametrics_setCString(item, kAttributeLastException,
- JstringHandle(env, lastExceptionJstring).value());
- mediametrics_setInt64(item, kAttributeResourceByteCount, resourceByteCount);
- mediametrics_setInt64(item, kAttributeDurationMillis, durationMillis);
- mediametrics_setCString(item, kAttributeTrackMimeTypes,
- JstringHandle(env, trackMimeTypesJstring).value());
- mediametrics_setCString(item, kAttributeTrackCodecs,
- JstringHandle(env, trackCodecsJstring).value());
- mediametrics_setCString(item, kAttributeAlteredParameters,
- JstringHandle(env, alteredParameters).value());
- mediametrics_setInt32(item, kAttributeVideoWidth, videoWidth);
- mediametrics_setInt32(item, kAttributeVideoHeight, videoHeight);
- mediametrics_selfRecord(item);
- mediametrics_delete(item);
-}
diff --git a/apex/media/framework/lint-baseline.xml b/apex/media/framework/lint-baseline.xml
deleted file mode 100644
index 95eea45..0000000
--- a/apex/media/framework/lint-baseline.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="" dependencies="true" name="" variant="all" version="7.2.0-dev">
-
- <issue
- id="DefaultLocale"
- message="Implicitly using the default locale is a common source of bugs: Use `toLowerCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`."
- errorLine1=" if (mSupportedVideoMimeTypes.contains(videoMime.toLowerCase())) {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java"
- line="121"
- column="57"/>
- </issue>
-
- <issue
- id="DefaultLocale"
- message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"
- errorLine1=" return String.format(" session: {id: %d, status: %s, result: %s, progress: %d}","
- errorLine2=" ^">
- <location
- file="frameworks/base/apex/media/framework/java/android/media/MediaTranscodingManager.java"
- line="1651"
- column="20"/>
- </issue>
-
- <issue
- id="ParcelClassLoader"
- message="Passing null here (to use the default class loader) will not work if you are restoring your own classes. Consider using for example `getClass().getClassLoader()` instead."
- errorLine1=" Bundle out = parcel.readBundle(null);"
- errorLine2=" ~~~~~~~~~~~~~~~~">
- <location
- file="frameworks/base/apex/media/framework/java/android/media/MediaSession2.java"
- line="303"
- column="33"/>
- </issue>
-
- <issue
- id="ParcelClassLoader"
- message="Using the default class loader will not work if you are restoring your own classes. Consider using for example `readBundle(getClass().getClassLoader())` instead."
- errorLine1=" mCustomExtras = in.readBundle();"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="frameworks/base/apex/media/framework/java/android/media/Session2Command.java"
- line="104"
- column="28"/>
- </issue>
-
- <issue
- id="ParcelClassLoader"
- message="Passing null here (to use the default class loader) will not work if you are restoring your own classes. Consider using for example `getClass().getClassLoader()` instead."
- errorLine1=" mSessionLink = in.readParcelable(null);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="frameworks/base/apex/media/framework/java/android/media/Session2Token.java"
- line="141"
- column="27"/>
- </issue>
-
- <issue
- id="ParcelClassLoader"
- message="Using the default class loader will not work if you are restoring your own classes. Consider using for example `readBundle(getClass().getClassLoader())` instead."
- errorLine1=" Bundle extras = in.readBundle();"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="frameworks/base/apex/media/framework/java/android/media/Session2Token.java"
- line="144"
- column="28"/>
- </issue>
-
-</issues>
diff --git a/apex/media/framework/updatable-media-proguard.flags b/apex/media/framework/updatable-media-proguard.flags
deleted file mode 100644
index 4e7d842..0000000
--- a/apex/media/framework/updatable-media-proguard.flags
+++ /dev/null
@@ -1,2 +0,0 @@
-# Keep all symbols in android.media.
--keep class android.media.* {*;}
diff --git a/apex/media/service/Android.bp b/apex/media/service/Android.bp
deleted file mode 100644
index 834e5cb..0000000
--- a/apex/media/service/Android.bp
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2020 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-filegroup {
- name: "service-media-s-sources",
- srcs: [
- "java/**/*.java",
- ],
- path: "java",
- visibility: ["//visibility:private"],
-}
-
-java_sdk_library {
- name: "service-media-s",
- permitted_packages: [
- "com.android.server.media",
- ],
- defaults: ["framework-system-server-module-defaults"],
- srcs: [
- ":service-media-s-sources",
- ],
- libs: [
- "androidx.annotation_annotation",
- "updatable-media",
- "modules-annotation-minsdk",
- "modules-utils-build",
- ],
- jarjar_rules: "jarjar_rules.txt",
- sdk_version: "system_server_current",
- min_sdk_version: "29", // TODO: We may need to bump this at some point.
- lint: {
- strict_updatability_linting: true,
- },
- apex_available: [
- "com.android.media",
- ],
-}
diff --git a/apex/media/service/api/current.txt b/apex/media/service/api/current.txt
deleted file mode 100644
index d802177..0000000
--- a/apex/media/service/api/current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/apex/media/service/api/removed.txt b/apex/media/service/api/removed.txt
deleted file mode 100644
index d802177..0000000
--- a/apex/media/service/api/removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/apex/media/service/api/system-server-current.txt b/apex/media/service/api/system-server-current.txt
deleted file mode 100644
index d802177..0000000
--- a/apex/media/service/api/system-server-current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/apex/media/service/api/system-server-removed.txt b/apex/media/service/api/system-server-removed.txt
deleted file mode 100644
index d802177..0000000
--- a/apex/media/service/api/system-server-removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/apex/media/service/jarjar_rules.txt b/apex/media/service/jarjar_rules.txt
deleted file mode 100644
index 7e37c2b..0000000
--- a/apex/media/service/jarjar_rules.txt
+++ /dev/null
@@ -1 +0,0 @@
-rule com.android.modules.** android.media.internal.@1
diff --git a/apex/media/service/java/com/android/server/media/MediaCommunicationService.java b/apex/media/service/java/com/android/server/media/MediaCommunicationService.java
deleted file mode 100644
index 4223fa6..0000000
--- a/apex/media/service/java/com/android/server/media/MediaCommunicationService.java
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.server.media;
-
-import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
-import static android.os.UserHandle.ALL;
-import static android.os.UserHandle.getUserHandleForUid;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.media.IMediaCommunicationService;
-import android.media.IMediaCommunicationServiceCallback;
-import android.media.MediaController2;
-import android.media.MediaParceledListSlice;
-import android.media.Session2CommandGroup;
-import android.media.Session2Token;
-import android.media.session.MediaSessionManager;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.SparseIntArray;
-import android.view.KeyEvent;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.modules.annotation.MinSdk;
-import com.android.server.SystemService;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-
-/**
- * A system service that manages {@link android.media.MediaSession2} creations
- * and their ongoing media playback state.
- * @hide
- */
-@MinSdk(Build.VERSION_CODES.S)
-@RequiresApi(Build.VERSION_CODES.S)
-public class MediaCommunicationService extends SystemService {
- private static final String TAG = "MediaCommunicationSrv";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- final Context mContext;
-
- final Object mLock = new Object();
- final Handler mHandler = new Handler(Looper.getMainLooper());
-
- @GuardedBy("mLock")
- private final SparseIntArray mFullUserIds = new SparseIntArray();
- @GuardedBy("mLock")
- private final SparseArray<FullUserRecord> mUserRecords = new SparseArray<>();
-
- final Executor mRecordExecutor = Executors.newSingleThreadExecutor();
- @GuardedBy("mLock")
- final ArrayList<CallbackRecord> mCallbackRecords = new ArrayList<>();
- final NotificationManager mNotificationManager;
- MediaSessionManager mSessionManager;
-
- public MediaCommunicationService(Context context) {
- super(context);
- mContext = context;
- mNotificationManager = context.getSystemService(NotificationManager.class);
- }
-
- @Override
- public void onStart() {
- publishBinderService(Context.MEDIA_COMMUNICATION_SERVICE, new Stub());
- updateUser();
- }
-
- @Override
- public void onBootPhase(int phase) {
- super.onBootPhase(phase);
- switch (phase) {
- // This ensures MediaSessionService is started
- case PHASE_BOOT_COMPLETED:
- mSessionManager = mContext.getSystemService(MediaSessionManager.class);
- break;
- }
- }
-
- @Override
- public void onUserStarting(@NonNull TargetUser user) {
- if (DEBUG) Log.d(TAG, "onUserStarting: " + user);
- updateUser();
- }
-
- @Override
- public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
- if (DEBUG) Log.d(TAG, "onUserSwitching: " + to);
- updateUser();
- }
-
- @Override
- public void onUserStopped(@NonNull TargetUser targetUser) {
- int userId = targetUser.getUserHandle().getIdentifier();
-
- if (DEBUG) Log.d(TAG, "onUserStopped: " + userId);
- synchronized (mLock) {
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user != null) {
- if (user.getFullUserId() == userId) {
- user.destroyAllSessions();
- mUserRecords.remove(userId);
- } else {
- user.destroySessionsForUser(userId);
- }
- }
- }
- updateUser();
- }
-
- @Nullable
- CallbackRecord findCallbackRecordLocked(@Nullable IMediaCommunicationServiceCallback callback) {
- if (callback == null) {
- return null;
- }
- for (CallbackRecord record : mCallbackRecords) {
- if (Objects.equals(callback.asBinder(), record.mCallback.asBinder())) {
- return record;
- }
- }
- return null;
- }
-
- ArrayList<Session2Token> getSession2TokensLocked(int userId) {
- ArrayList<Session2Token> list = new ArrayList<>();
- if (userId == ALL.getIdentifier()) {
- int size = mUserRecords.size();
- for (int i = 0; i < size; i++) {
- list.addAll(mUserRecords.valueAt(i).getAllSession2Tokens());
- }
- } else {
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user != null) {
- list.addAll(user.getSession2Tokens(userId));
- }
- }
- return list;
- }
-
- private FullUserRecord getFullUserRecordLocked(int userId) {
- int fullUserId = mFullUserIds.get(userId, -1);
- if (fullUserId < 0) {
- return null;
- }
- return mUserRecords.get(fullUserId);
- }
-
- private boolean hasMediaControlPermission(int pid, int uid) {
- // Check if it's system server or has MEDIA_CONTENT_CONTROL.
- // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra
- // check here.
- if (uid == Process.SYSTEM_UID || mContext.checkPermission(
- android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid)
- == PackageManager.PERMISSION_GRANTED) {
- return true;
- } else if (DEBUG) {
- Log.d(TAG, "uid(" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL");
- }
- return false;
- }
-
- private void updateUser() {
- UserManager manager = mContext.getSystemService(UserManager.class);
- List<UserHandle> allUsers = manager.getUserHandles(/*excludeDying=*/false);
-
- synchronized (mLock) {
- mFullUserIds.clear();
- if (allUsers != null) {
- for (UserHandle user : allUsers) {
- UserHandle parent = manager.getProfileParent(user);
- if (parent != null) {
- mFullUserIds.put(user.getIdentifier(), parent.getIdentifier());
- } else {
- mFullUserIds.put(user.getIdentifier(), user.getIdentifier());
- if (mUserRecords.get(user.getIdentifier()) == null) {
- mUserRecords.put(user.getIdentifier(),
- new FullUserRecord(user.getIdentifier()));
- }
- }
- }
- }
- // Ensure that the current full user exists.
- int currentFullUserId = ActivityManager.getCurrentUser();
- FullUserRecord currentFullUserRecord = mUserRecords.get(currentFullUserId);
- if (currentFullUserRecord == null) {
- Log.w(TAG, "Cannot find FullUserInfo for the current user " + currentFullUserId);
- currentFullUserRecord = new FullUserRecord(currentFullUserId);
- mUserRecords.put(currentFullUserId, currentFullUserRecord);
- }
- mFullUserIds.put(currentFullUserId, currentFullUserId);
- }
- }
-
- void dispatchSession2Created(Session2Token token) {
- synchronized (mLock) {
- for (CallbackRecord record : mCallbackRecords) {
- if (record.mUserId != ALL.getIdentifier()
- && record.mUserId != getUserHandleForUid(token.getUid()).getIdentifier()) {
- continue;
- }
- try {
- record.mCallback.onSession2Created(token);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to notify session2 token created " + record);
- }
- }
- }
- }
-
- void dispatchSession2Changed(int userId) {
- ArrayList<Session2Token> allSession2Tokens;
- ArrayList<Session2Token> userSession2Tokens;
-
- synchronized (mLock) {
- allSession2Tokens = getSession2TokensLocked(ALL.getIdentifier());
- userSession2Tokens = getSession2TokensLocked(userId);
-
- for (CallbackRecord record : mCallbackRecords) {
- if (record.mUserId == ALL.getIdentifier()) {
- try {
- MediaParceledListSlice<Session2Token> toSend =
- new MediaParceledListSlice<>(allSession2Tokens);
- toSend.setInlineCountLimit(0);
- record.mCallback.onSession2Changed(toSend);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to notify session2 tokens changed " + record);
- }
- } else if (record.mUserId == userId) {
- try {
- MediaParceledListSlice<Session2Token> toSend =
- new MediaParceledListSlice<>(userSession2Tokens);
- toSend.setInlineCountLimit(0);
- record.mCallback.onSession2Changed(toSend);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to notify session2 tokens changed " + record);
- }
- }
- }
- }
- }
-
- void onSessionDied(Session2Record session) {
- if (DEBUG) {
- Log.d(TAG, "Destroying " + session);
- }
- if (session.isClosed()) {
- Log.w(TAG, "Destroying already destroyed session. Ignoring.");
- return;
- }
-
- FullUserRecord user = session.getFullUser();
- if (user != null) {
- user.removeSession(session);
- }
- session.close();
- }
-
- void onSessionPlaybackStateChanged(Session2Record session, boolean promotePriority) {
- FullUserRecord user = session.getFullUser();
- if (user == null || !user.containsSession(session)) {
- Log.d(TAG, "Unknown session changed playback state. Ignoring.");
- return;
- }
- user.onPlaybackStateChanged(session, promotePriority);
- }
-
-
- static boolean isMediaSessionKey(int keyCode) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_MEDIA_PLAY:
- case KeyEvent.KEYCODE_MEDIA_PAUSE:
- case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
- case KeyEvent.KEYCODE_MUTE:
- case KeyEvent.KEYCODE_HEADSETHOOK:
- case KeyEvent.KEYCODE_MEDIA_STOP:
- case KeyEvent.KEYCODE_MEDIA_NEXT:
- case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
- case KeyEvent.KEYCODE_MEDIA_REWIND:
- case KeyEvent.KEYCODE_MEDIA_RECORD:
- case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
- return true;
- }
- return false;
- }
-
- private class Stub extends IMediaCommunicationService.Stub {
- @Override
- public void notifySession2Created(Session2Token sessionToken) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
-
- try {
- if (DEBUG) {
- Log.d(TAG, "Session2 is created " + sessionToken);
- }
- if (uid != sessionToken.getUid()) {
- throw new SecurityException("Unexpected Session2Token's UID, expected=" + uid
- + " but actually=" + sessionToken.getUid());
- }
- FullUserRecord user;
- int userId = getUserHandleForUid(sessionToken.getUid()).getIdentifier();
- synchronized (mLock) {
- user = getFullUserRecordLocked(userId);
- }
- if (user == null) {
- Log.w(TAG, "notifySession2Created: Ignore session of an unknown user");
- return;
- }
- user.addSession(new Session2Record(MediaCommunicationService.this,
- user, sessionToken, mRecordExecutor));
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- /**
- * Returns if the controller's package is trusted (i.e. has either MEDIA_CONTENT_CONTROL
- * permission or an enabled notification listener)
- *
- * @param controllerPackageName package name of the controller app
- * @param controllerPid pid of the controller app
- * @param controllerUid uid of the controller app
- */
- @Override
- public boolean isTrusted(String controllerPackageName, int controllerPid,
- int controllerUid) {
- final int uid = Binder.getCallingUid();
- final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
- final long token = Binder.clearCallingIdentity();
- try {
- // Don't perform check between controllerPackageName and controllerUid.
- // When an (activity|service) runs on the another apps process by specifying
- // android:process in the AndroidManifest.xml, then PID and UID would have the
- // running process' information instead of the (activity|service) that has created
- // MediaController.
- // Note that we can use Context#getOpPackageName() instead of
- // Context#getPackageName() for getting package name that matches with the PID/UID,
- // but it doesn't tell which package has created the MediaController, so useless.
- return hasMediaControlPermission(controllerPid, controllerUid)
- || hasEnabledNotificationListener(
- userId, controllerPackageName, controllerUid);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public MediaParceledListSlice getSession2Tokens(int userId) {
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
-
- try {
- // Check that they can make calls on behalf of the user and get the final user id
- int resolvedUserId = handleIncomingUser(pid, uid, userId, null);
- ArrayList<Session2Token> result;
- synchronized (mLock) {
- result = getSession2TokensLocked(resolvedUserId);
- }
- MediaParceledListSlice parceledListSlice = new MediaParceledListSlice<>(result);
- parceledListSlice.setInlineCountLimit(1);
- return parceledListSlice;
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void dispatchMediaKeyEvent(String packageName, KeyEvent keyEvent,
- boolean asSystemService) {
- if (keyEvent == null || !isMediaSessionKey(keyEvent.getKeyCode())) {
- Log.w(TAG, "Attempted to dispatch null or non-media key event.");
- return;
- }
-
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- //TODO: Dispatch key event to media session 2 if required
- mSessionManager.dispatchMediaKeyEvent(keyEvent, asSystemService);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void registerCallback(IMediaCommunicationServiceCallback callback,
- String packageName) throws RemoteException {
- Objects.requireNonNull(callback, "callback should not be null");
- Objects.requireNonNull(packageName, "packageName should not be null");
-
- synchronized (mLock) {
- if (findCallbackRecordLocked(callback) == null) {
-
- CallbackRecord record = new CallbackRecord(callback, packageName,
- Binder.getCallingUid(), Binder.getCallingPid());
- mCallbackRecords.add(record);
- try {
- callback.asBinder().linkToDeath(record, 0);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to register callback", e);
- mCallbackRecords.remove(record);
- }
- } else {
- Log.e(TAG, "registerCallback is called with already registered callback. "
- + "packageName=" + packageName);
- }
- }
- }
-
- @Override
- public void unregisterCallback(IMediaCommunicationServiceCallback callback)
- throws RemoteException {
- synchronized (mLock) {
- CallbackRecord existingRecord = findCallbackRecordLocked(callback);
- if (existingRecord != null) {
- mCallbackRecords.remove(existingRecord);
- callback.asBinder().unlinkToDeath(existingRecord, 0);
- } else {
- Log.e(TAG, "unregisterCallback is called with unregistered callback.");
- }
- }
- }
-
- private boolean hasEnabledNotificationListener(int callingUserId,
- String controllerPackageName, int controllerUid) {
- int controllerUserId = UserHandle.getUserHandleForUid(controllerUid).getIdentifier();
- if (callingUserId != controllerUserId) {
- // Enabled notification listener only works within the same user.
- return false;
- }
-
- if (mNotificationManager.hasEnabledNotificationListener(controllerPackageName,
- UserHandle.getUserHandleForUid(controllerUid))) {
- return true;
- }
- if (DEBUG) {
- Log.d(TAG, controllerPackageName + " (uid=" + controllerUid
- + ") doesn't have an enabled notification listener");
- }
- return false;
- }
-
- // Handles incoming user by checking whether the caller has permission to access the
- // given user id's information or not. Permission is not necessary if the given user id is
- // equal to the caller's user id, but if not, the caller needs to have the
- // INTERACT_ACROSS_USERS_FULL permission. Otherwise, a security exception will be thrown.
- // The return value will be the given user id, unless the given user id is
- // UserHandle.CURRENT, which will return the ActivityManager.getCurrentUser() value instead.
- private int handleIncomingUser(int pid, int uid, int userId, String packageName) {
- int callingUserId = UserHandle.getUserHandleForUid(uid).getIdentifier();
- if (userId == callingUserId) {
- return userId;
- }
-
- boolean canInteractAcrossUsersFull = mContext.checkPermission(
- INTERACT_ACROSS_USERS_FULL, pid, uid) == PackageManager.PERMISSION_GRANTED;
- if (canInteractAcrossUsersFull) {
- if (userId == UserHandle.CURRENT.getIdentifier()) {
- return ActivityManager.getCurrentUser();
- }
- return userId;
- }
-
- throw new SecurityException("Permission denied while calling from " + packageName
- + " with user id: " + userId + "; Need to run as either the calling user id ("
- + callingUserId + "), or with " + INTERACT_ACROSS_USERS_FULL + " permission");
- }
- }
-
- final class CallbackRecord implements IBinder.DeathRecipient {
- private final IMediaCommunicationServiceCallback mCallback;
- private final String mPackageName;
- private final int mUid;
- private int mPid;
- private final int mUserId;
-
- CallbackRecord(IMediaCommunicationServiceCallback callback,
- String packageName, int uid, int pid) {
- mCallback = callback;
- mPackageName = packageName;
- mUid = uid;
- mPid = pid;
- mUserId = (mContext.checkPermission(
- INTERACT_ACROSS_USERS_FULL, pid, uid) == PackageManager.PERMISSION_GRANTED)
- ? ALL.getIdentifier() : UserHandle.getUserHandleForUid(mUid).getIdentifier();
- }
-
- @Override
- public String toString() {
- return "CallbackRecord[callback=" + mCallback + ", pkg=" + mPackageName
- + ", uid=" + mUid + ", pid=" + mPid + "]";
- }
-
- @Override
- public void binderDied() {
- synchronized (mLock) {
- mCallbackRecords.remove(this);
- }
- }
- }
-
- final class FullUserRecord {
- private final int mFullUserId;
- private final SessionPriorityList mSessionPriorityList = new SessionPriorityList();
-
- FullUserRecord(int fullUserId) {
- mFullUserId = fullUserId;
- }
-
- public void addSession(Session2Record record) {
- mSessionPriorityList.addSession(record);
- mHandler.post(() -> dispatchSession2Created(record.mSessionToken));
- mHandler.post(() -> dispatchSession2Changed(mFullUserId));
- }
-
- private void removeSession(Session2Record record) {
- mSessionPriorityList.removeSession(record);
- mHandler.post(() -> dispatchSession2Changed(mFullUserId));
- //TODO: Handle if the removed session was the media button session.
- }
-
- public int getFullUserId() {
- return mFullUserId;
- }
-
- public List<Session2Token> getAllSession2Tokens() {
- return mSessionPriorityList.getAllTokens();
- }
-
- public List<Session2Token> getSession2Tokens(int userId) {
- return mSessionPriorityList.getTokensByUserId(userId);
- }
-
- public void destroyAllSessions() {
- mSessionPriorityList.destroyAllSessions();
- mHandler.post(() -> dispatchSession2Changed(mFullUserId));
- }
-
- public void destroySessionsForUser(int userId) {
- if (mSessionPriorityList.destroySessionsByUserId(userId)) {
- mHandler.post(() -> dispatchSession2Changed(mFullUserId));
- }
- }
-
- public boolean containsSession(Session2Record session) {
- return mSessionPriorityList.contains(session);
- }
-
- public void onPlaybackStateChanged(Session2Record session, boolean promotePriority) {
- mSessionPriorityList.onPlaybackStateChanged(session, promotePriority);
- }
- }
-
- static final class Session2Record {
- final Session2Token mSessionToken;
- final Object mSession2RecordLock = new Object();
- final WeakReference<MediaCommunicationService> mServiceRef;
- final WeakReference<FullUserRecord> mFullUserRef;
- @GuardedBy("mSession2RecordLock")
- private final MediaController2 mController;
-
- @GuardedBy("mSession2RecordLock")
- boolean mIsConnected;
- @GuardedBy("mSession2RecordLock")
- private boolean mIsClosed;
-
- //TODO: introduce policy (See MediaSessionPolicyProvider)
- Session2Record(MediaCommunicationService service, FullUserRecord fullUser,
- Session2Token token, Executor controllerExecutor) {
- mServiceRef = new WeakReference<>(service);
- mFullUserRef = new WeakReference<>(fullUser);
- mSessionToken = token;
- mController = new MediaController2.Builder(service.getContext(), token)
- .setControllerCallback(controllerExecutor, new Controller2Callback())
- .build();
- }
-
- public int getUserId() {
- return UserHandle.getUserHandleForUid(mSessionToken.getUid()).getIdentifier();
- }
-
- public FullUserRecord getFullUser() {
- return mFullUserRef.get();
- }
-
- public boolean isClosed() {
- synchronized (mSession2RecordLock) {
- return mIsClosed;
- }
- }
-
- public void close() {
- synchronized (mSession2RecordLock) {
- mIsClosed = true;
- mController.close();
- }
- }
-
- public Session2Token getSessionToken() {
- return mSessionToken;
- }
-
- public boolean checkPlaybackActiveState(boolean expected) {
- synchronized (mSession2RecordLock) {
- return mIsConnected && mController.isPlaybackActive() == expected;
- }
- }
-
- private class Controller2Callback extends MediaController2.ControllerCallback {
- @Override
- public void onConnected(MediaController2 controller,
- Session2CommandGroup allowedCommands) {
- if (DEBUG) {
- Log.d(TAG, "connected to " + mSessionToken + ", allowed=" + allowedCommands);
- }
- synchronized (mSession2RecordLock) {
- mIsConnected = true;
- }
- }
-
- @Override
- public void onDisconnected(MediaController2 controller) {
- if (DEBUG) {
- Log.d(TAG, "disconnected from " + mSessionToken);
- }
- synchronized (mSession2RecordLock) {
- mIsConnected = false;
- }
- MediaCommunicationService service = mServiceRef.get();
- if (service != null) {
- service.onSessionDied(Session2Record.this);
- }
- }
-
- @Override
- public void onPlaybackActiveChanged(
- @NonNull MediaController2 controller,
- boolean playbackActive) {
- if (DEBUG) {
- Log.d(TAG, "playback active changed, " + mSessionToken + ", active="
- + playbackActive);
- }
- MediaCommunicationService service = mServiceRef.get();
- if (service != null) {
- service.onSessionPlaybackStateChanged(Session2Record.this, playbackActive);
- }
- }
- }
- }
-}
diff --git a/apex/media/service/java/com/android/server/media/SessionPriorityList.java b/apex/media/service/java/com/android/server/media/SessionPriorityList.java
deleted file mode 100644
index 8145861..0000000
--- a/apex/media/service/java/com/android/server/media/SessionPriorityList.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright 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.server.media;
-
-import android.annotation.Nullable;
-import android.media.Session2Token;
-import android.os.Build;
-import android.util.Log;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.modules.annotation.MinSdk;
-import com.android.server.media.MediaCommunicationService.Session2Record;
-
-import java.util.ArrayList;
-import java.util.List;
-
-//TODO: Define the priority specifically.
-/**
- * Keeps track of media sessions and their priority for notifications, media
- * button dispatch, etc.
- * Higher priority session has more chance to be selected as media button session,
- * which receives the media button events.
- */
-@MinSdk(Build.VERSION_CODES.S)
-@RequiresApi(Build.VERSION_CODES.S)
-class SessionPriorityList {
- private static final String TAG = "SessionPriorityList";
- private final Object mLock = new Object();
-
- @GuardedBy("mLock")
- private final List<Session2Record> mSessions = new ArrayList<>();
-
- @Nullable
- private Session2Record mMediaButtonSession;
- @Nullable
- private Session2Record mCachedVolumeSession;
-
- //TODO: integrate AudioPlayerStateMonitor
-
- public void addSession(Session2Record record) {
- synchronized (mLock) {
- mSessions.add(record);
- }
- }
-
- public void removeSession(Session2Record record) {
- synchronized (mLock) {
- mSessions.remove(record);
- }
- if (record == mMediaButtonSession) {
- updateMediaButtonSession(null);
- }
- }
-
- public void destroyAllSessions() {
- synchronized (mLock) {
- for (Session2Record session : mSessions) {
- session.close();
- }
- mSessions.clear();
- }
- }
-
- public boolean destroySessionsByUserId(int userId) {
- boolean changed = false;
- synchronized (mLock) {
- for (int i = mSessions.size() - 1; i >= 0; i--) {
- Session2Record session = mSessions.get(i);
- if (session.getUserId() == userId) {
- mSessions.remove(i);
- session.close();
- changed = true;
- }
- }
- }
- return changed;
- }
-
- public List<Session2Token> getAllTokens() {
- List<Session2Token> sessions = new ArrayList<>();
- synchronized (mLock) {
- for (Session2Record session : mSessions) {
- sessions.add(session.getSessionToken());
- }
- }
- return sessions;
- }
-
- public List<Session2Token> getTokensByUserId(int userId) {
- List<Session2Token> sessions = new ArrayList<>();
- synchronized (mLock) {
- for (Session2Record session : mSessions) {
- if (session.getUserId() == userId) {
- sessions.add(session.getSessionToken());
- }
- }
- }
- return sessions;
- }
-
- /** Gets the media button session which receives the media button events. */
- @Nullable
- public Session2Record getMediaButtonSession() {
- return mMediaButtonSession;
- }
-
- /** Gets the media volume session which receives the volume key events. */
- @Nullable
- public Session2Record getMediaVolumeSession() {
- //TODO: if null, calculate it.
- return mCachedVolumeSession;
- }
-
- public boolean contains(Session2Record session) {
- synchronized (mLock) {
- return mSessions.contains(session);
- }
- }
-
- public void onPlaybackStateChanged(Session2Record session, boolean promotePriority) {
- if (promotePriority) {
- synchronized (mLock) {
- if (mSessions.remove(session)) {
- mSessions.add(0, session);
- } else {
- Log.w(TAG, "onPlaybackStateChanged: Ignoring unknown session");
- return;
- }
- }
- } else if (session.checkPlaybackActiveState(false)) {
- // Just clear the cached volume session when a state goes inactive
- mCachedVolumeSession = null;
- }
-
- // In most cases, playback state isn't needed for finding the media button session,
- // but we only use it as a hint if an app has multiple local media sessions.
- // In that case, we pick the media session whose PlaybackState matches
- // the audio playback configuration.
- if (mMediaButtonSession != null
- && mMediaButtonSession.getSessionToken().getUid()
- == session.getSessionToken().getUid()) {
- Session2Record newMediaButtonSession =
- findMediaButtonSession(mMediaButtonSession.getSessionToken().getUid());
- if (newMediaButtonSession != mMediaButtonSession) {
- // Check if the policy states that this session should not be updated as a media
- // button session.
- updateMediaButtonSession(newMediaButtonSession);
- }
- }
- }
-
- private void updateMediaButtonSession(@Nullable Session2Record newSession) {
- mMediaButtonSession = newSession;
- //TODO: invoke callbacks for media button session changed listeners
- }
-
- /**
- * Finds the media button session with the given {@param uid}.
- * If the app has multiple media sessions, the media session whose playback state is not null
- * and matches the audio playback state becomes the media button session. Otherwise the top
- * priority session becomes the media button session.
- *
- * @return The media button session. Returns {@code null} if the app doesn't have a media
- * session.
- */
- @Nullable
- private Session2Record findMediaButtonSession(int uid) {
- Session2Record mediaButtonSession = null;
- synchronized (mLock) {
- for (Session2Record session : mSessions) {
- if (uid != session.getSessionToken().getUid()) {
- continue;
- }
- // TODO: check audio player state monitor
- if (mediaButtonSession == null) {
- // Pick the top priority session as a default.
- mediaButtonSession = session;
- }
- }
- }
- return mediaButtonSession;
- }
-}
diff --git a/apex/media/service/lint-baseline.xml b/apex/media/service/lint-baseline.xml
deleted file mode 100644
index def6baf..0000000
--- a/apex/media/service/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="" dependencies="true" name="" variant="all" version="7.2.0-dev">
-
-</issues>
diff --git a/api/Android.bp b/api/Android.bp
index d57f5db..e902530 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -116,6 +116,7 @@
"framework-graphics",
"framework-media",
"framework-mediaprovider",
+ "framework-ondevicepersonalization",
"framework-permission",
"framework-permission-s",
"framework-scheduling",
diff --git a/boot/Android.bp b/boot/Android.bp
index 55ffe7c..aa22532 100644
--- a/boot/Android.bp
+++ b/boot/Android.bp
@@ -80,6 +80,10 @@
module: "com.android.mediaprovider-bootclasspath-fragment",
},
{
+ apex: "com.android.ondevicepersonalization",
+ module: "com.android.ondevicepersonalization-bootclasspath-fragment",
+ },
+ {
apex: "com.android.os.statsd",
module: "com.android.os.statsd-bootclasspath-fragment",
},
diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
index 1c82597..e1b7829 100644
--- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp
+++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
@@ -134,19 +134,19 @@
ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
ASSERT_NE(result->stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::integer::int1,
- R::overlay::integer::int1)),
+ R::overlay::integer::int1)),
std::string::npos)
<< result->stdout_str;
ASSERT_NE(result->stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str1,
- R::overlay::string::str1)),
+ R::overlay::string::str1)),
std::string::npos)
<< result->stdout_str;
ASSERT_NE(result->stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str3,
- R::overlay::string::str3)),
+ R::overlay::string::str3)),
std::string::npos)
<< result->stdout_str;
ASSERT_NE(result->stdout_str.find(StringPrintf("0x%08x -> 0x%08x", R::target::string::str4,
- R::overlay::string::str4)),
+ R::overlay::string::str4)),
std::string::npos)
<< result->stdout_str;
diff --git a/core/api/current.txt b/core/api/current.txt
index ea3830f..139ff3e 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -631,6 +631,7 @@
field public static final int elevation = 16843840; // 0x1010440
field public static final int ellipsize = 16842923; // 0x10100ab
field public static final int ems = 16843096; // 0x1010158
+ field public static final int enableOnBackInvokedCallback;
field public static final int enableVrMode = 16844069; // 0x1010525
field public static final int enabled = 16842766; // 0x101000e
field public static final int end = 16843996; // 0x10104dc
@@ -1452,6 +1453,7 @@
field public static final int supportsAssist = 16844016; // 0x10104f0
field public static final int supportsBatteryGameMode;
field public static final int supportsInlineSuggestions = 16844301; // 0x101060d
+ field public static final int supportsInlineSuggestionsWithTouchExploration;
field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1
field public static final int supportsLocalInteraction = 16844047; // 0x101050f
field public static final int supportsMultipleDisplays = 16844182; // 0x1010596
@@ -4274,6 +4276,7 @@
method public void setLocusContext(@Nullable android.content.LocusId, @Nullable android.os.Bundle);
method public final void setMediaController(android.media.session.MediaController);
method public void setPictureInPictureParams(@NonNull android.app.PictureInPictureParams);
+ method public void setPreferDockBigOverlays(boolean);
method @Deprecated public final void setProgress(int);
method @Deprecated public final void setProgressBarIndeterminate(boolean);
method @Deprecated public final void setProgressBarIndeterminateVisibility(boolean);
@@ -4547,6 +4550,7 @@
method public static android.app.ActivityOptions makeClipRevealAnimation(android.view.View, int, int, int, int);
method public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int);
method @NonNull public static android.app.ActivityOptions makeCustomAnimation(@NonNull android.content.Context, int, int, int);
+ method @NonNull public static android.app.ActivityOptions makeLaunchIntoPip(@NonNull android.app.PictureInPictureParams);
method public static android.app.ActivityOptions makeScaleUpAnimation(android.view.View, int, int, int, int);
method public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
method @java.lang.SafeVarargs public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.util.Pair<android.view.View,java.lang.String>...);
@@ -6632,13 +6636,17 @@
public static class PictureInPictureParams.Builder {
ctor public PictureInPictureParams.Builder();
+ ctor public PictureInPictureParams.Builder(@NonNull android.app.PictureInPictureParams);
method public android.app.PictureInPictureParams build();
method public android.app.PictureInPictureParams.Builder setActions(java.util.List<android.app.RemoteAction>);
method public android.app.PictureInPictureParams.Builder setAspectRatio(android.util.Rational);
method @NonNull public android.app.PictureInPictureParams.Builder setAutoEnterEnabled(boolean);
+ method @NonNull public android.app.PictureInPictureParams.Builder setCloseAction(@Nullable android.app.RemoteAction);
method @NonNull public android.app.PictureInPictureParams.Builder setExpandedAspectRatio(@Nullable android.util.Rational);
method @NonNull public android.app.PictureInPictureParams.Builder setSeamlessResizeEnabled(boolean);
method public android.app.PictureInPictureParams.Builder setSourceRectHint(android.graphics.Rect);
+ method @NonNull public android.app.PictureInPictureParams.Builder setSubtitle(@Nullable CharSequence);
+ method @NonNull public android.app.PictureInPictureParams.Builder setTitle(@Nullable CharSequence);
}
public final class PictureInPictureUiState implements android.os.Parcelable {
@@ -16445,6 +16453,7 @@
public class MeasuredText {
method public void getBounds(@IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.graphics.Rect);
method @FloatRange(from=0.0f) @Px public float getCharWidthAt(@IntRange(from=0) int);
+ method public void getFontMetricsInt(@IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.graphics.Paint.FontMetricsInt);
method @FloatRange(from=0.0) @Px public float getWidth(@IntRange(from=0) int, @IntRange(from=0) int);
}
@@ -16988,6 +16997,7 @@
public class SensorEvent {
field public int accuracy;
+ field public boolean firstEventAfterDiscontinuity;
field public android.hardware.Sensor sensor;
field public long timestamp;
field public final float[] values;
@@ -16999,7 +17009,6 @@
method public void onFlushCompleted(android.hardware.Sensor);
method public void onSensorAdditionalInfo(android.hardware.SensorAdditionalInfo);
method public void onSensorChanged(android.hardware.SensorEvent);
- method public void onSensorDiscontinuity(@NonNull android.hardware.Sensor);
}
public interface SensorEventListener {
@@ -17117,6 +17126,9 @@
public final class SensorPrivacyManager {
method public boolean supportsSensorToggle(int);
+ method public boolean supportsSensorToggle(int, int);
+ field public static final int TOGGLE_TYPE_HARDWARE = 2; // 0x2
+ field public static final int TOGGLE_TYPE_SOFTWARE = 1; // 0x1
}
public static class SensorPrivacyManager.Sensors {
@@ -17124,12 +17136,17 @@
field public static final int MICROPHONE = 1; // 0x1
}
- public final class SyncFence implements java.io.Closeable android.os.Parcelable {
- method public void close() throws java.io.IOException;
+ public final class SyncFence implements java.lang.AutoCloseable android.os.Parcelable {
+ method public boolean await(@NonNull java.time.Duration);
+ method public boolean awaitForever();
+ method public void close();
method public int describeContents();
+ method public long getSignalTime();
method public boolean isValid();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.hardware.SyncFence> CREATOR;
+ field public static final long SIGNAL_TIME_INVALID = -1L; // 0xffffffffffffffffL
+ field public static final long SIGNAL_TIME_PENDING = 9223372036854775807L; // 0x7fffffffffffffffL
}
public final class TriggerEvent {
@@ -27879,12 +27896,17 @@
public class EGLExt {
ctor public EGLExt();
+ method @NonNull public static android.hardware.SyncFence eglDupNativeFenceFDANDROID(@NonNull android.opengl.EGLDisplay, @NonNull android.opengl.EGLSync);
method public static boolean eglPresentationTimeANDROID(android.opengl.EGLDisplay, android.opengl.EGLSurface, long);
field public static final int EGL_CONTEXT_FLAGS_KHR = 12540; // 0x30fc
field public static final int EGL_CONTEXT_MAJOR_VERSION_KHR = 12440; // 0x3098
field public static final int EGL_CONTEXT_MINOR_VERSION_KHR = 12539; // 0x30fb
+ field public static final int EGL_NO_NATIVE_FENCE_FD_ANDROID = -1; // 0xffffffff
field public static final int EGL_OPENGL_ES3_BIT_KHR = 64; // 0x40
field public static final int EGL_RECORDABLE_ANDROID = 12610; // 0x3142
+ field public static final int EGL_SYNC_NATIVE_FENCE_ANDROID = 12612; // 0x3144
+ field public static final int EGL_SYNC_NATIVE_FENCE_FD_ANDROID = 12613; // 0x3145
+ field public static final int EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID = 12614; // 0x3146
}
public class EGLImage extends android.opengl.EGLObjectHandle {
@@ -39494,7 +39516,7 @@
method public void onCheckRecognitionSupport(@NonNull android.content.Intent, @NonNull android.speech.RecognitionService.SupportCallback);
method protected abstract void onStartListening(android.content.Intent, android.speech.RecognitionService.Callback);
method protected abstract void onStopListening(android.speech.RecognitionService.Callback);
- method public void triggerModelDownload(@NonNull android.content.Intent);
+ method public void onTriggerModelDownload(@NonNull android.content.Intent);
field public static final String SERVICE_INTERFACE = "android.speech.RecognitionService";
field public static final String SERVICE_META_DATA = "android.speech";
}
@@ -39594,7 +39616,7 @@
public class SpeechRecognizer {
method @MainThread public void cancel();
- method public void checkRecognitionSupport(@NonNull android.content.Intent, @NonNull android.speech.RecognitionSupportCallback);
+ method public void checkRecognitionSupport(@NonNull android.content.Intent, @NonNull java.util.concurrent.Executor, @NonNull android.speech.RecognitionSupportCallback);
method @MainThread @NonNull public static android.speech.SpeechRecognizer createOnDeviceSpeechRecognizer(@NonNull android.content.Context);
method @MainThread public static android.speech.SpeechRecognizer createSpeechRecognizer(android.content.Context);
method @MainThread public static android.speech.SpeechRecognizer createSpeechRecognizer(android.content.Context, android.content.ComponentName);
@@ -42724,16 +42746,16 @@
ctor @Deprecated public ServiceState(android.os.Parcel);
method protected void copyFrom(android.telephony.ServiceState);
method public int describeContents();
- method public int getCdmaNetworkId();
- method public int getCdmaSystemId();
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}) public int getCdmaNetworkId();
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}) public int getCdmaSystemId();
method public int[] getCellBandwidths();
method public int getChannelNumber();
method public int getDuplexMode();
method public boolean getIsManualSelection();
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoList();
- method public String getOperatorAlphaLong();
- method public String getOperatorAlphaShort();
- method public String getOperatorNumeric();
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}) public String getOperatorAlphaLong();
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}) public String getOperatorAlphaShort();
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}) public String getOperatorNumeric();
method public boolean getRoaming();
method public int getState();
method public boolean isSearching();
@@ -44997,6 +45019,7 @@
method public char charAt(int);
method public static android.text.PrecomputedText create(@NonNull CharSequence, @NonNull android.text.PrecomputedText.Params);
method public void getBounds(@IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.graphics.Rect);
+ method public void getFontMetricsInt(@IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.graphics.Paint.FontMetricsInt);
method @IntRange(from=0) public int getParagraphCount();
method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
@@ -47666,15 +47689,11 @@
public final class Choreographer {
method public static android.view.Choreographer getInstance();
- method public void postExtendedFrameCallback(@NonNull android.view.Choreographer.ExtendedFrameCallback);
method public void postFrameCallback(android.view.Choreographer.FrameCallback);
method public void postFrameCallbackDelayed(android.view.Choreographer.FrameCallback, long);
- method public void removeExtendedFrameCallback(@Nullable android.view.Choreographer.ExtendedFrameCallback);
+ method public void postVsyncCallback(@NonNull android.view.Choreographer.VsyncCallback);
method public void removeFrameCallback(android.view.Choreographer.FrameCallback);
- }
-
- public static interface Choreographer.ExtendedFrameCallback {
- method public void onVsync(@NonNull android.view.Choreographer.FrameData);
+ method public void removeVsyncCallback(@Nullable android.view.Choreographer.VsyncCallback);
}
public static interface Choreographer.FrameCallback {
@@ -47689,10 +47708,14 @@
public static class Choreographer.FrameTimeline {
method public long getDeadlineNanos();
- method public long getExpectedPresentTimeNanos();
+ method public long getExpectedPresentationTimeNanos();
method public long getVsyncId();
}
+ public static interface Choreographer.VsyncCallback {
+ method public void onVsync(@NonNull android.view.Choreographer.FrameData);
+ }
+
public interface CollapsibleActionView {
method public void onActionViewCollapsed();
method public void onActionViewExpanded();
@@ -49244,6 +49267,7 @@
method @NonNull public android.view.SurfaceControl.Transaction reparent(@NonNull android.view.SurfaceControl, @Nullable android.view.SurfaceControl);
method @NonNull public android.view.SurfaceControl.Transaction setAlpha(@NonNull android.view.SurfaceControl, @FloatRange(from=0.0, to=1.0) float);
method @NonNull public android.view.SurfaceControl.Transaction setBuffer(@NonNull android.view.SurfaceControl, @Nullable android.hardware.HardwareBuffer);
+ method @NonNull public android.view.SurfaceControl.Transaction setBuffer(@NonNull android.view.SurfaceControl, @Nullable android.hardware.HardwareBuffer, @Nullable android.hardware.SyncFence);
method @NonNull public android.view.SurfaceControl.Transaction setBufferSize(@NonNull android.view.SurfaceControl, @IntRange(from=0) int, @IntRange(from=0) int);
method @NonNull public android.view.SurfaceControl.Transaction setBufferTransform(@NonNull android.view.SurfaceControl, int);
method @NonNull public android.view.SurfaceControl.Transaction setCrop(@NonNull android.view.SurfaceControl, @Nullable android.graphics.Rect);
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 297239a..785ad13 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -917,8 +917,10 @@
public class StatusBarManager {
method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo();
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public int getNavBarModeOverride();
+ method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void registerNearbyMediaDevicesProvider(@NonNull android.media.NearbyMediaDevicesProvider);
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean);
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setNavBarModeOverride(int);
+ method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void unregisterNearbyMediaDevicesProvider(@NonNull android.media.NearbyMediaDevicesProvider);
method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void updateMediaTapToTransferReceiverDisplay(int, @NonNull android.media.MediaRoute2Info, @Nullable android.graphics.drawable.Icon, @Nullable CharSequence);
method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void updateMediaTapToTransferSenderDisplay(int, @NonNull android.media.MediaRoute2Info, @Nullable java.util.concurrent.Executor, @Nullable Runnable);
field public static final int MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER = 0; // 0x0
@@ -1654,8 +1656,8 @@
method @NonNull public android.os.Bundle getSearchConstraints();
method @NonNull public String getSource();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field public static final String CONSTRAINT_IS_PRESUBMIT_SUGGESTION = "IS_PRESUBMIT_SUGGESTION";
- field public static final String CONSTRAINT_SEARCH_PROVIDER_FILTER = "SEARCH_PROVIDER_FILTER";
+ field public static final String CONSTRAINT_IS_PRESUBMIT_SUGGESTION = "android.app.cloudsearch.IS_PRESUBMIT_SUGGESTION";
+ field public static final String CONSTRAINT_SEARCH_PROVIDER_FILTER = "android.app.cloudsearch.SEARCH_PROVIDER_FILTER";
field @NonNull public static final android.os.Parcelable.Creator<android.app.cloudsearch.SearchRequest> CREATOR;
}
@@ -1697,23 +1699,23 @@
method @NonNull public String getTitle();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.cloudsearch.SearchResult> CREATOR;
- field public static final String EXTRAINFO_ACTION_BUTTON_IMAGE_PREREGISTERING = "ACTION_BUTTON_IMAGE";
- field public static final String EXTRAINFO_ACTION_BUTTON_TEXT_PREREGISTERING = "ACTION_BUTTON_TEXT";
- field public static final String EXTRAINFO_APP_BADGES = "APP_BADGES";
- field public static final String EXTRAINFO_APP_CONTAINS_ADS_DISCLAIMER = "APP_CONTAINS_ADS_DISCLAIMER";
- field public static final String EXTRAINFO_APP_CONTAINS_IAP_DISCLAIMER = "APP_CONTAINS_IAP_DISCLAIMER";
- field public static final String EXTRAINFO_APP_DEVELOPER_NAME = "APP_DEVELOPER_NAME";
- field public static final String EXTRAINFO_APP_DOMAIN_URL = "APP_DOMAIN_URL";
- field public static final String EXTRAINFO_APP_IARC = "APP_IARC";
- field public static final String EXTRAINFO_APP_ICON = "APP_ICON";
- field public static final String EXTRAINFO_APP_REVIEW_COUNT = "APP_REVIEW_COUNT";
- field public static final String EXTRAINFO_APP_SIZE_BYTES = "APP_SIZE_BYTES";
- field public static final String EXTRAINFO_APP_STAR_RATING = "APP_STAR_RATING";
- field public static final String EXTRAINFO_LONG_DESCRIPTION = "LONG_DESCRIPTION";
- field public static final String EXTRAINFO_SCREENSHOTS = "SCREENSHOTS";
- field public static final String EXTRAINFO_SHORT_DESCRIPTION = "SHORT_DESCRIPTION";
- field public static final String EXTRAINFO_WEB_ICON = "WEB_ICON";
- field public static final String EXTRAINFO_WEB_URL = "WEB_URL";
+ field public static final String EXTRAINFO_ACTION_BUTTON_IMAGE_PREREGISTERING = "android.app.cloudsearch.ACTION_BUTTON_IMAGE";
+ field public static final String EXTRAINFO_ACTION_BUTTON_TEXT_PREREGISTERING = "android.app.cloudsearch.ACTION_BUTTON_TEXT";
+ field public static final String EXTRAINFO_APP_BADGES = "android.app.cloudsearch.APP_BADGES";
+ field public static final String EXTRAINFO_APP_CONTAINS_ADS_DISCLAIMER = "android.app.cloudsearch.APP_CONTAINS_ADS_DISCLAIMER";
+ field public static final String EXTRAINFO_APP_CONTAINS_IAP_DISCLAIMER = "android.app.cloudsearch.APP_CONTAINS_IAP_DISCLAIMER";
+ field public static final String EXTRAINFO_APP_DEVELOPER_NAME = "android.app.cloudsearch.APP_DEVELOPER_NAME";
+ field public static final String EXTRAINFO_APP_DOMAIN_URL = "android.app.cloudsearch.APP_DOMAIN_URL";
+ field public static final String EXTRAINFO_APP_IARC = "android.app.cloudsearch.APP_IARC";
+ field public static final String EXTRAINFO_APP_ICON = "android.app.cloudsearch.APP_ICON";
+ field public static final String EXTRAINFO_APP_REVIEW_COUNT = "android.app.cloudsearch.APP_REVIEW_COUNT";
+ field public static final String EXTRAINFO_APP_SIZE_BYTES = "android.app.cloudsearch.APP_SIZE_BYTES";
+ field public static final String EXTRAINFO_APP_STAR_RATING = "android.app.cloudsearch.APP_STAR_RATING";
+ field public static final String EXTRAINFO_LONG_DESCRIPTION = "android.app.cloudsearch.LONG_DESCRIPTION";
+ field public static final String EXTRAINFO_SCREENSHOTS = "android.app.cloudsearch.SCREENSHOTS";
+ field public static final String EXTRAINFO_SHORT_DESCRIPTION = "android.app.cloudsearch.SHORT_DESCRIPTION";
+ field public static final String EXTRAINFO_WEB_ICON = "android.app.cloudsearch.WEB_ICON";
+ field public static final String EXTRAINFO_WEB_URL = "android.app.cloudsearch.WEB_URL";
}
public static final class SearchResult.Builder {
@@ -2162,7 +2164,7 @@
method @Nullable public android.net.Uri getSliceUri();
method @NonNull public String getSmartspaceTargetId();
method @Nullable public String getSourceNotificationKey();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData getTemplateData();
+ method @Nullable public android.app.smartspace.uitemplatedata.BaseTemplateData getTemplateData();
method @NonNull public android.os.UserHandle getUserHandle();
method @Nullable public android.appwidget.AppWidgetProviderInfo getWidget();
method public boolean isSensitive();
@@ -2219,7 +2221,7 @@
method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setShouldShowExpanded(boolean);
method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setSliceUri(@NonNull android.net.Uri);
method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setSourceNotificationKey(@NonNull String);
- method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setTemplateData(@Nullable android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData);
+ method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setTemplateData(@Nullable android.app.smartspace.uitemplatedata.BaseTemplateData);
method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setWidget(@NonNull android.appwidget.AppWidgetProviderInfo);
}
@@ -2250,188 +2252,218 @@
package android.app.smartspace.uitemplatedata {
- public final class SmartspaceCarouselUiTemplateData extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData {
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getCarouselAction();
- method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem> getCarouselItems();
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData> CREATOR;
- }
-
- public static final class SmartspaceCarouselUiTemplateData.Builder extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder {
- ctor public SmartspaceCarouselUiTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem>);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.Builder setCarouselAction(@NonNull android.app.smartspace.uitemplatedata.SmartspaceTapAction);
- }
-
- public static final class SmartspaceCarouselUiTemplateData.CarouselItem implements android.os.Parcelable {
+ public class BaseTemplateData implements android.os.Parcelable {
method public int describeContents();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceIcon getImage();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getLowerText();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getTapAction();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getUpperText();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem> CREATOR;
- }
-
- public static final class SmartspaceCarouselUiTemplateData.CarouselItem.Builder {
- ctor public SmartspaceCarouselUiTemplateData.CarouselItem.Builder();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem.Builder setImage(@Nullable android.app.smartspace.uitemplatedata.SmartspaceIcon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem.Builder setLowerText(@Nullable android.app.smartspace.uitemplatedata.SmartspaceText);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem.Builder setTapAction(@Nullable android.app.smartspace.uitemplatedata.SmartspaceTapAction);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCarouselUiTemplateData.CarouselItem.Builder setUpperText(@Nullable android.app.smartspace.uitemplatedata.SmartspaceText);
- }
-
- public final class SmartspaceCombinedCardsUiTemplateData extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData {
- method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData> getCombinedCardDataList();
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceCombinedCardsUiTemplateData> CREATOR;
- }
-
- public static final class SmartspaceCombinedCardsUiTemplateData.Builder extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder {
- ctor public SmartspaceCombinedCardsUiTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData>);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceCombinedCardsUiTemplateData build();
- }
-
- public class SmartspaceDefaultUiTemplateData implements android.os.Parcelable {
- method public int describeContents();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getPrimaryTapAction();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceIcon getSubtitleIcon();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getSubtitleText();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getSupplementalAlarmText();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceIcon getSupplementalSubtitleIcon();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getSupplementalSubtitleTapAction();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getSupplementalSubtitleText();
+ method public int getLayoutWeight();
+ method @Nullable public android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo getPrimaryLoggingInfo();
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getPrimaryTapAction();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getSubtitleIcon();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getSubtitleText();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getSupplementalAlarmText();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getSupplementalIcon();
+ method @Nullable public android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo getSupplementalLoggingInfo();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getSupplementalSubtitleIcon();
+ method @Nullable public android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo getSupplementalSubtitleLoggingInfo();
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getSupplementalSubtitleTapAction();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getSupplementalSubtitleText();
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getSupplementalTapAction();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getSupplementalText();
method public int getTemplateType();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceIcon getTitleIcon();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getTitleText();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getTitleIcon();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getTitleText();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.BaseTemplateData> CREATOR;
}
- public static class SmartspaceDefaultUiTemplateData.Builder {
- ctor public SmartspaceDefaultUiTemplateData.Builder(int);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setPrimaryTapAction(@NonNull android.app.smartspace.uitemplatedata.SmartspaceTapAction);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setSubtitleIcon(@NonNull android.app.smartspace.uitemplatedata.SmartspaceIcon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setSubtitleText(@NonNull android.app.smartspace.uitemplatedata.SmartspaceText);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setSupplementalAlarmText(@NonNull android.app.smartspace.uitemplatedata.SmartspaceText);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setSupplementalSubtitleIcon(@NonNull android.app.smartspace.uitemplatedata.SmartspaceIcon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setSupplementalSubtitleTapAction(@NonNull android.app.smartspace.uitemplatedata.SmartspaceTapAction);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setSupplementalSubtitleText(@NonNull android.app.smartspace.uitemplatedata.SmartspaceText);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setTitleIcon(@NonNull android.app.smartspace.uitemplatedata.SmartspaceIcon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder setTitleText(@NonNull android.app.smartspace.uitemplatedata.SmartspaceText);
+ public static class BaseTemplateData.Builder {
+ ctor public BaseTemplateData.Builder(int);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData build();
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setLayoutWeight(int);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setPrimaryLoggingInfo(@NonNull android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setPrimaryTapAction(@NonNull android.app.smartspace.uitemplatedata.TapAction);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSubtitleIcon(@NonNull android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSubtitleText(@NonNull android.app.smartspace.uitemplatedata.Text);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalAlarmText(@NonNull android.app.smartspace.uitemplatedata.Text);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalIcon(@NonNull android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalLoggingInfo(@NonNull android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalSubtitleIcon(@NonNull android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalSubtitleLoggingInfo(@NonNull android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalSubtitleTapAction(@NonNull android.app.smartspace.uitemplatedata.TapAction);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalSubtitleText(@NonNull android.app.smartspace.uitemplatedata.Text);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalTapAction(@NonNull android.app.smartspace.uitemplatedata.TapAction);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setSupplementalText(@NonNull android.app.smartspace.uitemplatedata.Text);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setTitleIcon(@NonNull android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.Builder setTitleText(@NonNull android.app.smartspace.uitemplatedata.Text);
}
- public final class SmartspaceHeadToHeadUiTemplateData extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData {
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getHeadToHeadAction();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceIcon getHeadToHeadFirstCompetitorIcon();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getHeadToHeadFirstCompetitorText();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceIcon getHeadToHeadSecondCompetitorIcon();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getHeadToHeadSecondCompetitorText();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getHeadToHeadTitle();
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData> CREATOR;
+ public static final class BaseTemplateData.SubItemLoggingInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getFeatureType();
+ method public int getInstanceId();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo> CREATOR;
}
- public static final class SmartspaceHeadToHeadUiTemplateData.Builder extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder {
- ctor public SmartspaceHeadToHeadUiTemplateData.Builder();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData.Builder setHeadToHeadAction(@Nullable android.app.smartspace.uitemplatedata.SmartspaceTapAction);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData.Builder setHeadToHeadFirstCompetitorIcon(@Nullable android.app.smartspace.uitemplatedata.SmartspaceIcon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData.Builder setHeadToHeadFirstCompetitorText(@Nullable android.app.smartspace.uitemplatedata.SmartspaceText);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData.Builder setHeadToHeadSecondCompetitorIcon(@Nullable android.app.smartspace.uitemplatedata.SmartspaceIcon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData.Builder setHeadToHeadSecondCompetitorText(@Nullable android.app.smartspace.uitemplatedata.SmartspaceText);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceHeadToHeadUiTemplateData.Builder setHeadToHeadTitle(@Nullable android.app.smartspace.uitemplatedata.SmartspaceText);
+ public static final class BaseTemplateData.SubItemLoggingInfo.Builder {
+ ctor public BaseTemplateData.SubItemLoggingInfo.Builder(int, int);
+ method @NonNull public android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo build();
}
- public final class SmartspaceIcon implements android.os.Parcelable {
+ public final class CarouselTemplateData extends android.app.smartspace.uitemplatedata.BaseTemplateData {
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getCarouselAction();
+ method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem> getCarouselItems();
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.CarouselTemplateData> CREATOR;
+ }
+
+ public static final class CarouselTemplateData.Builder extends android.app.smartspace.uitemplatedata.BaseTemplateData.Builder {
+ ctor public CarouselTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem>);
+ method @NonNull public android.app.smartspace.uitemplatedata.CarouselTemplateData build();
+ method @NonNull public android.app.smartspace.uitemplatedata.CarouselTemplateData.Builder setCarouselAction(@NonNull android.app.smartspace.uitemplatedata.TapAction);
+ }
+
+ public static final class CarouselTemplateData.CarouselItem implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getImage();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getLowerText();
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getTapAction();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getUpperText();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem> CREATOR;
+ }
+
+ public static final class CarouselTemplateData.CarouselItem.Builder {
+ ctor public CarouselTemplateData.CarouselItem.Builder();
+ method @NonNull public android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem build();
+ method @NonNull public android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem.Builder setImage(@Nullable android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem.Builder setLowerText(@Nullable android.app.smartspace.uitemplatedata.Text);
+ method @NonNull public android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem.Builder setTapAction(@Nullable android.app.smartspace.uitemplatedata.TapAction);
+ method @NonNull public android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem.Builder setUpperText(@Nullable android.app.smartspace.uitemplatedata.Text);
+ }
+
+ public final class CombinedCardsTemplateData extends android.app.smartspace.uitemplatedata.BaseTemplateData {
+ method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.BaseTemplateData> getCombinedCardDataList();
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.CombinedCardsTemplateData> CREATOR;
+ }
+
+ public static final class CombinedCardsTemplateData.Builder extends android.app.smartspace.uitemplatedata.BaseTemplateData.Builder {
+ ctor public CombinedCardsTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.BaseTemplateData>);
+ method @NonNull public android.app.smartspace.uitemplatedata.CombinedCardsTemplateData build();
+ }
+
+ public final class HeadToHeadTemplateData extends android.app.smartspace.uitemplatedata.BaseTemplateData {
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getHeadToHeadAction();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getHeadToHeadFirstCompetitorIcon();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getHeadToHeadFirstCompetitorText();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getHeadToHeadSecondCompetitorIcon();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getHeadToHeadSecondCompetitorText();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getHeadToHeadTitle();
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.HeadToHeadTemplateData> CREATOR;
+ }
+
+ public static final class HeadToHeadTemplateData.Builder extends android.app.smartspace.uitemplatedata.BaseTemplateData.Builder {
+ ctor public HeadToHeadTemplateData.Builder();
+ method @NonNull public android.app.smartspace.uitemplatedata.HeadToHeadTemplateData build();
+ method @NonNull public android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.Builder setHeadToHeadAction(@Nullable android.app.smartspace.uitemplatedata.TapAction);
+ method @NonNull public android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.Builder setHeadToHeadFirstCompetitorIcon(@Nullable android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.Builder setHeadToHeadFirstCompetitorText(@Nullable android.app.smartspace.uitemplatedata.Text);
+ method @NonNull public android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.Builder setHeadToHeadSecondCompetitorIcon(@Nullable android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.Builder setHeadToHeadSecondCompetitorText(@Nullable android.app.smartspace.uitemplatedata.Text);
+ method @NonNull public android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.Builder setHeadToHeadTitle(@Nullable android.app.smartspace.uitemplatedata.Text);
+ }
+
+ public final class Icon implements android.os.Parcelable {
method public int describeContents();
method @Nullable public CharSequence getContentDescription();
method @NonNull public android.graphics.drawable.Icon getIcon();
method public boolean shouldTint();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceIcon> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.Icon> CREATOR;
}
- public static final class SmartspaceIcon.Builder {
- ctor public SmartspaceIcon.Builder(@NonNull android.graphics.drawable.Icon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceIcon build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceIcon.Builder setContentDescription(@NonNull CharSequence);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceIcon.Builder setShouldTint(boolean);
+ public static final class Icon.Builder {
+ ctor public Icon.Builder(@NonNull android.graphics.drawable.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.Icon build();
+ method @NonNull public android.app.smartspace.uitemplatedata.Icon.Builder setContentDescription(@NonNull CharSequence);
+ method @NonNull public android.app.smartspace.uitemplatedata.Icon.Builder setShouldTint(boolean);
}
- public final class SmartspaceSubCardUiTemplateData extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData {
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getSubCardAction();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceIcon getSubCardIcon();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceText getSubCardText();
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceSubCardUiTemplateData> CREATOR;
+ public final class SubCardTemplateData extends android.app.smartspace.uitemplatedata.BaseTemplateData {
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getSubCardAction();
+ method @NonNull public android.app.smartspace.uitemplatedata.Icon getSubCardIcon();
+ method @Nullable public android.app.smartspace.uitemplatedata.Text getSubCardText();
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SubCardTemplateData> CREATOR;
}
- public static final class SmartspaceSubCardUiTemplateData.Builder extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder {
- ctor public SmartspaceSubCardUiTemplateData.Builder(@NonNull android.app.smartspace.uitemplatedata.SmartspaceIcon);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubCardUiTemplateData build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubCardUiTemplateData.Builder setSubCardAction(@NonNull android.app.smartspace.uitemplatedata.SmartspaceTapAction);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubCardUiTemplateData.Builder setSubCardText(@NonNull android.app.smartspace.uitemplatedata.SmartspaceText);
+ public static final class SubCardTemplateData.Builder extends android.app.smartspace.uitemplatedata.BaseTemplateData.Builder {
+ ctor public SubCardTemplateData.Builder(@NonNull android.app.smartspace.uitemplatedata.Icon);
+ method @NonNull public android.app.smartspace.uitemplatedata.SubCardTemplateData build();
+ method @NonNull public android.app.smartspace.uitemplatedata.SubCardTemplateData.Builder setSubCardAction(@NonNull android.app.smartspace.uitemplatedata.TapAction);
+ method @NonNull public android.app.smartspace.uitemplatedata.SubCardTemplateData.Builder setSubCardText(@NonNull android.app.smartspace.uitemplatedata.Text);
}
- public final class SmartspaceSubImageUiTemplateData extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData {
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getSubImageAction();
- method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.SmartspaceText> getSubImageTexts();
- method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.SmartspaceIcon> getSubImages();
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceSubImageUiTemplateData> CREATOR;
+ public final class SubImageTemplateData extends android.app.smartspace.uitemplatedata.BaseTemplateData {
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getSubImageAction();
+ method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.Text> getSubImageTexts();
+ method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.Icon> getSubImages();
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SubImageTemplateData> CREATOR;
}
- public static final class SmartspaceSubImageUiTemplateData.Builder extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder {
- ctor public SmartspaceSubImageUiTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.SmartspaceText>, @NonNull java.util.List<android.app.smartspace.uitemplatedata.SmartspaceIcon>);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubImageUiTemplateData build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubImageUiTemplateData.Builder setSubImageAction(@NonNull android.app.smartspace.uitemplatedata.SmartspaceTapAction);
+ public static final class SubImageTemplateData.Builder extends android.app.smartspace.uitemplatedata.BaseTemplateData.Builder {
+ ctor public SubImageTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.Text>, @NonNull java.util.List<android.app.smartspace.uitemplatedata.Icon>);
+ method @NonNull public android.app.smartspace.uitemplatedata.SubImageTemplateData build();
+ method @NonNull public android.app.smartspace.uitemplatedata.SubImageTemplateData.Builder setSubImageAction(@NonNull android.app.smartspace.uitemplatedata.TapAction);
}
- public final class SmartspaceSubListUiTemplateData extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData {
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceTapAction getSubListAction();
- method @Nullable public android.app.smartspace.uitemplatedata.SmartspaceIcon getSubListIcon();
- method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.SmartspaceText> getSubListTexts();
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceSubListUiTemplateData> CREATOR;
+ public final class SubListTemplateData extends android.app.smartspace.uitemplatedata.BaseTemplateData {
+ method @Nullable public android.app.smartspace.uitemplatedata.TapAction getSubListAction();
+ method @Nullable public android.app.smartspace.uitemplatedata.Icon getSubListIcon();
+ method @NonNull public java.util.List<android.app.smartspace.uitemplatedata.Text> getSubListTexts();
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SubListTemplateData> CREATOR;
}
- public static final class SmartspaceSubListUiTemplateData.Builder extends android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData.Builder {
- ctor public SmartspaceSubListUiTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.SmartspaceText>);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubListUiTemplateData build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubListUiTemplateData.Builder setSubListAction(@NonNull android.app.smartspace.uitemplatedata.SmartspaceTapAction);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceSubListUiTemplateData.Builder setSubListIcon(@NonNull android.app.smartspace.uitemplatedata.SmartspaceIcon);
+ public static final class SubListTemplateData.Builder extends android.app.smartspace.uitemplatedata.BaseTemplateData.Builder {
+ ctor public SubListTemplateData.Builder(@NonNull java.util.List<android.app.smartspace.uitemplatedata.Text>);
+ method @NonNull public android.app.smartspace.uitemplatedata.SubListTemplateData build();
+ method @NonNull public android.app.smartspace.uitemplatedata.SubListTemplateData.Builder setSubListAction(@NonNull android.app.smartspace.uitemplatedata.TapAction);
+ method @NonNull public android.app.smartspace.uitemplatedata.SubListTemplateData.Builder setSubListIcon(@NonNull android.app.smartspace.uitemplatedata.Icon);
}
- public final class SmartspaceTapAction implements android.os.Parcelable {
+ public final class TapAction implements android.os.Parcelable {
method public int describeContents();
method @Nullable public android.os.Bundle getExtras();
method @Nullable public CharSequence getId();
method @Nullable public android.content.Intent getIntent();
method @Nullable public android.app.PendingIntent getPendingIntent();
method @Nullable public android.os.UserHandle getUserHandle();
+ method public boolean shouldShowOnLockscreen();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceTapAction> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.TapAction> CREATOR;
}
- public static final class SmartspaceTapAction.Builder {
- ctor public SmartspaceTapAction.Builder(@NonNull CharSequence);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceTapAction build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceTapAction.Builder setExtras(@NonNull android.os.Bundle);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceTapAction.Builder setIntent(@NonNull android.content.Intent);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceTapAction.Builder setPendingIntent(@NonNull android.app.PendingIntent);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceTapAction.Builder setUserHandle(@Nullable android.os.UserHandle);
+ public static final class TapAction.Builder {
+ ctor public TapAction.Builder(@NonNull CharSequence);
+ method @NonNull public android.app.smartspace.uitemplatedata.TapAction build();
+ method @NonNull public android.app.smartspace.uitemplatedata.TapAction.Builder setExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.app.smartspace.uitemplatedata.TapAction.Builder setIntent(@NonNull android.content.Intent);
+ method @NonNull public android.app.smartspace.uitemplatedata.TapAction.Builder setPendingIntent(@NonNull android.app.PendingIntent);
+ method @NonNull public android.app.smartspace.uitemplatedata.TapAction.Builder setShouldShowOnLockscreen(@NonNull boolean);
+ method @NonNull public android.app.smartspace.uitemplatedata.TapAction.Builder setUserHandle(@Nullable android.os.UserHandle);
}
- public final class SmartspaceText implements android.os.Parcelable {
+ public final class Text implements android.os.Parcelable {
method public int describeContents();
+ method public int getMaxLines();
method @NonNull public CharSequence getText();
method @NonNull public android.text.TextUtils.TruncateAt getTruncateAtType();
method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.SmartspaceText> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.uitemplatedata.Text> CREATOR;
}
- public static final class SmartspaceText.Builder {
- ctor public SmartspaceText.Builder(@NonNull CharSequence);
- ctor public SmartspaceText.Builder(@NonNull CharSequence, @NonNull android.text.TextUtils.TruncateAt);
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceText build();
- method @NonNull public android.app.smartspace.uitemplatedata.SmartspaceText.Builder setTruncateAtType(@NonNull android.text.TextUtils.TruncateAt);
+ public static final class Text.Builder {
+ ctor public Text.Builder(@NonNull CharSequence);
+ method @NonNull public android.app.smartspace.uitemplatedata.Text build();
+ method @NonNull public android.app.smartspace.uitemplatedata.Text.Builder setMaxLines(int);
+ method @NonNull public android.app.smartspace.uitemplatedata.Text.Builder setTruncateAtType(@NonNull android.text.TextUtils.TruncateAt);
}
}
@@ -2503,9 +2535,10 @@
package android.app.usage {
public final class BroadcastResponseStats implements android.os.Parcelable {
- ctor public BroadcastResponseStats(@NonNull String);
+ ctor public BroadcastResponseStats(@NonNull String, @IntRange(from=1) long);
method public int describeContents();
method @IntRange(from=0) public int getBroadcastsDispatchedCount();
+ method @IntRange(from=1) public long getId();
method @IntRange(from=0) public int getNotificationsCancelledCount();
method @IntRange(from=0) public int getNotificationsPostedCount();
method @IntRange(from=0) public int getNotificationsUpdatedCount();
@@ -2562,13 +2595,13 @@
}
public final class UsageStatsManager {
- method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void clearBroadcastResponseStats(@NonNull String, @IntRange(from=1) long);
+ method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void clearBroadcastResponseStats(@Nullable String, @IntRange(from=0) long);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getAppStandbyBucket(String);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.Map<java.lang.String,java.lang.Integer> getAppStandbyBuckets();
method @RequiresPermission(allOf={android.Manifest.permission.INTERACT_ACROSS_USERS, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long getLastTimeAnyComponentUsed(@NonNull String);
method public int getUsageSource();
method @RequiresPermission(android.Manifest.permission.BIND_CARRIER_SERVICES) public void onCarrierPrivilegedAppsChanged();
- method @NonNull @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public android.app.usage.BroadcastResponseStats queryBroadcastResponseStats(@NonNull String, @IntRange(from=1) long);
+ method @NonNull @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.List<android.app.usage.BroadcastResponseStats> queryBroadcastResponseStats(@Nullable String, @IntRange(from=0) long);
method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void registerAppUsageLimitObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @Nullable android.app.PendingIntent);
method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerAppUsageObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent);
method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent);
@@ -2743,7 +2776,7 @@
package android.companion.virtual {
public final class VirtualDeviceManager {
- method @Nullable @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.VirtualDeviceManager.VirtualDevice createVirtualDevice(int, @NonNull android.companion.virtual.VirtualDeviceParams);
+ method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.VirtualDeviceManager.VirtualDevice createVirtualDevice(int, @NonNull android.companion.virtual.VirtualDeviceParams);
}
public static interface VirtualDeviceManager.ActivityListener {
@@ -3726,13 +3759,25 @@
public final class SensorPrivacyManager {
method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
- method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean areAnySensorPrivacyTogglesEnabled(int);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int, int);
method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
+ method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacy(int, boolean);
}
public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener {
- method public void onSensorPrivacyChanged(int, boolean);
+ method public default void onSensorPrivacyChanged(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener.SensorPrivacyChangedParams);
+ method @Deprecated public void onSensorPrivacyChanged(int, boolean);
+ }
+
+ public static class SensorPrivacyManager.OnSensorPrivacyChangedListener.SensorPrivacyChangedParams {
+ method public int getSensor();
+ method public int getToggleType();
+ method public boolean isEnabled();
}
}
@@ -5314,9 +5359,9 @@
method public int getCurrentDataRole();
method public int getCurrentMode();
method public int getCurrentPowerRole();
- method public int getPowerBrickStatus();
+ method public int getPowerBrickConnectionStatus();
method public int getSupportedRoleCombinations();
- method @Nullable public int[] getUsbDataStatus();
+ method public int getUsbDataStatus();
method public boolean isConnected();
method public boolean isPowerTransferLimited();
method public boolean isRoleCombinationSupported(int, int);
@@ -5325,6 +5370,13 @@
field public static final int DATA_ROLE_DEVICE = 2; // 0x2
field public static final int DATA_ROLE_HOST = 1; // 0x1
field public static final int DATA_ROLE_NONE = 0; // 0x0
+ field public static final int DATA_STATUS_DISABLED_CONTAMINANT = 4; // 0x4
+ field public static final int DATA_STATUS_DISABLED_DEBUG = 32; // 0x20
+ field public static final int DATA_STATUS_DISABLED_DOCK = 8; // 0x8
+ field public static final int DATA_STATUS_DISABLED_FORCE = 16; // 0x10
+ field public static final int DATA_STATUS_DISABLED_OVERHEAT = 2; // 0x2
+ field public static final int DATA_STATUS_ENABLED = 1; // 0x1
+ field public static final int DATA_STATUS_UNKNOWN = 0; // 0x0
field public static final int MODE_AUDIO_ACCESSORY = 4; // 0x4
field public static final int MODE_DEBUG_ACCESSORY = 8; // 0x8
field public static final int MODE_DFP = 2; // 0x2
@@ -5336,13 +5388,6 @@
field public static final int POWER_ROLE_NONE = 0; // 0x0
field public static final int POWER_ROLE_SINK = 2; // 0x2
field public static final int POWER_ROLE_SOURCE = 1; // 0x1
- field public static final int USB_DATA_STATUS_DISABLED_CONTAMINANT = 3; // 0x3
- field public static final int USB_DATA_STATUS_DISABLED_DEBUG = 6; // 0x6
- field public static final int USB_DATA_STATUS_DISABLED_DOCK = 4; // 0x4
- field public static final int USB_DATA_STATUS_DISABLED_FORCE = 5; // 0x5
- field public static final int USB_DATA_STATUS_DISABLED_OVERHEAT = 2; // 0x2
- field public static final int USB_DATA_STATUS_ENABLED = 1; // 0x1
- field public static final int USB_DATA_STATUS_UNKNOWN = 0; // 0x0
}
}
@@ -5845,8 +5890,8 @@
method @IntRange(from=0, to=1023) public int getIssueOfDataClock();
method @IntRange(from=0, to=255) public int getIssueOfDataEphemeris();
method @Nullable public android.location.SatellitePvt.PositionEcef getPositionEcef();
- method @IntRange(from=0, to=604784) public int getTimeOfClock();
- method @IntRange(from=0, to=604784) public int getTimeOfEphemeris();
+ method @IntRange(from=0) public long getTimeOfClock();
+ method @IntRange(from=0) public long getTimeOfEphemeris();
method @FloatRange public double getTropoDelayMeters();
method @Nullable public android.location.SatellitePvt.VelocityEcef getVelocityEcef();
method public boolean hasIono();
@@ -5873,8 +5918,8 @@
method @NonNull public android.location.SatellitePvt.Builder setIssueOfDataClock(@IntRange(from=0, to=1023) int);
method @NonNull public android.location.SatellitePvt.Builder setIssueOfDataEphemeris(@IntRange(from=0, to=255) int);
method @NonNull public android.location.SatellitePvt.Builder setPositionEcef(@NonNull android.location.SatellitePvt.PositionEcef);
- method @NonNull public android.location.SatellitePvt.Builder setTimeOfClock(@IntRange(from=0, to=604784) int);
- method @NonNull public android.location.SatellitePvt.Builder setTimeOfEphemeris(@IntRange(from=0, to=604784) int);
+ method @NonNull public android.location.SatellitePvt.Builder setTimeOfClock(@IntRange(from=0) long);
+ method @NonNull public android.location.SatellitePvt.Builder setTimeOfEphemeris(@IntRange(from=0) int);
method @NonNull public android.location.SatellitePvt.Builder setTropoDelayMeters(@FloatRange(from=0.0f, to=100.0f) double);
method @NonNull public android.location.SatellitePvt.Builder setVelocityEcef(@NonNull android.location.SatellitePvt.VelocityEcef);
}
@@ -6071,7 +6116,7 @@
method public boolean isAudioServerRunning();
method public boolean isHdmiSystemAudioSupported();
method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable();
- method public static boolean isUltrasoundSupported();
+ method @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) public boolean isUltrasoundSupported();
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void muteAwaitConnection(@NonNull int[], @NonNull android.media.AudioDeviceAttributes, long, @NonNull java.util.concurrent.TimeUnit) throws java.lang.IllegalStateException;
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void registerMuteAwaitConnectionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.MuteAwaitConnectionCallback);
@@ -6257,6 +6302,26 @@
field public static final int SYNC_EVENT_SHARE_AUDIO_HISTORY = 100; // 0x64
}
+ public final class NearbyDevice implements android.os.Parcelable {
+ ctor public NearbyDevice(@NonNull String, int);
+ method public int describeContents();
+ method @NonNull public String getMediaRoute2Id();
+ method public int getRangeZone();
+ method @NonNull public static String rangeZoneToString(int);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.media.NearbyDevice> CREATOR;
+ field public static final int RANGE_CLOSE = 3; // 0x3
+ field public static final int RANGE_FAR = 1; // 0x1
+ field public static final int RANGE_LONG = 2; // 0x2
+ field public static final int RANGE_UNKNOWN = 0; // 0x0
+ field public static final int RANGE_WITHIN_REACH = 4; // 0x4
+ }
+
+ public interface NearbyMediaDevicesProvider {
+ method public void registerNearbyDevicesCallback(@NonNull java.util.function.Consumer<java.util.List<android.media.NearbyDevice>>);
+ method public void unregisterNearbyDevicesCallback(@NonNull java.util.function.Consumer<java.util.List<android.media.NearbyDevice>>);
+ }
+
public class PlayerProxy {
method public void pause();
method public void setPan(float);
@@ -10823,7 +10888,7 @@
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
method public abstract void onCancelAttentionCheck(@NonNull android.service.attention.AttentionService.AttentionCallback);
method public abstract void onCheckAttention(@NonNull android.service.attention.AttentionService.AttentionCallback);
- method public void onStartProximityUpdates(@NonNull android.service.attention.AttentionService.ProximityCallback);
+ method public void onStartProximityUpdates(@NonNull android.service.attention.AttentionService.ProximityUpdateCallback);
method public void onStopProximityUpdates();
field public static final int ATTENTION_FAILURE_CAMERA_PERMISSION_ABSENT = 6; // 0x6
field public static final int ATTENTION_FAILURE_CANCELLED = 3; // 0x3
@@ -10841,7 +10906,7 @@
method public void onSuccess(int, long);
}
- public static final class AttentionService.ProximityCallback {
+ public static final class AttentionService.ProximityUpdateCallback {
method public void onProximityUpdate(double);
}
@@ -15597,7 +15662,7 @@
public interface WindowManager extends android.view.ViewManager {
method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public android.graphics.Region getCurrentImeTouchRegion();
- method public default void registerTaskFpsCallback(@IntRange(from=0) int, @NonNull android.window.TaskFpsCallback);
+ method public default void registerTaskFpsCallback(@IntRange(from=0) int, @NonNull java.util.concurrent.Executor, @NonNull android.window.TaskFpsCallback);
method public default void unregisterTaskFpsCallback(@NonNull android.window.TaskFpsCallback);
}
@@ -16189,12 +16254,9 @@
package android.window {
- public final class TaskFpsCallback {
- ctor public TaskFpsCallback(@NonNull java.util.concurrent.Executor, @NonNull android.window.TaskFpsCallback.OnFpsCallbackListener);
- }
-
- public static interface TaskFpsCallback.OnFpsCallbackListener {
- method public void onFpsReported(float);
+ public abstract class TaskFpsCallback {
+ ctor public TaskFpsCallback();
+ method public abstract void onFpsReported(float);
}
}
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 84b393a..e5165449 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -107,6 +107,8 @@
method public final boolean addDumpable(@NonNull android.util.Dumpable);
method public void dumpInternal(@NonNull String, @Nullable java.io.FileDescriptor, @NonNull java.io.PrintWriter, @Nullable String[]);
method public void onMovedToDisplay(int, android.content.res.Configuration);
+ field public static final String DUMP_ARG_DUMP_DUMPABLE = "--dump-dumpable";
+ field public static final String DUMP_ARG_LIST_DUMPABLES = "--list-dumpables";
}
public class ActivityManager {
@@ -270,9 +272,12 @@
}
public class DreamManager {
+ method public boolean areDreamsSupported();
method @RequiresPermission(android.Manifest.permission.READ_DREAM_STATE) public boolean isDreaming();
+ method public boolean isScreensaverEnabled();
method @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE) public void setActiveDream(@Nullable android.content.ComponentName);
method @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE) public void setDreamOverlay(@Nullable android.content.ComponentName);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setScreensaverEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE) public void startDream(@NonNull android.content.ComponentName);
method @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE) public void stopDream();
}
@@ -352,8 +357,11 @@
public final class PictureInPictureParams implements android.os.Parcelable {
method public java.util.List<android.app.RemoteAction> getActions();
method public float getAspectRatio();
+ method @Nullable public android.app.RemoteAction getCloseAction();
method public float getExpandedAspectRatio();
method public android.graphics.Rect getSourceRectHint();
+ method @Nullable public CharSequence getSubtitle();
+ method @Nullable public CharSequence getTitle();
method public boolean isSeamlessResizeEnabled();
}
@@ -411,6 +419,7 @@
method @NonNull public android.content.res.Configuration getConfiguration();
method public int getParentTaskId();
method @Nullable public android.app.PictureInPictureParams getPictureInPictureParams();
+ method public boolean getPreferDockBigOverlays();
method @NonNull public android.window.WindowContainerToken getToken();
method public boolean hasParentTask();
}
@@ -1200,7 +1209,6 @@
field public static final int SWITCHING_TYPE_NONE = 0; // 0x0
field public static final int SWITCHING_TYPE_WITHIN_GROUPS = 1; // 0x1
field public static final int VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS = 512; // 0x200
- field public static final int VIRTUAL_DISPLAY_FLAG_TRUSTED = 1024; // 0x400
}
}
@@ -2983,6 +2991,7 @@
field public static final String DEVICE_CONFIG_PROPERTY_MAX_BUFFER_SIZE = "max_buffer_size";
field public static final String DEVICE_CONFIG_PROPERTY_SERVICE_EXPLICITLY_ENABLED = "service_explicitly_enabled";
field public static final String DEVICE_CONFIG_PROPERTY_TEXT_CHANGE_FLUSH_FREQUENCY = "text_change_flush_frequency";
+ field public static final String DUMPABLE_NAME = "ContentCaptureManager";
field public static final int LOGGING_LEVEL_DEBUG = 1; // 0x1
field public static final int LOGGING_LEVEL_OFF = 0; // 0x0
field public static final int LOGGING_LEVEL_VERBOSE = 2; // 0x2
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 983dde3..11663a5 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -814,6 +814,13 @@
Dialog mDialog;
Bundle mArgs;
}
+
+ /** @hide */ public static final String DUMP_ARG_AUTOFILL = "--autofill";
+ /** @hide */ public static final String DUMP_ARG_CONTENT_CAPTURE = "--contentcapture";
+ /** @hide */ public static final String DUMP_ARG_TRANSLATION = "--translation";
+ /** @hide */ @TestApi public static final String DUMP_ARG_LIST_DUMPABLES = "--list-dumpables";
+ /** @hide */ @TestApi public static final String DUMP_ARG_DUMP_DUMPABLE = "--dump-dumpable";
+
private SparseArray<ManagedDialog> mManagedDialogs;
// set by the thread after the constructor and before onCreate(Bundle savedInstanceState) is called.
@@ -1649,7 +1656,10 @@
}
mRestoredFromBundle = savedInstanceState != null;
mCalled = true;
- if (!WindowOnBackInvokedDispatcher.shouldUseLegacyBack()) {
+
+ boolean aheadOfTimeBack = WindowOnBackInvokedDispatcher
+ .isOnBackInvokedCallbackEnabled(this);
+ if (aheadOfTimeBack) {
// Add onBackPressed as default back behavior.
mDefaultBackCallback = new OnBackInvokedCallback() {
@Override
@@ -2955,6 +2965,27 @@
return false;
}
+ /**
+ * Specifies a preference to dock big overlays like the expanded picture-in-picture on TV
+ * (see {@link PictureInPictureParams.Builder#setExpandedAspectRatio}). Docking puts the
+ * big overlay side-by-side next to this activity, so that both windows are fully visible to
+ * the user.
+ *
+ * <p> If unspecified, whether the overlay window will be docked or not, will be defined
+ * by the system.
+ *
+ * <p> If specified, the system will try to respect the preference, but it may be
+ * overridden by a user preference.
+ *
+ * @param preferDockBigOverlays indicates that the activity prefers big overlays to be
+ * docked next to it instead of overlaying its content
+ *
+ * @see PictureInPictureParams.Builder#setExpandedAspectRatio
+ */
+ public void setPreferDockBigOverlays(boolean preferDockBigOverlays) {
+ ActivityClient.getInstance().setPreferDockBigOverlays(mToken, preferDockBigOverlays);
+ }
+
void dispatchMovedToDisplay(int displayId, Configuration config) {
updateDisplay(displayId);
onMovedToDisplay(displayId, config);
@@ -7348,43 +7379,72 @@
public void dumpInternal(@NonNull String prefix,
@SuppressLint("UseParcelFileDescriptor") @Nullable FileDescriptor fd,
@NonNull PrintWriter writer, @Nullable String[] args) {
- if (args != null && args.length > 0
- && CompatChanges.isChangeEnabled(DUMP_IGNORES_SPECIAL_ARGS)) {
+
+ // Lazy-load mDumpableContainer with Dumpables activity might already have a reference to
+ if (mAutofillClientController != null) {
+ addDumpable(mAutofillClientController);
+ }
+ if (mUiTranslationController != null) {
+ addDumpable(mUiTranslationController);
+ }
+ if (mContentCaptureManager != null) {
+ mContentCaptureManager.addDumpable(this);
+ }
+
+ boolean dumpInternalState = true;
+ String arg = null;
+ if (args != null && args.length > 0) {
+ arg = args[0];
+ boolean isSpecialCase = true;
// Handle special cases
- switch (args[0]) {
- case "--autofill":
- dumpAutofillManager(prefix, writer, args);
+ switch (arg) {
+ case DUMP_ARG_AUTOFILL:
+ dumpLegacyDumpable(prefix, writer, arg,
+ AutofillClientController.DUMPABLE_NAME);
return;
- case "--contentcapture":
- dumpContentCaptureManager(prefix, writer);
+ case DUMP_ARG_CONTENT_CAPTURE:
+ dumpLegacyDumpable(prefix, writer, arg,
+ ContentCaptureManager.DUMPABLE_NAME);
return;
- case "--translation":
- dumpUiTranslation(prefix, writer);
+ case DUMP_ARG_TRANSLATION:
+ dumpLegacyDumpable(prefix, writer, arg,
+ UiTranslationController.DUMPABLE_NAME);
return;
- case "--list-dumpables":
+ case DUMP_ARG_LIST_DUMPABLES:
if (mDumpableContainer == null) {
writer.print(prefix); writer.println("No dumpables");
- return;
+ } else {
+ mDumpableContainer.listDumpables(prefix, writer);
}
mDumpableContainer.listDumpables(prefix, writer);
return;
- case "--dump-dumpable":
+ case DUMP_ARG_DUMP_DUMPABLE:
if (args.length == 1) {
- writer.println("--dump-dumpable requires the dumpable name");
- return;
- }
- if (mDumpableContainer == null) {
+ writer.print(DUMP_ARG_DUMP_DUMPABLE);
+ writer.println(" requires the dumpable name");
+ } else if (mDumpableContainer == null) {
writer.println("no dumpables");
- return;
+ } else {
+ // Strips --dump-dumpable NAME
+ String[] prunedArgs = new String[args.length - 2];
+ System.arraycopy(args, 2, prunedArgs, 0, prunedArgs.length);
+ mDumpableContainer.dumpOneDumpable(prefix, writer, args[1], prunedArgs);
}
- // Strips --dump-dumpable NAME
- String[] prunedArgs = new String[args.length - 2];
- System.arraycopy(args, 2, prunedArgs, 0, prunedArgs.length);
- mDumpableContainer.dumpOneDumpable(prefix, writer, args[1], prunedArgs);
- return;
+ break;
+ default:
+ isSpecialCase = false;
+ break;
+ }
+ if (isSpecialCase) {
+ dumpInternalState = !CompatChanges.isChangeEnabled(DUMP_IGNORES_SPECIAL_ARGS);
}
}
- dump(prefix, fd, writer, args);
+
+ if (dumpInternalState) {
+ dump(prefix, fd, writer, args);
+ } else {
+ Log.i(TAG, "Not calling dump() on " + this + " because of special argument " + arg);
+ }
}
void dumpInner(@NonNull String prefix, @Nullable FileDescriptor fd,
@@ -7428,26 +7488,10 @@
}
}
- private void dumpContentCaptureManager(String prefix, PrintWriter writer) {
- getContentCaptureManager();
- dumpLegacyDumpable(prefix, writer, ContentCaptureManager.DUMPABLE_NAME, /* args= */ null);
- }
-
- private void dumpUiTranslation(String prefix, PrintWriter writer) {
- dumpLegacyDumpable(prefix, writer, UiTranslationController.DUMPABLE_NAME, /* args= */ null);
- }
-
- private void dumpAutofillManager(String prefix, PrintWriter writer, String[] args) {
- dumpLegacyDumpable(prefix, writer, AutofillClientController.DUMPABLE_NAME, args);
- }
-
- private void dumpLegacyDumpable(@NonNull String prefix, @NonNull PrintWriter writer,
- @NonNull String dumpableName, @Nullable String[] args) {
- if (mDumpableContainer == null) {
- writer.print(prefix); writer.print("no "); writer.println(dumpableName);
- return;
- }
- mDumpableContainer.dumpOneDumpable(prefix, writer, dumpableName, args);
+ private void dumpLegacyDumpable(String prefix, PrintWriter writer, String legacyOption,
+ String dumpableName) {
+ writer.printf("%s%s option deprecated. Use %s %s instead\n", prefix, legacyOption,
+ DUMP_ARG_DUMP_DUMPABLE, dumpableName);
}
/**
diff --git a/core/java/android/app/ActivityClient.java b/core/java/android/app/ActivityClient.java
index 4715e0f..cf8480c 100644
--- a/core/java/android/app/ActivityClient.java
+++ b/core/java/android/app/ActivityClient.java
@@ -324,6 +324,14 @@
}
}
+ void setPreferDockBigOverlays(IBinder token, boolean preferDockBigOverlays) {
+ try {
+ getActivityClientController().setPreferDockBigOverlays(token, preferDockBigOverlays);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
void toggleFreeformWindowingMode(IBinder token) {
try {
getActivityClientController().toggleFreeformWindowingMode(token);
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 294621e..9fe8e79 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -826,4 +826,14 @@
* Register the bind service event listener callback.
*/
public abstract void addBindServiceEventListener(@NonNull BindServiceEventListener listener);
+
+ /**
+ * Restart android.
+ */
+ public abstract void restart();
+
+ /**
+ * Returns some summary statistics of the current PendingIntent queue - sizes and counts.
+ */
+ public abstract List<PendingIntentStats> getPendingIntentStats();
}
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 5012121..5ddaa80 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -350,6 +350,10 @@
/** See {@link #setTransientLaunch()}. */
private static final String KEY_TRANSIENT_LAUNCH = "android.activity.transientLaunch";
+ /** see {@link #makeLaunchIntoPip(PictureInPictureParams)}. */
+ private static final String KEY_LAUNCH_INTO_PIP_PARAMS =
+ "android.activity.launchIntoPipParams";
+
/**
* @see #setLaunchCookie
* @hide
@@ -444,6 +448,7 @@
private boolean mRemoveWithTaskOrganizer;
private boolean mLaunchedFromBubble;
private boolean mTransientLaunch;
+ private PictureInPictureParams mLaunchIntoPipParams;
/**
* Create an ActivityOptions specifying a custom animation to run when
@@ -1106,6 +1111,24 @@
return opts;
}
+ /**
+ * Creates an {@link ActivityOptions} instance that launch into picture-in-picture.
+ * This is normally used by a Host activity to start another activity that will directly enter
+ * picture-in-picture upon its creation.
+ * @param pictureInPictureParams {@link PictureInPictureParams} for launching the Activity to
+ * picture-in-picture mode.
+ */
+ @NonNull
+ public static ActivityOptions makeLaunchIntoPip(
+ @NonNull PictureInPictureParams pictureInPictureParams) {
+ final ActivityOptions opts = new ActivityOptions();
+ opts.mLaunchIntoPipParams = new PictureInPictureParams.Builder(pictureInPictureParams)
+ .setIsLaunchIntoPip(true)
+ .build();
+ opts.mLaunchBounds = new Rect(pictureInPictureParams.getSourceRectHint());
+ return opts;
+ }
+
/** @hide */
public boolean getLaunchTaskBehind() {
return mAnimationType == ANIM_LAUNCH_TASK_BEHIND;
@@ -1219,6 +1242,7 @@
mLaunchedFromBubble = opts.getBoolean(KEY_LAUNCHED_FROM_BUBBLE);
mTransientLaunch = opts.getBoolean(KEY_TRANSIENT_LAUNCH);
mSplashScreenStyle = opts.getInt(KEY_SPLASH_SCREEN_STYLE);
+ mLaunchIntoPipParams = opts.getParcelable(KEY_LAUNCH_INTO_PIP_PARAMS);
}
/**
@@ -1556,6 +1580,23 @@
mLaunchWindowingMode = windowingMode;
}
+ /**
+ * @return {@link PictureInPictureParams} used to launch into PiP mode.
+ * @hide
+ */
+ public PictureInPictureParams getLaunchIntoPipParams() {
+ return mLaunchIntoPipParams;
+ }
+
+ /**
+ * @return {@code true} if this instance is used to launch into PiP mode.
+ * @hide
+ */
+ public boolean isLaunchIntoPip() {
+ return mLaunchIntoPipParams != null
+ && mLaunchIntoPipParams.isLaunchIntoPip();
+ }
+
/** @hide */
public int getLaunchActivityType() {
return mLaunchActivityType;
@@ -1867,6 +1908,7 @@
mAnimationFinishedListener = otherOptions.mAnimationFinishedListener;
mSpecsFuture = otherOptions.mSpecsFuture;
mRemoteAnimationAdapter = otherOptions.mRemoteAnimationAdapter;
+ mLaunchIntoPipParams = otherOptions.mLaunchIntoPipParams;
}
/**
@@ -2039,6 +2081,9 @@
if (mSplashScreenStyle != 0) {
b.putInt(KEY_SPLASH_SCREEN_STYLE, mSplashScreenStyle);
}
+ if (mLaunchIntoPipParams != null) {
+ b.putParcelable(KEY_LAUNCH_INTO_PIP_PARAMS, mLaunchIntoPipParams);
+ }
return b;
}
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 0d1bc05..7c7c7ef 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -2687,7 +2687,7 @@
AppOpsManager.MODE_ALLOWED, // READ_ICC_SMS
AppOpsManager.MODE_ALLOWED, // WRITE_ICC_SMS
AppOpsManager.MODE_DEFAULT, // WRITE_SETTINGS
- getSystemAlertWindowDefault(), // SYSTEM_ALERT_WINDOW
+ AppOpsManager.MODE_DEFAULT, // SYSTEM_ALERT_WINDOW /*Overridden in opToDefaultMode()*/
AppOpsManager.MODE_ALLOWED, // ACCESS_NOTIFICATIONS
AppOpsManager.MODE_ALLOWED, // CAMERA
AppOpsManager.MODE_ALLOWED, // RECORD_AUDIO
@@ -3011,6 +3011,8 @@
private static final String DEBUG_LOGGING_OPS_PROP = "appops.logging_ops";
private static final String DEBUG_LOGGING_TAG = "AppOpsManager";
+ private static volatile Integer sOpSystemAlertWindowDefaultMode;
+
/**
* Retrieve the op switch that controls the given operation.
* @hide
@@ -3109,6 +3111,9 @@
* @hide
*/
public static @Mode int opToDefaultMode(int op) {
+ if (op == OP_SYSTEM_ALERT_WINDOW) {
+ return getSystemAlertWindowDefault();
+ }
return sOpDefaultMode[op];
}
@@ -10113,6 +10118,11 @@
}
private static int getSystemAlertWindowDefault() {
+ // This is indeed racy but we aren't expecting the result to change so it's not worth
+ // the synchronization.
+ if (sOpSystemAlertWindowDefaultMode != null) {
+ return sOpSystemAlertWindowDefaultMode;
+ }
final Context context = ActivityThread.currentApplication();
if (context == null) {
return AppOpsManager.MODE_DEFAULT;
@@ -10123,10 +10133,11 @@
// TVs are constantly plugged in and has less concern for memory/power
if (ActivityManager.isLowRamDeviceStatic()
&& !pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK, 0)) {
- return AppOpsManager.MODE_IGNORED;
+ sOpSystemAlertWindowDefaultMode = AppOpsManager.MODE_IGNORED;
+ } else {
+ sOpSystemAlertWindowDefaultMode = AppOpsManager.MODE_DEFAULT;
}
-
- return AppOpsManager.MODE_DEFAULT;
+ return sOpSystemAlertWindowDefaultMode;
}
/**
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index aa6c184..569fda9 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -456,7 +456,8 @@
*/
protected void onStart() {
if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(true);
- if (mContext != null && !WindowOnBackInvokedDispatcher.shouldUseLegacyBack()) {
+ if (mContext != null
+ && WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(mContext)) {
// Add onBackPressed as default back behavior.
mDefaultBackCallback = new OnBackInvokedCallback() {
@Override
@@ -703,7 +704,7 @@
if ((keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE)
&& event.isTracking()
&& !event.isCanceled()
- && WindowOnBackInvokedDispatcher.shouldUseLegacyBack()) {
+ && !WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(mContext)) {
onBackPressed();
return true;
}
diff --git a/core/java/android/app/DreamManager.java b/core/java/android/app/DreamManager.java
index 34ae08fd..00af1c02 100644
--- a/core/java/android/app/DreamManager.java
+++ b/core/java/android/app/DreamManager.java
@@ -16,6 +16,8 @@
package android.app;
+import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -26,6 +28,8 @@
import android.content.Context;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.provider.Settings;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
@@ -48,6 +52,40 @@
}
/**
+ * Returns whether Settings.Secure.SCREENSAVER_ENABLED is enabled.
+ *
+ * @hide
+ */
+ @TestApi
+ public boolean isScreensaverEnabled() {
+ return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.SCREENSAVER_ENABLED, 0, UserHandle.USER_CURRENT) != 0;
+ }
+
+ /**
+ * Sets whether Settings.Secure.SCREENSAVER_ENABLED is enabled.
+ *
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(WRITE_SECURE_SETTINGS)
+ public void setScreensaverEnabled(boolean enabled) {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.SCREENSAVER_ENABLED, enabled ? 1 : 0, UserHandle.USER_CURRENT);
+ }
+
+ /**
+ * Returns whether dreams are supported.
+ *
+ * @hide
+ */
+ @TestApi
+ public boolean areDreamsSupported() {
+ return mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_dreamsSupported);
+ }
+
+ /**
* Starts dream service with name "name".
*
* <p>This is only used for testing the dream service APIs.
diff --git a/core/java/android/app/IActivityClientController.aidl b/core/java/android/app/IActivityClientController.aidl
index f9439cb..caf1c41b7 100644
--- a/core/java/android/app/IActivityClientController.aidl
+++ b/core/java/android/app/IActivityClientController.aidl
@@ -88,6 +88,7 @@
boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureParams params);
void setPictureInPictureParams(in IBinder token, in PictureInPictureParams params);
+ oneway void setPreferDockBigOverlays(in IBinder token, in boolean preferDockBigOverlays);
void toggleFreeformWindowingMode(in IBinder token);
oneway void startLockTaskModeByToken(in IBinder token);
diff --git a/core/java/android/app/IUiModeManager.aidl b/core/java/android/app/IUiModeManager.aidl
index 55afed2..2242224b 100644
--- a/core/java/android/app/IUiModeManager.aidl
+++ b/core/java/android/app/IUiModeManager.aidl
@@ -73,6 +73,7 @@
* @param nightModeCustomType
* @hide
*/
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
void setNightModeCustomType(int nightModeCustomType);
/**
@@ -82,6 +83,7 @@
* {@link #MODE_NIGHT_CUSTOM_TYPE_UNKNOWN}.
* @hide
*/
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
int getNightModeCustomType();
/**
@@ -113,6 +115,7 @@
* {@code nightModeCustomType}.
* @hide
*/
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
boolean setNightModeActivatedForCustomMode(int nightModeCustom, boolean active);
/**
diff --git a/core/java/android/window/IOnFpsCallbackListener.aidl b/core/java/android/app/PendingIntentStats.java
similarity index 63%
copy from core/java/android/window/IOnFpsCallbackListener.aidl
copy to core/java/android/app/PendingIntentStats.java
index 3091df3..111db3c 100644
--- a/core/java/android/window/IOnFpsCallbackListener.aidl
+++ b/core/java/android/app/PendingIntentStats.java
@@ -14,17 +14,20 @@
* limitations under the License.
*/
-package android.window;
+package android.app;
/**
+ * Data about pending intents - size and count, per UID that sent the intent.
* @hide
*/
-oneway interface IOnFpsCallbackListener {
+public class PendingIntentStats {
+ public final int uid;
+ public final int count;
+ public final int sizeKb;
- /**
- * Reports the fps from the registered task
- * @param fps The frame rate per second of the task that has the registered task id
- * and its children.
- */
- void onFpsReported(in float fps);
+ public PendingIntentStats(int uid, int count, int sizeKb) {
+ this.uid = uid;
+ this.count = count;
+ this.sizeKb = sizeKb;
+ }
}
diff --git a/core/java/android/app/PictureInPictureParams.java b/core/java/android/app/PictureInPictureParams.java
index 18343fd..2d2788c 100644
--- a/core/java/android/app/PictureInPictureParams.java
+++ b/core/java/android/app/PictureInPictureParams.java
@@ -51,19 +51,46 @@
private List<RemoteAction> mUserActions;
@Nullable
+ private RemoteAction mCloseAction;
+
+ @Nullable
private Rect mSourceRectHint;
private Boolean mAutoEnterEnabled;
private Boolean mSeamlessResizeEnabled;
+ private CharSequence mTitle;
+
+ private CharSequence mSubtitle;
+
+ private Boolean mIsLaunchIntoPip;
+
+ /** Default constructor */
+ public Builder() {}
+
+ /**
+ * Copy constructor
+ * @param original {@link PictureInPictureParams} instance this builder is built upon.
+ */
+ public Builder(@NonNull PictureInPictureParams original) {
+ mAspectRatio = original.mAspectRatio;
+ mUserActions = original.mUserActions;
+ mCloseAction = original.mCloseAction;
+ mSourceRectHint = original.mSourceRectHint;
+ mAutoEnterEnabled = original.mAutoEnterEnabled;
+ mSeamlessResizeEnabled = original.mSeamlessResizeEnabled;
+ mTitle = original.mTitle;
+ mSubtitle = original.mSubtitle;
+ mIsLaunchIntoPip = original.mIsLaunchIntoPip;
+ }
+
/**
* Sets the aspect ratio. This aspect ratio is defined as the desired width / height, and
* does not change upon device rotation.
*
* @param aspectRatio the new aspect ratio for the activity in picture-in-picture, must be
- * between 2.39:1 and 1:2.39 (inclusive).
- *
+ * between 2.39:1 and 1:2.39 (inclusive).
* @return this builder instance.
*/
public Builder setAspectRatio(Rational aspectRatio) {
@@ -111,6 +138,25 @@
}
/**
+ * Sets a close action that should be invoked before the default close PiP action. The
+ * custom action must close the activity quickly using {@link Activity#finish()}.
+ * Otherwise, the system will forcibly close the PiP as if no custom close action was
+ * provided.
+ *
+ * If the action matches one set via {@link PictureInPictureParams.Builder#setActions(List)}
+ * it may be shown in place of that custom action in the menu.
+ *
+ * @param action to replace the system close action
+ * @return this builder instance.
+ * @see RemoteAction
+ */
+ @NonNull
+ public Builder setCloseAction(@Nullable RemoteAction action) {
+ mCloseAction = action;
+ return this;
+ }
+
+ /**
* Sets the source bounds hint. These bounds are only used when an activity first enters
* picture-in-picture, and describe the bounds in window coordinates of activity entering
* picture-in-picture that will be visible following the transition. For the best effect,
@@ -168,6 +214,50 @@
}
/**
+ * Sets a title for the picture-in-picture window, which may be displayed by the system to
+ * give the user information about what this PIP is generally being used for.
+ *
+ * @param title General information about the PIP content
+ * @return this builder instance.
+ */
+ @NonNull
+ public Builder setTitle(@Nullable CharSequence title) {
+ mTitle = title;
+ return this;
+ }
+
+ /**
+ * Sets a subtitle for the picture-in-picture window, which may be displayed by the system
+ * to give the user more detailed information about what this PIP is displaying.<br/>
+ *
+ * Setting a title via {@link PictureInPictureParams.Builder#setTitle(CharSequence)} should
+ * be prioritized.
+ *
+ * @param subtitle Details about the PIP content.
+ * @return this builder instance
+ */
+ @NonNull
+ public Builder setSubtitle(@Nullable CharSequence subtitle) {
+ mSubtitle = subtitle;
+ return this;
+ }
+
+ /**
+ * Sets whether the built {@link PictureInPictureParams} represents a launch into
+ * picture-in-picture request.
+ *
+ * This property is {@code false} by default.
+ * @param isLaunchIntoPip {@code true} if the built instance represents a launch into
+ * picture-in-picture request
+ * @return this builder instance.
+ */
+ @NonNull
+ Builder setIsLaunchIntoPip(boolean isLaunchIntoPip) {
+ mIsLaunchIntoPip = isLaunchIntoPip;
+ return this;
+ }
+
+ /**
* @return an immutable {@link PictureInPictureParams} to be used when entering or updating
* the activity in picture-in-picture.
*
@@ -176,8 +266,9 @@
*/
public PictureInPictureParams build() {
PictureInPictureParams params = new PictureInPictureParams(mAspectRatio,
- mExpandedAspectRatio, mUserActions,
- mSourceRectHint, mAutoEnterEnabled, mSeamlessResizeEnabled);
+ mExpandedAspectRatio, mUserActions, mCloseAction, mSourceRectHint,
+ mAutoEnterEnabled, mSeamlessResizeEnabled, mTitle, mSubtitle,
+ mIsLaunchIntoPip);
return params;
}
}
@@ -201,6 +292,12 @@
private List<RemoteAction> mUserActions;
/**
+ * Action to replace the system close action.
+ */
+ @Nullable
+ private RemoteAction mCloseAction;
+
+ /**
* The source bounds hint used when entering picture-in-picture, relative to the window bounds.
* We can use this internally for the transition into picture-in-picture to ensure that a
* particular source rect is visible throughout the whole transition.
@@ -221,6 +318,25 @@
*/
private Boolean mSeamlessResizeEnabled;
+ /**
+ * Title of the picture-in-picture window to be displayed to the user.
+ */
+ @Nullable
+ private CharSequence mTitle;
+
+ /**
+ * Subtitle for the picture-in-picture window to be displayed to the user.
+ */
+ @Nullable
+ private CharSequence mSubtitle;
+
+ /**
+ * Whether this {@link PictureInPictureParams} represents a launch into
+ * picture-in-picture request.
+ * {@link #isLaunchIntoPip()} defaults to {@code false} is this is not set.
+ */
+ private Boolean mIsLaunchIntoPip;
+
/** {@hide} */
PictureInPictureParams() {
}
@@ -233,6 +349,7 @@
mUserActions = new ArrayList<>();
in.readTypedList(mUserActions, RemoteAction.CREATOR);
}
+ mCloseAction = in.readTypedObject(RemoteAction.CREATOR);
if (in.readInt() != 0) {
mSourceRectHint = Rect.CREATOR.createFromParcel(in);
}
@@ -242,18 +359,32 @@
if (in.readInt() != 0) {
mSeamlessResizeEnabled = in.readBoolean();
}
+ if (in.readInt() != 0) {
+ mTitle = in.readCharSequence();
+ }
+ if (in.readInt() != 0) {
+ mSubtitle = in.readCharSequence();
+ }
+ if (in.readInt() != 0) {
+ mIsLaunchIntoPip = in.readBoolean();
+ }
}
/** {@hide} */
PictureInPictureParams(Rational aspectRatio, Rational expandedAspectRatio,
- List<RemoteAction> actions, Rect sourceRectHint, Boolean autoEnterEnabled,
- Boolean seamlessResizeEnabled) {
+ List<RemoteAction> actions, RemoteAction closeAction, Rect sourceRectHint,
+ Boolean autoEnterEnabled, Boolean seamlessResizeEnabled, CharSequence title,
+ CharSequence subtitle, Boolean isLaunchIntoPip) {
mAspectRatio = aspectRatio;
mExpandedAspectRatio = expandedAspectRatio;
mUserActions = actions;
+ mCloseAction = closeAction;
mSourceRectHint = sourceRectHint;
mAutoEnterEnabled = autoEnterEnabled;
mSeamlessResizeEnabled = seamlessResizeEnabled;
+ mTitle = title;
+ mSubtitle = subtitle;
+ mIsLaunchIntoPip = isLaunchIntoPip;
}
/**
@@ -261,9 +392,10 @@
* @hide
*/
public PictureInPictureParams(PictureInPictureParams other) {
- this(other.mAspectRatio, other.mExpandedAspectRatio, other.mUserActions,
+ this(other.mAspectRatio, other.mExpandedAspectRatio, other.mUserActions, other.mCloseAction,
other.hasSourceBoundsHint() ? new Rect(other.getSourceRectHint()) : null,
- other.mAutoEnterEnabled, other.mSeamlessResizeEnabled);
+ other.mAutoEnterEnabled, other.mSeamlessResizeEnabled,
+ other.mTitle, other.mSubtitle, other.mIsLaunchIntoPip);
}
/**
@@ -281,6 +413,9 @@
if (otherArgs.hasSetActions()) {
mUserActions = otherArgs.mUserActions;
}
+ if (otherArgs.hasSetCloseAction()) {
+ mCloseAction = otherArgs.mCloseAction;
+ }
if (otherArgs.hasSourceBoundsHint()) {
mSourceRectHint = new Rect(otherArgs.getSourceRectHint());
}
@@ -290,6 +425,15 @@
if (otherArgs.mSeamlessResizeEnabled != null) {
mSeamlessResizeEnabled = otherArgs.mSeamlessResizeEnabled;
}
+ if (otherArgs.hasSetTitle()) {
+ mTitle = otherArgs.mTitle;
+ }
+ if (otherArgs.hasSetSubtitle()) {
+ mSubtitle = otherArgs.mSubtitle;
+ }
+ if (otherArgs.mIsLaunchIntoPip != null) {
+ mIsLaunchIntoPip = otherArgs.mIsLaunchIntoPip;
+ }
}
/**
@@ -355,7 +499,26 @@
}
/**
+ * @return the close action.
+ * @hide
+ */
+ @TestApi
+ @Nullable
+ public RemoteAction getCloseAction() {
+ return mCloseAction;
+ }
+
+ /**
+ * @return whether the close action was set.
+ * @hide
+ */
+ public boolean hasSetCloseAction() {
+ return mCloseAction != null;
+ }
+
+ /**
* Truncates the set of actions to the given {@param size}.
+ *
* @hide
*/
public void truncateActions(int size) {
@@ -399,13 +562,58 @@
}
/**
+ * @return whether a title was set.
+ * @hide
+ */
+ public boolean hasSetTitle() {
+ return mTitle != null;
+ }
+
+ /**
+ * @return title of the pip.
+ * @hide
+ */
+ @TestApi
+ @Nullable
+ public CharSequence getTitle() {
+ return mTitle;
+ }
+
+ /**
+ * @return whether a subtitle was set.
+ * @hide
+ */
+ public boolean hasSetSubtitle() {
+ return mSubtitle != null;
+ }
+
+ /**
+ * @return subtitle of the pip.
+ * @hide
+ */
+ @TestApi
+ @Nullable
+ public CharSequence getSubtitle() {
+ return mSubtitle;
+ }
+
+ /**
+ * @return whether this {@link PictureInPictureParams} represents a launch into pip request.
+ * @hide
+ */
+ public boolean isLaunchIntoPip() {
+ return mIsLaunchIntoPip == null ? false : mIsLaunchIntoPip;
+ }
+
+ /**
* @return True if no parameters are set
* @hide
*/
public boolean empty() {
- return !hasSourceBoundsHint() && !hasSetActions() && !hasSetAspectRatio()
- && !hasSetExpandedAspectRatio() && mAutoEnterEnabled != null
- && mSeamlessResizeEnabled != null;
+ return !hasSourceBoundsHint() && !hasSetActions() && !hasSetCloseAction()
+ && !hasSetAspectRatio() && !hasSetExpandedAspectRatio() && mAutoEnterEnabled == null
+ && mSeamlessResizeEnabled == null && !hasSetTitle()
+ && !hasSetSubtitle() && mIsLaunchIntoPip == null;
}
@Override
@@ -418,13 +626,18 @@
&& Objects.equals(mAspectRatio, that.mAspectRatio)
&& Objects.equals(mExpandedAspectRatio, that.mExpandedAspectRatio)
&& Objects.equals(mUserActions, that.mUserActions)
- && Objects.equals(mSourceRectHint, that.mSourceRectHint);
+ && Objects.equals(mCloseAction, that.mCloseAction)
+ && Objects.equals(mSourceRectHint, that.mSourceRectHint)
+ && Objects.equals(mTitle, that.mTitle)
+ && Objects.equals(mSubtitle, that.mSubtitle)
+ && Objects.equals(mIsLaunchIntoPip, that.mIsLaunchIntoPip);
}
@Override
public int hashCode() {
- return Objects.hash(mAspectRatio, mExpandedAspectRatio, mUserActions, mSourceRectHint,
- mAutoEnterEnabled, mSeamlessResizeEnabled);
+ return Objects.hash(mAspectRatio, mExpandedAspectRatio, mUserActions, mCloseAction,
+ mSourceRectHint, mAutoEnterEnabled, mSeamlessResizeEnabled, mTitle, mSubtitle,
+ mIsLaunchIntoPip);
}
@Override
@@ -442,6 +655,9 @@
} else {
out.writeInt(0);
}
+
+ out.writeTypedObject(mCloseAction, 0);
+
if (mSourceRectHint != null) {
out.writeInt(1);
mSourceRectHint.writeToParcel(out, 0);
@@ -460,6 +676,24 @@
} else {
out.writeInt(0);
}
+ if (mTitle != null) {
+ out.writeInt(1);
+ out.writeCharSequence(mTitle);
+ } else {
+ out.writeInt(0);
+ }
+ if (mSubtitle != null) {
+ out.writeInt(1);
+ out.writeCharSequence(mSubtitle);
+ } else {
+ out.writeInt(0);
+ }
+ if (mIsLaunchIntoPip != null) {
+ out.writeInt(1);
+ out.writeBoolean(mIsLaunchIntoPip);
+ } else {
+ out.writeInt(0);
+ }
}
private void writeRationalToParcel(Rational rational, Parcel out) {
@@ -486,8 +720,12 @@
+ " expandedAspectRatio=" + mExpandedAspectRatio
+ " sourceRectHint=" + getSourceRectHint()
+ " hasSetActions=" + hasSetActions()
+ + " hasSetCloseAction=" + hasSetCloseAction()
+ " isAutoPipEnabled=" + isAutoEnterEnabled()
+ " isSeamlessResizeEnabled=" + isSeamlessResizeEnabled()
+ + " title=" + getTitle()
+ + " subtitle=" + getSubtitle()
+ + " isLaunchIntoPip=" + isLaunchIntoPip()
+ ")";
}
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 5f00342..0326e11 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -28,7 +28,11 @@
import android.content.ComponentName;
import android.content.Context;
import android.graphics.drawable.Icon;
+import android.media.INearbyMediaDevicesProvider;
+import android.media.INearbyMediaDevicesUpdateCallback;
import android.media.MediaRoute2Info;
+import android.media.NearbyDevice;
+import android.media.NearbyMediaDevicesProvider;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -46,6 +50,9 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
@@ -503,6 +510,16 @@
@Retention(RetentionPolicy.SOURCE)
public @interface MediaTransferReceiverState {}
+ /**
+ * A map from a provider registered in
+ * {@link #registerNearbyMediaDevicesProvider(NearbyMediaDevicesProvider)} to the wrapper
+ * around the provider that was created internally. We need the wrapper to make the provider
+ * binder-compatible, and we need to store a reference to the wrapper so that when the provider
+ * is un-registered, we un-register the saved wrapper instance.
+ */
+ private final Map<NearbyMediaDevicesProvider, NearbyMediaDevicesProviderWrapper>
+ nearbyMediaDevicesProviderMap = new HashMap<>();
+
@UnsupportedAppUsage
private Context mContext;
private IStatusBarService mService;
@@ -1033,6 +1050,67 @@
}
}
+ /**
+ * Registers a provider that notifies callbacks about the status of nearby devices that are able
+ * to play media.
+ * <p>
+ * If multiple providers are registered, all the providers will be used for nearby device
+ * information.
+ * <p>
+ * @param provider the nearby device information provider to register
+ * <p>
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+ public void registerNearbyMediaDevicesProvider(
+ @NonNull NearbyMediaDevicesProvider provider
+ ) {
+ Objects.requireNonNull(provider);
+ if (nearbyMediaDevicesProviderMap.containsKey(provider)) {
+ return;
+ }
+ try {
+ final IStatusBarService svc = getService();
+ NearbyMediaDevicesProviderWrapper providerWrapper =
+ new NearbyMediaDevicesProviderWrapper(provider);
+ nearbyMediaDevicesProviderMap.put(provider, providerWrapper);
+ svc.registerNearbyMediaDevicesProvider(providerWrapper);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Unregisters a provider that gives information about nearby devices that are able to play
+ * media.
+ * <p>
+ * See {@link registerNearbyMediaDevicesProvider}.
+ * <p>
+ * @param provider the nearby device information provider to unregister
+ * <p>
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+ public void unregisterNearbyMediaDevicesProvider(
+ @NonNull NearbyMediaDevicesProvider provider
+ ) {
+ Objects.requireNonNull(provider);
+ if (!nearbyMediaDevicesProviderMap.containsKey(provider)) {
+ return;
+ }
+ try {
+ final IStatusBarService svc = getService();
+ NearbyMediaDevicesProviderWrapper providerWrapper =
+ nearbyMediaDevicesProviderMap.get(provider);
+ nearbyMediaDevicesProviderMap.remove(provider);
+ svc.unregisterNearbyMediaDevicesProvider(providerWrapper);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** @hide */
public static String windowStateToString(int state) {
if (state == WINDOW_STATE_HIDING) return "WINDOW_STATE_HIDING";
@@ -1340,4 +1418,48 @@
}
}
}
+
+ /**
+ * @hide
+ */
+ static final class NearbyMediaDevicesProviderWrapper extends INearbyMediaDevicesProvider.Stub {
+ @NonNull
+ private final NearbyMediaDevicesProvider mProvider;
+ // Because we're wrapping a {@link NearbyMediaDevicesProvider} in a binder-compatible
+ // interface, we also need to wrap the callbacks that the provider receives. We use
+ // this map to keep track of the original callback and the wrapper callback so that
+ // unregistering the callback works correctly.
+ @NonNull
+ private final Map<INearbyMediaDevicesUpdateCallback, Consumer<List<NearbyDevice>>>
+ mRegisteredCallbacks = new HashMap<>();
+
+ NearbyMediaDevicesProviderWrapper(@NonNull NearbyMediaDevicesProvider provider) {
+ mProvider = provider;
+ }
+
+ @Override
+ public void registerNearbyDevicesCallback(
+ @NonNull INearbyMediaDevicesUpdateCallback callback) {
+ Consumer<List<NearbyDevice>> callbackAsConsumer = nearbyDevices -> {
+ try {
+ callback.onDevicesUpdated(nearbyDevices);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ };
+
+ mRegisteredCallbacks.put(callback, callbackAsConsumer);
+ mProvider.registerNearbyDevicesCallback(callbackAsConsumer);
+ }
+
+ @Override
+ public void unregisterNearbyDevicesCallback(
+ @NonNull INearbyMediaDevicesUpdateCallback callback) {
+ if (!mRegisteredCallbacks.containsKey(callback)) {
+ return;
+ }
+ mProvider.unregisterNearbyDevicesCallback(mRegisteredCallbacks.get(callback));
+ mRegisteredCallbacks.remove(callback);
+ }
+ }
}
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java
index 3d2c03d..5c7c73c 100644
--- a/core/java/android/app/TaskInfo.java
+++ b/core/java/android/app/TaskInfo.java
@@ -186,6 +186,18 @@
public PictureInPictureParams pictureInPictureParams;
/**
+ * @hide
+ */
+ public boolean preferDockBigOverlays;
+
+ /**
+ * The task id of the host Task of the launch-into-pip Activity, i.e., it points to the Task
+ * the launch-into-pip Activity is originated from.
+ * @hide
+ */
+ public int launchIntoPipHostTaskId;
+
+ /**
* The {@link Rect} copied from {@link DisplayCutout#getSafeInsets()} if the cutout is not of
* (LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS),
* {@code null} otherwise.
@@ -379,6 +391,12 @@
}
/** @hide */
+ @TestApi
+ public boolean getPreferDockBigOverlays() {
+ return preferDockBigOverlays;
+ }
+
+ /** @hide */
@WindowConfiguration.WindowingMode
public int getWindowingMode() {
return configuration.windowConfiguration.getWindowingMode();
@@ -447,6 +465,7 @@
&& displayAreaFeatureId == that.displayAreaFeatureId
&& Objects.equals(positionInParent, that.positionInParent)
&& Objects.equals(pictureInPictureParams, that.pictureInPictureParams)
+ && Objects.equals(preferDockBigOverlays, that.preferDockBigOverlays)
&& Objects.equals(displayCutoutInsets, that.displayCutoutInsets)
&& getWindowingMode() == that.getWindowingMode()
&& Objects.equals(taskDescription, that.taskDescription)
@@ -503,6 +522,8 @@
token = WindowContainerToken.CREATOR.createFromParcel(source);
topActivityType = source.readInt();
pictureInPictureParams = source.readTypedObject(PictureInPictureParams.CREATOR);
+ preferDockBigOverlays = source.readBoolean();
+ launchIntoPipHostTaskId = source.readInt();
displayCutoutInsets = source.readTypedObject(Rect.CREATOR);
topActivityInfo = source.readTypedObject(ActivityInfo.CREATOR);
isResizeable = source.readBoolean();
@@ -548,6 +569,8 @@
token.writeToParcel(dest, flags);
dest.writeInt(topActivityType);
dest.writeTypedObject(pictureInPictureParams, flags);
+ dest.writeBoolean(preferDockBigOverlays);
+ dest.writeInt(launchIntoPipHostTaskId);
dest.writeTypedObject(displayCutoutInsets, flags);
dest.writeTypedObject(topActivityInfo, flags);
dest.writeBoolean(isResizeable);
@@ -587,6 +610,8 @@
+ " token=" + token
+ " topActivityType=" + topActivityType
+ " pictureInPictureParams=" + pictureInPictureParams
+ + " preferDockBigOverlays=" + preferDockBigOverlays
+ + " launchIntoPipHostTaskId=" + launchIntoPipHostTaskId
+ " displayCutoutSafeInsets=" + displayCutoutInsets
+ " topActivityInfo=" + topActivityInfo
+ " launchCookies=" + launchCookies
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index cfaffb1..ecab37d 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -244,7 +244,18 @@
public static final int MODE_NIGHT_YES = 2;
/**
- * Granular types for {@link MODE_NIGHT_CUSTOM_TYPE_BEDTIME}
+ * Granular types for {@link #setNightModeCustomType(int)}
+ * @hide
+ */
+ @IntDef(prefix = { "MODE_NIGHT_CUSTOM_TYPE_" }, value = {
+ MODE_NIGHT_CUSTOM_TYPE_SCHEDULE,
+ MODE_NIGHT_CUSTOM_TYPE_BEDTIME,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface NightModeCustomType {}
+
+ /**
+ * Granular types for {@link #getNightModeCustomType()}
* @hide
*/
@IntDef(prefix = { "MODE_NIGHT_CUSTOM_TYPE_" }, value = {
@@ -253,7 +264,7 @@
MODE_NIGHT_CUSTOM_TYPE_BEDTIME,
})
@Retention(RetentionPolicy.SOURCE)
- public @interface NightModeCustomType {}
+ public @interface NightModeCustomReturnType {}
/**
* A granular type for {@link #MODE_NIGHT_CUSTOM} which is unknown.
@@ -539,6 +550,8 @@
* {@code nightModeCustomType}.
*
* @param nightModeCustomType
+ * @throws IllegalArgumentException if passed an unsupported type to
+ * {@code nightModeCustomType}.
* @hide
*/
@SystemApi
@@ -562,7 +575,7 @@
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
- public int getNightModeCustomType() {
+ public @NightModeCustomReturnType int getNightModeCustomType() {
if (mService != null) {
try {
return mService.getNightModeCustomType();
diff --git a/core/java/android/app/assist/OWNERS b/core/java/android/app/assist/OWNERS
index 46b5ea0..e857c72 100644
--- a/core/java/android/app/assist/OWNERS
+++ b/core/java/android/app/assist/OWNERS
@@ -1,7 +1,5 @@
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+joannechung@google.com
+markpun@google.com
+lpeter@google.com
+tymtsai@google.com
diff --git a/core/java/android/app/cloudsearch/SearchRequest.java b/core/java/android/app/cloudsearch/SearchRequest.java
index ef66c0c..4d6507a 100644
--- a/core/java/android/app/cloudsearch/SearchRequest.java
+++ b/core/java/android/app/cloudsearch/SearchRequest.java
@@ -83,11 +83,13 @@
* presubmit is the input before the user finishes the entire query, i.e. push "ENTER" or
* "SEARCH" button. After the user finishes the entire query, the behavior is postsubmit.
*/
- public static final String CONSTRAINT_IS_PRESUBMIT_SUGGESTION = "IS_PRESUBMIT_SUGGESTION";
+ public static final String CONSTRAINT_IS_PRESUBMIT_SUGGESTION =
+ "android.app.cloudsearch.IS_PRESUBMIT_SUGGESTION";
/** The target search provider list of package names(separated by ;), String value expected.
* If this is not provided or its value is empty, then no filter will be applied.
*/
- public static final String CONSTRAINT_SEARCH_PROVIDER_FILTER = "SEARCH_PROVIDER_FILTER";
+ public static final String CONSTRAINT_SEARCH_PROVIDER_FILTER =
+ "android.app.cloudsearch.SEARCH_PROVIDER_FILTER";
@NonNull
private Bundle mSearchConstraints;
diff --git a/core/java/android/app/cloudsearch/SearchResult.java b/core/java/android/app/cloudsearch/SearchResult.java
index 3403ab0..af8adac 100644
--- a/core/java/android/app/cloudsearch/SearchResult.java
+++ b/core/java/android/app/cloudsearch/SearchResult.java
@@ -75,47 +75,54 @@
EXTRAINFO_WEB_ICON})
public @interface SearchResultExtraInfoKey {}
/** This App developer website's domain URL, String value expected. */
- public static final String EXTRAINFO_APP_DOMAIN_URL = "APP_DOMAIN_URL";
+ public static final String EXTRAINFO_APP_DOMAIN_URL = "android.app.cloudsearch.APP_DOMAIN_URL";
/** This App icon, android.graphics.drawable.Icon expected. */
- public static final String EXTRAINFO_APP_ICON = "APP_ICON";
+ public static final String EXTRAINFO_APP_ICON = "android.app.cloudsearch.APP_ICON";
/** This App developer's name, String value expected. */
- public static final String EXTRAINFO_APP_DEVELOPER_NAME = "APP_DEVELOPER_NAME";
+ public static final String EXTRAINFO_APP_DEVELOPER_NAME =
+ "android.app.cloudsearch.APP_DEVELOPER_NAME";
/** This App's pkg size in bytes, Double value expected. */
- public static final String EXTRAINFO_APP_SIZE_BYTES = "APP_SIZE_BYTES";
+ public static final String EXTRAINFO_APP_SIZE_BYTES = "android.app.cloudsearch.APP_SIZE_BYTES";
/** This App developer's name, Double value expected. */
- public static final String EXTRAINFO_APP_STAR_RATING = "APP_STAR_RATING";
+ public static final String EXTRAINFO_APP_STAR_RATING =
+ "android.app.cloudsearch.APP_STAR_RATING";
/** This App's IARC rating, String value expected.
* IARC (International Age Rating Coalition) is partnered globally with major
* content rating organizations to provide a centralized and one-stop-shop for
* rating content on a global scale.
*/
- public static final String EXTRAINFO_APP_IARC = "APP_IARC";
+ public static final String EXTRAINFO_APP_IARC = "android.app.cloudsearch.APP_IARC";
/** This App's review count, Double value expected. */
- public static final String EXTRAINFO_APP_REVIEW_COUNT = "APP_REVIEW_COUNT";
+ public static final String EXTRAINFO_APP_REVIEW_COUNT =
+ "android.app.cloudsearch.APP_REVIEW_COUNT";
/** If this App contains the Ads Disclaimer, Boolean value expected. */
public static final String EXTRAINFO_APP_CONTAINS_ADS_DISCLAIMER =
- "APP_CONTAINS_ADS_DISCLAIMER";
+ "android.app.cloudsearch.APP_CONTAINS_ADS_DISCLAIMER";
/** If this App contains the IAP Disclaimer, Boolean value expected. */
public static final String EXTRAINFO_APP_CONTAINS_IAP_DISCLAIMER =
- "APP_CONTAINS_IAP_DISCLAIMER";
+ "android.app.cloudsearch.APP_CONTAINS_IAP_DISCLAIMER";
/** This App's short description, String value expected. */
- public static final String EXTRAINFO_SHORT_DESCRIPTION = "SHORT_DESCRIPTION";
+ public static final String EXTRAINFO_SHORT_DESCRIPTION =
+ "android.app.cloudsearch.SHORT_DESCRIPTION";
/** This App's long description, String value expected. */
- public static final String EXTRAINFO_LONG_DESCRIPTION = "LONG_DESCRIPTION";
- /** This App's screenshots, List<ImageLoadingBundle> value expected. */
- public static final String EXTRAINFO_SCREENSHOTS = "SCREENSHOTS";
- /** Editor's choices for this App, ArrayList<String> value expected. */
- public static final String EXTRAINFO_APP_BADGES = "APP_BADGES";
+ public static final String EXTRAINFO_LONG_DESCRIPTION =
+ "android.app.cloudsearch.LONG_DESCRIPTION";
+ /** This App's screenshots, {@code List<ImageLoadingBundle>} value expected. */
+ public static final String EXTRAINFO_SCREENSHOTS = "android.app.cloudsearch.SCREENSHOTS";
+ /** Editor's choices for this App, {@code ArrayList<String>} value expected. */
+ public static final String EXTRAINFO_APP_BADGES = "android.app.cloudsearch.APP_BADGES";
/** Pre-registration game's action button text, String value expected. */
@SuppressLint("IntentName")
- public static final String EXTRAINFO_ACTION_BUTTON_TEXT_PREREGISTERING = "ACTION_BUTTON_TEXT";
+ public static final String EXTRAINFO_ACTION_BUTTON_TEXT_PREREGISTERING =
+ "android.app.cloudsearch.ACTION_BUTTON_TEXT";
/** Pre-registration game's action button image, ImageLoadingBundle value expected. */
@SuppressLint("IntentName")
- public static final String EXTRAINFO_ACTION_BUTTON_IMAGE_PREREGISTERING = "ACTION_BUTTON_IMAGE";
+ public static final String EXTRAINFO_ACTION_BUTTON_IMAGE_PREREGISTERING =
+ "android.app.cloudsearch.ACTION_BUTTON_IMAGE";
/** Web content's URL, String value expected. */
- public static final String EXTRAINFO_WEB_URL = "WEB_URL";
+ public static final String EXTRAINFO_WEB_URL = "android.app.cloudsearch.WEB_URL";
/** Web content's domain icon, android.graphics.drawable.Icon expected. */
- public static final String EXTRAINFO_WEB_ICON = "WEB_ICON";
+ public static final String EXTRAINFO_WEB_ICON = "android.app.cloudsearch.WEB_ICON";
@NonNull
private Bundle mExtraInfos;
diff --git a/core/java/android/app/contentsuggestions/OWNERS b/core/java/android/app/contentsuggestions/OWNERS
index 482abb2..cf54c2a 100644
--- a/core/java/android/app/contentsuggestions/OWNERS
+++ b/core/java/android/app/contentsuggestions/OWNERS
@@ -1,9 +1,7 @@
# Bug component: 643919
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+joannechung@google.com
+markpun@google.com
+lpeter@google.com
+tymtsai@google.com
diff --git a/core/java/android/app/smartspace/SmartspaceTarget.java b/core/java/android/app/smartspace/SmartspaceTarget.java
index 78f51be..fd7088f 100644
--- a/core/java/android/app/smartspace/SmartspaceTarget.java
+++ b/core/java/android/app/smartspace/SmartspaceTarget.java
@@ -20,7 +20,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.app.smartspace.uitemplatedata.SmartspaceDefaultUiTemplateData;
+import android.app.smartspace.uitemplatedata.BaseTemplateData;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.net.Uri;
@@ -133,7 +133,7 @@
private final AppWidgetProviderInfo mWidget;
@Nullable
- private final SmartspaceDefaultUiTemplateData mTemplateData;
+ private final BaseTemplateData mTemplateData;
public static final int FEATURE_UNDEFINED = 0;
public static final int FEATURE_WEATHER = 1;
@@ -194,15 +194,25 @@
}
public static final int UI_TEMPLATE_UNDEFINED = 0;
+ // Default template whose data is represented by {@link BaseTemplateData}. The default
+ // template is also a base card for the other types of templates.
public static final int UI_TEMPLATE_DEFAULT = 1;
+ // Sub-image template whose data is represented by {@link SubImageTemplateData}
public static final int UI_TEMPLATE_SUB_IMAGE = 2;
+ // Sub-list template whose data is represented by {@link SubListTemplateData}
public static final int UI_TEMPLATE_SUB_LIST = 3;
+ // Carousel template whose data is represented by {@link CarouselTemplateData}
public static final int UI_TEMPLATE_CAROUSEL = 4;
+ // Head-to-head template whose data is represented by {@link HeadToHeadTemplateData}
public static final int UI_TEMPLATE_HEAD_TO_HEAD = 5;
+ // Combined-cards template whose data is represented by {@link CombinedCardsTemplateData}
public static final int UI_TEMPLATE_COMBINED_CARDS = 6;
+ // Sub-card template whose data is represented by {@link SubCardTemplateData}
public static final int UI_TEMPLATE_SUB_CARD = 7;
/**
+ * The types of the Smartspace ui templates.
+ *
* @hide
*/
@IntDef(prefix = {"UI_TEMPLATE_"}, value = {
@@ -237,7 +247,7 @@
this.mAssociatedSmartspaceTargetId = in.readString();
this.mSliceUri = in.readTypedObject(Uri.CREATOR);
this.mWidget = in.readTypedObject(AppWidgetProviderInfo.CREATOR);
- this.mTemplateData = in.readTypedObject(SmartspaceDefaultUiTemplateData.CREATOR);
+ this.mTemplateData = in.readTypedObject(BaseTemplateData.CREATOR);
}
private SmartspaceTarget(String smartspaceTargetId,
@@ -248,7 +258,7 @@
boolean shouldShowExpanded, String sourceNotificationKey,
ComponentName componentName, UserHandle userHandle,
String associatedSmartspaceTargetId, Uri sliceUri,
- AppWidgetProviderInfo widget, SmartspaceDefaultUiTemplateData templateData) {
+ AppWidgetProviderInfo widget, BaseTemplateData templateData) {
mSmartspaceTargetId = smartspaceTargetId;
mHeaderAction = headerAction;
mBaseAction = baseAction;
@@ -406,7 +416,7 @@
* Returns the UI template data.
*/
@Nullable
- public SmartspaceDefaultUiTemplateData getTemplateData() {
+ public BaseTemplateData getTemplateData() {
return mTemplateData;
}
@@ -536,7 +546,7 @@
private String mAssociatedSmartspaceTargetId;
private Uri mSliceUri;
private AppWidgetProviderInfo mWidget;
- private SmartspaceDefaultUiTemplateData mTemplateData;
+ private BaseTemplateData mTemplateData;
/**
* A builder for {@link SmartspaceTarget}.
@@ -689,7 +699,7 @@
*/
@NonNull
public Builder setTemplateData(
- @Nullable SmartspaceDefaultUiTemplateData templateData) {
+ @Nullable BaseTemplateData templateData) {
mTemplateData = templateData;
return this;
}
diff --git a/core/java/android/app/smartspace/SmartspaceUtils.java b/core/java/android/app/smartspace/SmartspaceUtils.java
index 4545f43..cad4453 100644
--- a/core/java/android/app/smartspace/SmartspaceUtils.java
+++ b/core/java/android/app/smartspace/SmartspaceUtils.java
@@ -17,7 +17,7 @@
package android.app.smartspace;
import android.annotation.Nullable;
-import android.app.smartspace.uitemplatedata.SmartspaceText;
+import android.app.smartspace.uitemplatedata.Text;
import android.text.TextUtils;
/**
@@ -30,13 +30,13 @@
private SmartspaceUtils() {
}
- /** Returns true if the passed in {@link SmartspaceText} is null or its content is empty. */
- public static boolean isEmpty(@Nullable SmartspaceText text) {
+ /** Returns true if the passed in {@link Text} is null or its content is empty. */
+ public static boolean isEmpty(@Nullable Text text) {
return text == null || TextUtils.isEmpty(text.getText());
}
- /** Returns true if the passed-in {@link SmartspaceText}s are equal. */
- public static boolean isEqual(@Nullable SmartspaceText text1, @Nullable SmartspaceText text2) {
+ /** Returns true if the passed-in {@link Text}s are equal. */
+ public static boolean isEqual(@Nullable Text text1, @Nullable Text text2) {
if (text1 == null && text2 == null) return true;
if (text1 == null || text2 == null) return false;
return text1.equals(text2);
diff --git a/core/java/android/app/smartspace/uitemplatedata/BaseTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/BaseTemplateData.java
new file mode 100644
index 0000000..584b176
--- /dev/null
+++ b/core/java/android/app/smartspace/uitemplatedata/BaseTemplateData.java
@@ -0,0 +1,837 @@
+/*
+ * 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 android.app.smartspace.uitemplatedata;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.app.smartspace.SmartspaceTarget.UiTemplateType;
+import android.app.smartspace.SmartspaceUtils;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Holds all the relevant data needed to render a Smartspace card with the default Ui Template.
+ * <ul>
+ * <li> title_text (may contain a start drawable) </li>
+ * <li> subtitle_text (may contain a start drawable) . supplemental_subtitle_text (may
+ * contain a start drawable) </li>
+ *
+ * <li> supplemental_text (contain a start drawable) . do_not_disturb_view </li>
+ * Or
+ * <li> next_alarm_text (contain a start drawable) + supplemental_alarm_text .
+ * do_not_disturb_view </li>
+ * </ul>
+ *
+ * @hide
+ */
+@SystemApi
+@SuppressLint("ParcelNotFinal")
+public class BaseTemplateData implements Parcelable {
+
+ /**
+ * {@link UiTemplateType} indicating the template type of this template data.
+ *
+ * @see UiTemplateType
+ */
+ @UiTemplateType
+ private final int mTemplateType;
+
+ /**
+ * Title text and title icon are shown at the first row. When both are absent, the date view
+ * will be used, which has its own tap action applied to the title area.
+ */
+ @Nullable
+ private final Text mTitleText;
+
+ @Nullable
+ private final Icon mTitleIcon;
+
+ /** Subtitle text and icon are shown at the second row. */
+ @Nullable
+ private final Text mSubtitleText;
+
+ @Nullable
+ private final Icon mSubtitleIcon;
+
+ /**
+ * Primary tap action for the entire card, including the blank spaces, except: 1. When title is
+ * absent, the date view's default tap action is used; 2. Supplemental subtitle uses its own tap
+ * action if being set; 3. Secondary card uses its own tap action if being set.
+ */
+ @Nullable
+ private final TapAction mPrimaryTapAction;
+
+ /**
+ * Primary logging info for the entire card. This will only be used when rendering a sub card
+ * within the base card. For the base card itself, BcSmartspaceCardLoggingInfo should be used,
+ * which has the display-specific info (e.g. display surface).
+ */
+ @Nullable
+ private final SubItemLoggingInfo mPrimaryLoggingInfo;
+
+ /**
+ * Supplemental subtitle text and icon are shown at the second row following the subtitle text.
+ * Mainly used for weather info on non-weather card.
+ */
+ @Nullable
+ private final Text mSupplementalSubtitleText;
+
+ @Nullable
+ private final Icon mSupplementalSubtitleIcon;
+
+ /**
+ * Tap action for the supplemental subtitle's text and icon. Uses the primary tap action if
+ * not being set.
+ */
+ @Nullable
+ private final TapAction mSupplementalSubtitleTapAction;
+
+ /**
+ * Logging info for the supplemental subtitle's are. Uses the primary logging info if not being
+ * set.
+ */
+ @Nullable
+ private final SubItemLoggingInfo mSupplementalSubtitleLoggingInfo;
+
+ @Nullable
+ private final Text mSupplementalText;
+
+ @Nullable
+ private final Icon mSupplementalIcon;
+
+ @Nullable
+ private final TapAction mSupplementalTapAction;
+
+ /**
+ * Logging info for the supplemental line. Uses the primary logging info if not being set.
+ */
+ @Nullable
+ private final SubItemLoggingInfo mSupplementalLoggingInfo;
+
+ /**
+ * Supplemental alarm text is specifically used for holiday alarm, which is appended to "next
+ * alarm".
+ */
+ @Nullable
+ private final Text mSupplementalAlarmText;
+
+ /**
+ * The layout weight info for the card, which indicates how much space it should occupy on the
+ * screen. Default weight is 0.
+ */
+ private final int mLayoutWeight;
+
+ BaseTemplateData(@NonNull Parcel in) {
+ mTemplateType = in.readInt();
+ mTitleText = in.readTypedObject(Text.CREATOR);
+ mTitleIcon = in.readTypedObject(Icon.CREATOR);
+ mSubtitleText = in.readTypedObject(Text.CREATOR);
+ mSubtitleIcon = in.readTypedObject(Icon.CREATOR);
+ mPrimaryTapAction = in.readTypedObject(TapAction.CREATOR);
+ mPrimaryLoggingInfo = in.readTypedObject(SubItemLoggingInfo.CREATOR);
+ mSupplementalSubtitleText = in.readTypedObject(Text.CREATOR);
+ mSupplementalSubtitleIcon = in.readTypedObject(Icon.CREATOR);
+ mSupplementalSubtitleTapAction = in.readTypedObject(TapAction.CREATOR);
+ mSupplementalSubtitleLoggingInfo = in.readTypedObject(SubItemLoggingInfo.CREATOR);
+ mSupplementalText = in.readTypedObject(Text.CREATOR);
+ mSupplementalIcon = in.readTypedObject(Icon.CREATOR);
+ mSupplementalTapAction = in.readTypedObject(TapAction.CREATOR);
+ mSupplementalLoggingInfo = in.readTypedObject(SubItemLoggingInfo.CREATOR);
+ mSupplementalAlarmText = in.readTypedObject(Text.CREATOR);
+ mLayoutWeight = in.readInt();
+ }
+
+ /**
+ * Should ONLY used by subclasses. For the general instance creation, please use
+ * SmartspaceDefaultUiTemplateData.Builder.
+ */
+ BaseTemplateData(@UiTemplateType int templateType,
+ @Nullable Text titleText,
+ @Nullable Icon titleIcon,
+ @Nullable Text subtitleText,
+ @Nullable Icon subtitleIcon,
+ @Nullable TapAction primaryTapAction,
+ @Nullable SubItemLoggingInfo primaryLoggingInfo,
+ @Nullable Text supplementalSubtitleText,
+ @Nullable Icon supplementalSubtitleIcon,
+ @Nullable TapAction supplementalSubtitleTapAction,
+ @Nullable SubItemLoggingInfo supplementalSubtitleLoggingInfo,
+ @Nullable Text supplementalText,
+ @Nullable Icon supplementalIcon,
+ @Nullable TapAction supplementalTapAction,
+ @Nullable SubItemLoggingInfo supplementalLoggingInfo,
+ @Nullable Text supplementalAlarmText,
+ int layoutWeight) {
+ mTemplateType = templateType;
+ mTitleText = titleText;
+ mTitleIcon = titleIcon;
+ mSubtitleText = subtitleText;
+ mSubtitleIcon = subtitleIcon;
+ mPrimaryTapAction = primaryTapAction;
+ mPrimaryLoggingInfo = primaryLoggingInfo;
+ mSupplementalSubtitleText = supplementalSubtitleText;
+ mSupplementalSubtitleIcon = supplementalSubtitleIcon;
+ mSupplementalSubtitleTapAction = supplementalSubtitleTapAction;
+ mSupplementalSubtitleLoggingInfo = supplementalSubtitleLoggingInfo;
+ mSupplementalText = supplementalText;
+ mSupplementalIcon = supplementalIcon;
+ mSupplementalTapAction = supplementalTapAction;
+ mSupplementalLoggingInfo = supplementalLoggingInfo;
+ mSupplementalAlarmText = supplementalAlarmText;
+ mLayoutWeight = layoutWeight;
+ }
+
+ /** Returns the template type. By default is UNDEFINED. */
+ @UiTemplateType
+ public int getTemplateType() {
+ return mTemplateType;
+ }
+
+ /** Returns the title's text. */
+ @Nullable
+ public Text getTitleText() {
+ return mTitleText;
+ }
+
+ /** Returns the title's icon. */
+ @Nullable
+ public Icon getTitleIcon() {
+ return mTitleIcon;
+ }
+
+ /** Returns the subtitle's text. */
+ @Nullable
+ public Text getSubtitleText() {
+ return mSubtitleText;
+ }
+
+ /** Returns the subtitle's icon. */
+ @Nullable
+ public Icon getSubtitleIcon() {
+ return mSubtitleIcon;
+ }
+
+ /** Returns the card's primary tap action. */
+ @Nullable
+ public TapAction getPrimaryTapAction() {
+ return mPrimaryTapAction;
+ }
+
+ /** Returns the card's primary logging info. */
+ @Nullable
+ public SubItemLoggingInfo getPrimaryLoggingInfo() {
+ return mPrimaryLoggingInfo;
+ }
+
+ /** Returns the supplemental subtitle's text. */
+ @Nullable
+ public Text getSupplementalSubtitleText() {
+ return mSupplementalSubtitleText;
+ }
+
+ /** Returns the supplemental subtitle's icon. */
+ @Nullable
+ public Icon getSupplementalSubtitleIcon() {
+ return mSupplementalSubtitleIcon;
+ }
+
+ /** Returns the supplemental subtitle's tap action. Can be null if not being set. */
+ @Nullable
+ public TapAction getSupplementalSubtitleTapAction() {
+ return mSupplementalSubtitleTapAction;
+ }
+
+ /** Returns the card's supplemental title's logging info. */
+ @Nullable
+ public SubItemLoggingInfo getSupplementalSubtitleLoggingInfo() {
+ return mSupplementalSubtitleLoggingInfo;
+ }
+
+ /** Returns the supplemental text. */
+ @Nullable
+ public Text getSupplementalText() {
+ return mSupplementalText;
+ }
+
+ /** Returns the supplemental icon. */
+ @Nullable
+ public Icon getSupplementalIcon() {
+ return mSupplementalIcon;
+ }
+
+ /** Returns the supplemental line's tap action. Can be null if not being set. */
+ @Nullable
+ public TapAction getSupplementalTapAction() {
+ return mSupplementalTapAction;
+ }
+
+ /** Returns the card's supplemental line logging info. */
+ @Nullable
+ public SubItemLoggingInfo getSupplementalLoggingInfo() {
+ return mSupplementalLoggingInfo;
+ }
+
+ /** Returns the supplemental alarm text. */
+ @Nullable
+ public Text getSupplementalAlarmText() {
+ return mSupplementalAlarmText;
+ }
+
+ /** Returns the card layout weight info. Default weight is 0. */
+ public int getLayoutWeight() {
+ return mLayoutWeight;
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<BaseTemplateData> CREATOR =
+ new Creator<BaseTemplateData>() {
+ @Override
+ public BaseTemplateData createFromParcel(Parcel in) {
+ return new BaseTemplateData(in);
+ }
+
+ @Override
+ public BaseTemplateData[] newArray(int size) {
+ return new BaseTemplateData[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ out.writeInt(mTemplateType);
+ out.writeTypedObject(mTitleText, flags);
+ out.writeTypedObject(mTitleIcon, flags);
+ out.writeTypedObject(mSubtitleText, flags);
+ out.writeTypedObject(mSubtitleIcon, flags);
+ out.writeTypedObject(mPrimaryTapAction, flags);
+ out.writeTypedObject(mPrimaryLoggingInfo, flags);
+ out.writeTypedObject(mSupplementalSubtitleText, flags);
+ out.writeTypedObject(mSupplementalSubtitleIcon, flags);
+ out.writeTypedObject(mSupplementalSubtitleTapAction, flags);
+ out.writeTypedObject(mSupplementalSubtitleLoggingInfo, flags);
+ out.writeTypedObject(mSupplementalText, flags);
+ out.writeTypedObject(mSupplementalIcon, flags);
+ out.writeTypedObject(mSupplementalTapAction, flags);
+ out.writeTypedObject(mSupplementalLoggingInfo, flags);
+ out.writeTypedObject(mSupplementalAlarmText, flags);
+ out.writeInt(mLayoutWeight);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof BaseTemplateData)) return false;
+ BaseTemplateData that = (BaseTemplateData) o;
+ return mTemplateType == that.mTemplateType && SmartspaceUtils.isEqual(mTitleText,
+ that.mTitleText)
+ && Objects.equals(mTitleIcon, that.mTitleIcon)
+ && SmartspaceUtils.isEqual(mSubtitleText, that.mSubtitleText)
+ && Objects.equals(mSubtitleIcon, that.mSubtitleIcon)
+ && Objects.equals(mPrimaryTapAction, that.mPrimaryTapAction)
+ && Objects.equals(mPrimaryLoggingInfo, that.mPrimaryLoggingInfo)
+ && SmartspaceUtils.isEqual(mSupplementalSubtitleText,
+ that.mSupplementalSubtitleText)
+ && Objects.equals(mSupplementalSubtitleIcon, that.mSupplementalSubtitleIcon)
+ && Objects.equals(mSupplementalSubtitleTapAction,
+ that.mSupplementalSubtitleTapAction)
+ && Objects.equals(mSupplementalSubtitleLoggingInfo,
+ that.mSupplementalSubtitleLoggingInfo)
+ && SmartspaceUtils.isEqual(mSupplementalText,
+ that.mSupplementalText)
+ && Objects.equals(mSupplementalIcon, that.mSupplementalIcon)
+ && Objects.equals(mSupplementalTapAction, that.mSupplementalTapAction)
+ && Objects.equals(mSupplementalLoggingInfo, that.mSupplementalLoggingInfo)
+ && SmartspaceUtils.isEqual(mSupplementalAlarmText, that.mSupplementalAlarmText)
+ && mLayoutWeight == that.mLayoutWeight;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mTemplateType, mTitleText, mTitleIcon, mSubtitleText, mSubtitleIcon,
+ mPrimaryTapAction, mPrimaryLoggingInfo, mSupplementalSubtitleText,
+ mSupplementalSubtitleIcon, mSupplementalSubtitleTapAction,
+ mSupplementalSubtitleLoggingInfo,
+ mSupplementalText, mSupplementalIcon, mSupplementalTapAction,
+ mSupplementalLoggingInfo, mSupplementalAlarmText, mLayoutWeight);
+ }
+
+ @Override
+ public String toString() {
+ return "SmartspaceDefaultUiTemplateData{"
+ + "mTemplateType=" + mTemplateType
+ + ", mTitleText=" + mTitleText
+ + ", mTitleIcon=" + mTitleIcon
+ + ", mSubtitleText=" + mSubtitleText
+ + ", mSubTitleIcon=" + mSubtitleIcon
+ + ", mPrimaryTapAction=" + mPrimaryTapAction
+ + ", mPrimaryLoggingInfo=" + mPrimaryLoggingInfo
+ + ", mSupplementalSubtitleText=" + mSupplementalSubtitleText
+ + ", mSupplementalSubtitleIcon=" + mSupplementalSubtitleIcon
+ + ", mSupplementalSubtitleTapAction=" + mSupplementalSubtitleTapAction
+ + ", mSupplementalSubtitleLoggingInfo=" + mSupplementalSubtitleLoggingInfo
+ + ", mSupplementalText=" + mSupplementalText
+ + ", mSupplementalIcon=" + mSupplementalIcon
+ + ", mSupplementalTapAction=" + mSupplementalTapAction
+ + ", mSupplementalLoggingInfo=" + mSupplementalLoggingInfo
+ + ", mSupplementalAlarmText=" + mSupplementalAlarmText
+ + ", mLayoutWeight=" + mLayoutWeight
+ + '}';
+ }
+
+ /**
+ * A builder for {@link BaseTemplateData} object.
+ *
+ * @hide
+ */
+ @SystemApi
+ @SuppressLint("StaticFinalBuilder")
+ public static class Builder {
+ @UiTemplateType
+ private final int mTemplateType;
+ private Text mTitleText;
+ private Icon mTitleIcon;
+ private Text mSubtitleText;
+ private Icon mSubtitleIcon;
+ private TapAction mPrimaryTapAction;
+ private SubItemLoggingInfo mPrimaryLoggingInfo;
+ private Text mSupplementalSubtitleText;
+ private Icon mSupplementalSubtitleIcon;
+ private TapAction mSupplementalSubtitleTapAction;
+ private SubItemLoggingInfo mSupplementalSubtitleLoggingInfo;
+ private Text mSupplementalText;
+ private Icon mSupplementalIcon;
+ private TapAction mSupplementalTapAction;
+ private SubItemLoggingInfo mSupplementalLoggingInfo;
+ private Text mSupplementalAlarmText;
+ private int mLayoutWeight;
+
+ /**
+ * A builder for {@link BaseTemplateData}. By default sets the layout weight to be 0.
+ *
+ * @param templateType the {@link UiTemplateType} of this template data.
+ */
+ public Builder(@UiTemplateType int templateType) {
+ mTemplateType = templateType;
+ mLayoutWeight = 0;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @UiTemplateType
+ @SuppressLint("GetterOnBuilder")
+ int getTemplateType() {
+ return mTemplateType;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Text getTitleText() {
+ return mTitleText;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Icon getTitleIcon() {
+ return mTitleIcon;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Text getSubtitleText() {
+ return mSubtitleText;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Icon getSubtitleIcon() {
+ return mSubtitleIcon;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ TapAction getPrimaryTapAction() {
+ return mPrimaryTapAction;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ SubItemLoggingInfo getPrimaryLoggingInfo() {
+ return mPrimaryLoggingInfo;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Text getSupplementalSubtitleText() {
+ return mSupplementalSubtitleText;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Icon getSupplementalSubtitleIcon() {
+ return mSupplementalSubtitleIcon;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ TapAction getSupplementalSubtitleTapAction() {
+ return mSupplementalSubtitleTapAction;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ SubItemLoggingInfo getSupplementalSubtitleLoggingInfo() {
+ return mSupplementalSubtitleLoggingInfo;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Text getSupplementalText() {
+ return mSupplementalText;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Icon getSupplementalIcon() {
+ return mSupplementalIcon;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ TapAction getSupplementalTapAction() {
+ return mSupplementalTapAction;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ SubItemLoggingInfo getSupplementalLoggingInfo() {
+ return mSupplementalLoggingInfo;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @Nullable
+ @SuppressLint("GetterOnBuilder")
+ Text getSupplementalAlarmText() {
+ return mSupplementalAlarmText;
+ }
+
+ /** Should ONLY be used by the subclasses */
+ @SuppressLint("GetterOnBuilder")
+ int getLayoutWeight() {
+ return mLayoutWeight;
+ }
+
+ /**
+ * Sets the card title.
+ */
+ @NonNull
+ public Builder setTitleText(@NonNull Text titleText) {
+ mTitleText = titleText;
+ return this;
+ }
+
+ /**
+ * Sets the card title icon.
+ */
+ @NonNull
+ public Builder setTitleIcon(@NonNull Icon titleIcon) {
+ mTitleIcon = titleIcon;
+ return this;
+ }
+
+ /**
+ * Sets the card subtitle.
+ */
+ @NonNull
+ public Builder setSubtitleText(@NonNull Text subtitleText) {
+ mSubtitleText = subtitleText;
+ return this;
+ }
+
+ /**
+ * Sets the card subtitle icon.
+ */
+ @NonNull
+ public Builder setSubtitleIcon(@NonNull Icon subtitleIcon) {
+ mSubtitleIcon = subtitleIcon;
+ return this;
+ }
+
+ /**
+ * Sets the card primary tap action.
+ */
+ @NonNull
+ public Builder setPrimaryTapAction(@NonNull TapAction primaryTapAction) {
+ mPrimaryTapAction = primaryTapAction;
+ return this;
+ }
+
+ /**
+ * Sets the card primary logging info.
+ */
+ @NonNull
+ public Builder setPrimaryLoggingInfo(@NonNull SubItemLoggingInfo primaryLoggingInfo) {
+ mPrimaryLoggingInfo = primaryLoggingInfo;
+ return this;
+ }
+
+ /**
+ * Sets the supplemental subtitle text.
+ */
+ @NonNull
+ public Builder setSupplementalSubtitleText(
+ @NonNull Text supplementalSubtitleText) {
+ mSupplementalSubtitleText = supplementalSubtitleText;
+ return this;
+ }
+
+ /**
+ * Sets the supplemental subtitle icon.
+ */
+ @NonNull
+ public Builder setSupplementalSubtitleIcon(
+ @NonNull Icon supplementalSubtitleIcon) {
+ mSupplementalSubtitleIcon = supplementalSubtitleIcon;
+ return this;
+ }
+
+ /**
+ * Sets the supplemental subtitle tap action. {@code mPrimaryTapAction} will be used if not
+ * being set.
+ */
+ @NonNull
+ public Builder setSupplementalSubtitleTapAction(
+ @NonNull TapAction supplementalSubtitleTapAction) {
+ mSupplementalSubtitleTapAction = supplementalSubtitleTapAction;
+ return this;
+ }
+
+ /**
+ * Sets the card supplemental title's logging info.
+ */
+ @NonNull
+ public Builder setSupplementalSubtitleLoggingInfo(
+ @NonNull SubItemLoggingInfo supplementalSubtitleLoggingInfo) {
+ mSupplementalSubtitleLoggingInfo = supplementalSubtitleLoggingInfo;
+ return this;
+ }
+
+ /**
+ * Sets the supplemental text.
+ */
+ @NonNull
+ public Builder setSupplementalText(@NonNull Text supplementalText) {
+ mSupplementalText = supplementalText;
+ return this;
+ }
+
+ /**
+ * Sets the supplemental icon.
+ */
+ @NonNull
+ public Builder setSupplementalIcon(@NonNull Icon supplementalIcon) {
+ mSupplementalIcon = supplementalIcon;
+ return this;
+ }
+
+ /**
+ * Sets the supplemental line tap action. {@code mPrimaryTapAction} will be used if not
+ * being set.
+ */
+ @NonNull
+ public Builder setSupplementalTapAction(@NonNull TapAction supplementalTapAction) {
+ mSupplementalTapAction = supplementalTapAction;
+ return this;
+ }
+
+ /**
+ * Sets the card supplemental line's logging info.
+ */
+ @NonNull
+ public Builder setSupplementalLoggingInfo(
+ @NonNull SubItemLoggingInfo supplementalLoggingInfo) {
+ mSupplementalLoggingInfo = supplementalLoggingInfo;
+ return this;
+ }
+
+ /**
+ * Sets the supplemental alarm text.
+ */
+ @NonNull
+ public Builder setSupplementalAlarmText(@NonNull Text supplementalAlarmText) {
+ mSupplementalAlarmText = supplementalAlarmText;
+ return this;
+ }
+
+ /**
+ * Sets the layout weight.
+ */
+ @NonNull
+ public Builder setLayoutWeight(int layoutWeight) {
+ mLayoutWeight = layoutWeight;
+ return this;
+ }
+
+ /**
+ * Builds a new SmartspaceDefaultUiTemplateData instance.
+ */
+ @NonNull
+ public BaseTemplateData build() {
+ return new BaseTemplateData(mTemplateType, mTitleText, mTitleIcon,
+ mSubtitleText, mSubtitleIcon, mPrimaryTapAction,
+ mPrimaryLoggingInfo,
+ mSupplementalSubtitleText, mSupplementalSubtitleIcon,
+ mSupplementalSubtitleTapAction, mSupplementalSubtitleLoggingInfo,
+ mSupplementalText, mSupplementalIcon,
+ mSupplementalTapAction, mSupplementalLoggingInfo,
+ mSupplementalAlarmText, mLayoutWeight);
+ }
+ }
+
+ /**
+ * Holds all the logging info needed for a sub item within the base card. For example, the
+ * supplemental-subtitle part should have its own logging info.
+ */
+ public static final class SubItemLoggingInfo implements Parcelable {
+
+ /** A unique instance id for the sub item. */
+ private final int mInstanceId;
+
+ /** The feature type for this sub item. */
+ private final int mFeatureType;
+
+ SubItemLoggingInfo(@NonNull Parcel in) {
+ mInstanceId = in.readInt();
+ mFeatureType = in.readInt();
+ }
+
+ private SubItemLoggingInfo(int instanceId, int featureType) {
+ mInstanceId = instanceId;
+ mFeatureType = featureType;
+ }
+
+ public int getInstanceId() {
+ return mInstanceId;
+ }
+
+ public int getFeatureType() {
+ return mFeatureType;
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<SubItemLoggingInfo> CREATOR =
+ new Creator<SubItemLoggingInfo>() {
+ @Override
+ public SubItemLoggingInfo createFromParcel(Parcel in) {
+ return new SubItemLoggingInfo(in);
+ }
+
+ @Override
+ public SubItemLoggingInfo[] newArray(int size) {
+ return new SubItemLoggingInfo[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ out.writeInt(mInstanceId);
+ out.writeInt(mFeatureType);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SubItemLoggingInfo)) return false;
+ SubItemLoggingInfo that = (SubItemLoggingInfo) o;
+ return mInstanceId == that.mInstanceId && mFeatureType == that.mFeatureType;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mInstanceId, mFeatureType);
+ }
+
+ @Override
+ public String toString() {
+ return "SubItemLoggingInfo{"
+ + "mInstanceId=" + mInstanceId
+ + ", mFeatureType=" + mFeatureType
+ + '}';
+ }
+
+ /**
+ * A builder for {@link SubItemLoggingInfo} object.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder {
+
+ private final int mInstanceId;
+ private final int mFeatureType;
+
+ /**
+ * A builder for {@link SubItemLoggingInfo}.
+ *
+ * @param instanceId A unique instance id for the sub item
+ * @param featureType The feature type for this sub item
+ */
+ public Builder(int instanceId, int featureType) {
+ mInstanceId = instanceId;
+ mFeatureType = featureType;
+ }
+
+ /** Builds a new {@link SubItemLoggingInfo} instance. */
+ @NonNull
+ public SubItemLoggingInfo build() {
+ return new SubItemLoggingInfo(mInstanceId, mFeatureType);
+ }
+ }
+ }
+}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceCarouselUiTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/CarouselTemplateData.java
similarity index 64%
rename from core/java/android/app/smartspace/uitemplatedata/SmartspaceCarouselUiTemplateData.java
rename to core/java/android/app/smartspace/uitemplatedata/CarouselTemplateData.java
index e996056..fbdb7be 100644
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceCarouselUiTemplateData.java
+++ b/core/java/android/app/smartspace/uitemplatedata/CarouselTemplateData.java
@@ -30,10 +30,16 @@
/**
* Holds all the relevant data needed to render a Smartspace card with the carousel Ui Template.
*
+ * This template will add a sub-card displaying a list of carousel items within the default-template
+ * card:
+ * <ul>
+ * <li> carouselItem1, carouselItem2, carouselItem3... </li>
+ * </ul>
+ *
* @hide
*/
@SystemApi
-public final class SmartspaceCarouselUiTemplateData extends SmartspaceDefaultUiTemplateData {
+public final class CarouselTemplateData extends BaseTemplateData {
/** Lists of {@link CarouselItem}. */
@NonNull
@@ -41,40 +47,54 @@
/** Tap action for the entire carousel secondary card, including the blank space */
@Nullable
- private final SmartspaceTapAction mCarouselAction;
+ private final TapAction mCarouselAction;
- SmartspaceCarouselUiTemplateData(@NonNull Parcel in) {
+ CarouselTemplateData(@NonNull Parcel in) {
super(in);
mCarouselItems = in.createTypedArrayList(CarouselItem.CREATOR);
- mCarouselAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
+ mCarouselAction = in.readTypedObject(TapAction.CREATOR);
}
- private SmartspaceCarouselUiTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
- @Nullable SmartspaceText titleText,
- @Nullable SmartspaceIcon titleIcon,
- @Nullable SmartspaceText subtitleText,
- @Nullable SmartspaceIcon subTitleIcon,
- @Nullable SmartspaceTapAction primaryTapAction,
- @Nullable SmartspaceText supplementalSubtitleText,
- @Nullable SmartspaceIcon supplementalSubtitleIcon,
- @Nullable SmartspaceTapAction supplementalSubtitleTapAction,
- @Nullable SmartspaceText supplementalAlarmText,
+ private CarouselTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
+ @Nullable Text titleText,
+ @Nullable Icon titleIcon,
+ @Nullable Text subtitleText,
+ @Nullable Icon subtitleIcon,
+ @Nullable TapAction primaryTapAction,
+ @Nullable SubItemLoggingInfo primaryLoggingInfo,
+ @Nullable Text supplementalSubtitleText,
+ @Nullable Icon supplementalSubtitleIcon,
+ @Nullable TapAction supplementalSubtitleTapAction,
+ @Nullable SubItemLoggingInfo supplementalSubtitleLoggingInfo,
+ @Nullable Text supplementalText,
+ @Nullable Icon supplementalIcon,
+ @Nullable TapAction supplementalTapAction,
+ @Nullable SubItemLoggingInfo supplementalLoggingInfo,
+ @Nullable Text supplementalAlarmText,
+ int layoutWeight,
@NonNull List<CarouselItem> carouselItems,
- @Nullable SmartspaceTapAction carouselAction) {
- super(templateType, titleText, titleIcon, subtitleText, subTitleIcon, primaryTapAction,
- supplementalSubtitleText, supplementalSubtitleIcon, supplementalSubtitleTapAction,
- supplementalAlarmText);
+ @Nullable TapAction carouselAction) {
+ super(templateType, titleText, titleIcon, subtitleText, subtitleIcon,
+ primaryTapAction, primaryLoggingInfo,
+ supplementalSubtitleText, supplementalSubtitleIcon,
+ supplementalSubtitleTapAction, supplementalSubtitleLoggingInfo,
+ supplementalText, supplementalIcon,
+ supplementalTapAction, supplementalLoggingInfo,
+ supplementalAlarmText, layoutWeight);
+
mCarouselItems = carouselItems;
mCarouselAction = carouselAction;
}
+ /** Returns the list of {@link CarouselItem}. Can be empty if not being set. */
@NonNull
public List<CarouselItem> getCarouselItems() {
return mCarouselItems;
}
+ /** Returns the card's tap action. */
@Nullable
- public SmartspaceTapAction getCarouselAction() {
+ public TapAction getCarouselAction() {
return mCarouselAction;
}
@@ -82,16 +102,16 @@
* @see Parcelable.Creator
*/
@NonNull
- public static final Creator<SmartspaceCarouselUiTemplateData> CREATOR =
- new Creator<SmartspaceCarouselUiTemplateData>() {
+ public static final Creator<CarouselTemplateData> CREATOR =
+ new Creator<CarouselTemplateData>() {
@Override
- public SmartspaceCarouselUiTemplateData createFromParcel(Parcel in) {
- return new SmartspaceCarouselUiTemplateData(in);
+ public CarouselTemplateData createFromParcel(Parcel in) {
+ return new CarouselTemplateData(in);
}
@Override
- public SmartspaceCarouselUiTemplateData[] newArray(int size) {
- return new SmartspaceCarouselUiTemplateData[size];
+ public CarouselTemplateData[] newArray(int size) {
+ return new CarouselTemplateData[size];
}
};
@@ -111,9 +131,9 @@
@Override
public boolean equals(Object o) {
if (this == o) return true;
- if (!(o instanceof SmartspaceCarouselUiTemplateData)) return false;
+ if (!(o instanceof CarouselTemplateData)) return false;
if (!super.equals(o)) return false;
- SmartspaceCarouselUiTemplateData that = (SmartspaceCarouselUiTemplateData) o;
+ CarouselTemplateData that = (CarouselTemplateData) o;
return mCarouselItems.equals(that.mCarouselItems) && Objects.equals(mCarouselAction,
that.mCarouselAction);
}
@@ -132,18 +152,18 @@
}
/**
- * A builder for {@link SmartspaceCarouselUiTemplateData} object.
+ * A builder for {@link CarouselTemplateData} object.
*
* @hide
*/
@SystemApi
- public static final class Builder extends SmartspaceDefaultUiTemplateData.Builder {
+ public static final class Builder extends BaseTemplateData.Builder {
private final List<CarouselItem> mCarouselItems;
- private SmartspaceTapAction mCarouselAction;
+ private TapAction mCarouselAction;
/**
- * A builder for {@link SmartspaceCarouselUiTemplateData}.
+ * A builder for {@link CarouselTemplateData}.
*/
public Builder(@NonNull List<CarouselItem> carouselItems) {
super(SmartspaceTarget.UI_TEMPLATE_CAROUSEL);
@@ -154,61 +174,73 @@
* Sets the card tap action.
*/
@NonNull
- public Builder setCarouselAction(@NonNull SmartspaceTapAction carouselAction) {
+ public Builder setCarouselAction(@NonNull TapAction carouselAction) {
mCarouselAction = carouselAction;
return this;
}
/**
- * Builds a new SmartspaceCarouselUiTemplateData instance.
+ * Builds a new {@link CarouselTemplateData} instance.
*
* @throws IllegalStateException if the carousel data is invalid.
*/
@NonNull
- public SmartspaceCarouselUiTemplateData build() {
+ public CarouselTemplateData build() {
if (mCarouselItems.isEmpty()) {
throw new IllegalStateException("Carousel data is empty");
}
- return new SmartspaceCarouselUiTemplateData(getTemplateType(), getTitleText(),
- getTitleIcon(), getSubtitleText(), getSubtitleIcon(), getPrimaryTapAction(),
+ return new CarouselTemplateData(getTemplateType(), getTitleText(),
+ getTitleIcon(), getSubtitleText(), getSubtitleIcon(),
+ getPrimaryTapAction(), getPrimaryLoggingInfo(),
getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
- getSupplementalSubtitleTapAction(), getSupplementalAlarmText(), mCarouselItems,
- mCarouselAction);
+ getSupplementalSubtitleTapAction(), getSupplementalSubtitleLoggingInfo(),
+ getSupplementalText(), getSupplementalIcon(),
+ getSupplementalTapAction(), getSupplementalLoggingInfo(),
+ getSupplementalAlarmText(), getLayoutWeight(),
+ mCarouselItems, mCarouselAction);
}
}
- /** Holds all the relevant data needed to render a carousel item. */
+ /**
+ * Holds all the relevant data needed to render a carousel item.
+ *
+ * <ul>
+ * <li> upper text </li>
+ * <li> image </li>
+ * <li> lower text </li>
+ * </ul>
+ */
public static final class CarouselItem implements Parcelable {
/** Text which is above the image item. */
@Nullable
- private final SmartspaceText mUpperText;
+ private final Text mUpperText;
/** Image item. Can be empty. */
@Nullable
- private final SmartspaceIcon mImage;
+ private final Icon mImage;
/** Text which is under the image item. */
@Nullable
- private final SmartspaceText mLowerText;
+ private final Text mLowerText;
/**
* Tap action for this {@link CarouselItem} instance. {@code mCarouselAction} is used if not
* being set.
*/
@Nullable
- private final SmartspaceTapAction mTapAction;
+ private final TapAction mTapAction;
CarouselItem(@NonNull Parcel in) {
- mUpperText = in.readTypedObject(SmartspaceText.CREATOR);
- mImage = in.readTypedObject(SmartspaceIcon.CREATOR);
- mLowerText = in.readTypedObject(SmartspaceText.CREATOR);
- mTapAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
+ mUpperText = in.readTypedObject(Text.CREATOR);
+ mImage = in.readTypedObject(Icon.CREATOR);
+ mLowerText = in.readTypedObject(Text.CREATOR);
+ mTapAction = in.readTypedObject(TapAction.CREATOR);
}
- private CarouselItem(@Nullable SmartspaceText upperText, @Nullable SmartspaceIcon image,
- @Nullable SmartspaceText lowerText, @Nullable SmartspaceTapAction tapAction) {
+ private CarouselItem(@Nullable Text upperText, @Nullable Icon image,
+ @Nullable Text lowerText, @Nullable TapAction tapAction) {
mUpperText = upperText;
mImage = image;
mLowerText = lowerText;
@@ -216,22 +248,22 @@
}
@Nullable
- public SmartspaceText getUpperText() {
+ public Text getUpperText() {
return mUpperText;
}
@Nullable
- public SmartspaceIcon getImage() {
+ public Icon getImage() {
return mImage;
}
@Nullable
- public SmartspaceText getLowerText() {
+ public Text getLowerText() {
return mLowerText;
}
@Nullable
- public SmartspaceTapAction getTapAction() {
+ public TapAction getTapAction() {
return mTapAction;
}
@@ -299,16 +331,16 @@
@SystemApi
public static final class Builder {
- private SmartspaceText mUpperText;
- private SmartspaceIcon mImage;
- private SmartspaceText mLowerText;
- private SmartspaceTapAction mTapAction;
+ private Text mUpperText;
+ private Icon mImage;
+ private Text mLowerText;
+ private TapAction mTapAction;
/**
* Sets the upper text.
*/
@NonNull
- public Builder setUpperText(@Nullable SmartspaceText upperText) {
+ public Builder setUpperText(@Nullable Text upperText) {
mUpperText = upperText;
return this;
}
@@ -317,7 +349,7 @@
* Sets the image.
*/
@NonNull
- public Builder setImage(@Nullable SmartspaceIcon image) {
+ public Builder setImage(@Nullable Icon image) {
mImage = image;
return this;
}
@@ -327,7 +359,7 @@
* Sets the lower text.
*/
@NonNull
- public Builder setLowerText(@Nullable SmartspaceText lowerText) {
+ public Builder setLowerText(@Nullable Text lowerText) {
mLowerText = lowerText;
return this;
}
@@ -336,7 +368,7 @@
* Sets the tap action.
*/
@NonNull
- public Builder setTapAction(@Nullable SmartspaceTapAction tapAction) {
+ public Builder setTapAction(@Nullable TapAction tapAction) {
mTapAction = tapAction;
return this;
}
diff --git a/core/java/android/app/smartspace/uitemplatedata/CombinedCardsTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/CombinedCardsTemplateData.java
new file mode 100644
index 0000000..1d13066
--- /dev/null
+++ b/core/java/android/app/smartspace/uitemplatedata/CombinedCardsTemplateData.java
@@ -0,0 +1,175 @@
+/*
+ * 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 android.app.smartspace.uitemplatedata;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.smartspace.SmartspaceTarget;
+import android.os.Parcel;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Holds all the relevant data needed to render a Smartspace card with the combined-card Ui
+ * Template.
+ *
+ * We only support adding a 1 sub-list card combined with 1 sub-card card (may expand our supported
+ * combinations in the future) within the default-template card:
+ *
+ * <ul>
+ * <li> sub-list card, sub-card card </li>
+ * </ul>
+ *
+ * @hide
+ */
+@SystemApi
+public final class CombinedCardsTemplateData extends BaseTemplateData {
+
+ /** A list of secondary cards. */
+ @NonNull
+ private final List<BaseTemplateData> mCombinedCardDataList;
+
+ CombinedCardsTemplateData(@NonNull Parcel in) {
+ super(in);
+ mCombinedCardDataList = in.createTypedArrayList(BaseTemplateData.CREATOR);
+ }
+
+ private CombinedCardsTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
+ @Nullable Text titleText,
+ @Nullable Icon titleIcon,
+ @Nullable Text subtitleText,
+ @Nullable Icon subtitleIcon,
+ @Nullable TapAction primaryTapAction,
+ @Nullable SubItemLoggingInfo primaryLoggingInfo,
+ @Nullable Text supplementalSubtitleText,
+ @Nullable Icon supplementalSubtitleIcon,
+ @Nullable TapAction supplementalSubtitleTapAction,
+ @Nullable SubItemLoggingInfo supplementalSubtitleLoggingInfo,
+ @Nullable Text supplementalText,
+ @Nullable Icon supplementalIcon,
+ @Nullable TapAction supplementalTapAction,
+ @Nullable SubItemLoggingInfo supplementalLoggingInfo,
+ @Nullable Text supplementalAlarmText,
+ int layoutWeight,
+ @NonNull List<BaseTemplateData> combinedCardDataList) {
+ super(templateType, titleText, titleIcon, subtitleText, subtitleIcon,
+ primaryTapAction, primaryLoggingInfo,
+ supplementalSubtitleText, supplementalSubtitleIcon,
+ supplementalSubtitleTapAction, supplementalSubtitleLoggingInfo,
+ supplementalText, supplementalIcon,
+ supplementalTapAction, supplementalLoggingInfo,
+ supplementalAlarmText, layoutWeight);
+ mCombinedCardDataList = combinedCardDataList;
+ }
+
+ /** Returns the list of secondary cards. Can be null if not being set. */
+ @NonNull
+ public List<BaseTemplateData> getCombinedCardDataList() {
+ return mCombinedCardDataList;
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<CombinedCardsTemplateData> CREATOR =
+ new Creator<CombinedCardsTemplateData>() {
+ @Override
+ public CombinedCardsTemplateData createFromParcel(Parcel in) {
+ return new CombinedCardsTemplateData(in);
+ }
+
+ @Override
+ public CombinedCardsTemplateData[] newArray(int size) {
+ return new CombinedCardsTemplateData[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeTypedList(mCombinedCardDataList);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof CombinedCardsTemplateData)) return false;
+ if (!super.equals(o)) return false;
+ CombinedCardsTemplateData that = (CombinedCardsTemplateData) o;
+ return mCombinedCardDataList.equals(that.mCombinedCardDataList);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mCombinedCardDataList);
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + " + SmartspaceCombinedCardsUiTemplateData{"
+ + "mCombinedCardDataList=" + mCombinedCardDataList
+ + '}';
+ }
+
+ /**
+ * A builder for {@link CombinedCardsTemplateData} object.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder extends BaseTemplateData.Builder {
+
+ private final List<BaseTemplateData> mCombinedCardDataList;
+
+ /**
+ * A builder for {@link CombinedCardsTemplateData}.
+ */
+ public Builder(@NonNull List<BaseTemplateData> combinedCardDataList) {
+ super(SmartspaceTarget.UI_TEMPLATE_COMBINED_CARDS);
+ mCombinedCardDataList = Objects.requireNonNull(combinedCardDataList);
+ }
+
+ /**
+ * Builds a new SmartspaceCombinedCardsUiTemplateData instance.
+ *
+ * @throws IllegalStateException if any required non-null field is null
+ */
+ @NonNull
+ public CombinedCardsTemplateData build() {
+ if (mCombinedCardDataList == null) {
+ throw new IllegalStateException("Please assign a value to all @NonNull args.");
+ }
+ return new CombinedCardsTemplateData(getTemplateType(), getTitleText(),
+ getTitleIcon(), getSubtitleText(), getSubtitleIcon(),
+ getPrimaryTapAction(), getPrimaryLoggingInfo(),
+ getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
+ getSupplementalSubtitleTapAction(), getSupplementalSubtitleLoggingInfo(),
+ getSupplementalText(), getSupplementalIcon(),
+ getSupplementalTapAction(), getSupplementalLoggingInfo(),
+ getSupplementalAlarmText(), getLayoutWeight(),
+ mCombinedCardDataList);
+ }
+ }
+}
diff --git a/core/java/android/app/smartspace/uitemplatedata/HeadToHeadTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/HeadToHeadTemplateData.java
new file mode 100644
index 0000000..19177df
--- /dev/null
+++ b/core/java/android/app/smartspace/uitemplatedata/HeadToHeadTemplateData.java
@@ -0,0 +1,314 @@
+/*
+ * 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 android.app.smartspace.uitemplatedata;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.smartspace.SmartspaceTarget;
+import android.app.smartspace.SmartspaceUtils;
+import android.os.Parcel;
+
+import java.util.Objects;
+
+/**
+ * Holds all the relevant data needed to render a Smartspace card with the head-to-head Ui Template.
+ *
+ * This template will add a head-to-head card within the default-template card:
+ * <ul>
+ * <li> head-to-head title </li>
+ * <li> first-competitor icon second-competitor icon </li>
+ * <li> first-competitor text second-competitor text </li>
+ * </ul>
+ *
+ * @hide
+ */
+@SystemApi
+public final class HeadToHeadTemplateData extends BaseTemplateData {
+
+ @Nullable
+ private final Text mHeadToHeadTitle;
+ @Nullable
+ private final Icon mHeadToHeadFirstCompetitorIcon;
+ @Nullable
+ private final Icon mHeadToHeadSecondCompetitorIcon;
+ @Nullable
+ private final Text mHeadToHeadFirstCompetitorText;
+ @Nullable
+ private final Text mHeadToHeadSecondCompetitorText;
+
+ /** Tap action for the head-to-head secondary card. */
+ @Nullable
+ private final TapAction mHeadToHeadAction;
+
+ HeadToHeadTemplateData(@NonNull Parcel in) {
+ super(in);
+ mHeadToHeadTitle = in.readTypedObject(Text.CREATOR);
+ mHeadToHeadFirstCompetitorIcon = in.readTypedObject(Icon.CREATOR);
+ mHeadToHeadSecondCompetitorIcon = in.readTypedObject(Icon.CREATOR);
+ mHeadToHeadFirstCompetitorText = in.readTypedObject(Text.CREATOR);
+ mHeadToHeadSecondCompetitorText = in.readTypedObject(Text.CREATOR);
+ mHeadToHeadAction = in.readTypedObject(TapAction.CREATOR);
+ }
+
+ private HeadToHeadTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
+ @Nullable Text titleText,
+ @Nullable Icon titleIcon,
+ @Nullable Text subtitleText,
+ @Nullable Icon subtitleIcon,
+ @Nullable TapAction primaryTapAction,
+ @Nullable SubItemLoggingInfo primaryLoggingInfo,
+ @Nullable Text supplementalSubtitleText,
+ @Nullable Icon supplementalSubtitleIcon,
+ @Nullable TapAction supplementalSubtitleTapAction,
+ @Nullable SubItemLoggingInfo supplementalSubtitleLoggingInfo,
+ @Nullable Text supplementalText,
+ @Nullable Icon supplementalIcon,
+ @Nullable TapAction supplementalTapAction,
+ @Nullable SubItemLoggingInfo supplementalLoggingInfo,
+ @Nullable Text supplementalAlarmText,
+ int layoutWeight,
+ @Nullable Text headToHeadTitle,
+ @Nullable Icon headToHeadFirstCompetitorIcon,
+ @Nullable Icon headToHeadSecondCompetitorIcon,
+ @Nullable Text headToHeadFirstCompetitorText,
+ @Nullable Text headToHeadSecondCompetitorText,
+ @Nullable TapAction headToHeadAction) {
+ super(templateType, titleText, titleIcon, subtitleText, subtitleIcon,
+ primaryTapAction, primaryLoggingInfo,
+ supplementalSubtitleText, supplementalSubtitleIcon,
+ supplementalSubtitleTapAction, supplementalSubtitleLoggingInfo,
+ supplementalText, supplementalIcon,
+ supplementalTapAction, supplementalLoggingInfo,
+ supplementalAlarmText, layoutWeight);
+
+ mHeadToHeadTitle = headToHeadTitle;
+ mHeadToHeadFirstCompetitorIcon = headToHeadFirstCompetitorIcon;
+ mHeadToHeadSecondCompetitorIcon = headToHeadSecondCompetitorIcon;
+ mHeadToHeadFirstCompetitorText = headToHeadFirstCompetitorText;
+ mHeadToHeadSecondCompetitorText = headToHeadSecondCompetitorText;
+ mHeadToHeadAction = headToHeadAction;
+ }
+
+ /** Returns the head-to-head card's title. */
+ @Nullable
+ public Text getHeadToHeadTitle() {
+ return mHeadToHeadTitle;
+ }
+
+ /** Returns the first competitor's icon. */
+ @Nullable
+ public Icon getHeadToHeadFirstCompetitorIcon() {
+ return mHeadToHeadFirstCompetitorIcon;
+ }
+
+ /** Returns the second competitor's icon. */
+ @Nullable
+ public Icon getHeadToHeadSecondCompetitorIcon() {
+ return mHeadToHeadSecondCompetitorIcon;
+ }
+
+ /** Returns the first competitor's text. */
+ @Nullable
+ public Text getHeadToHeadFirstCompetitorText() {
+ return mHeadToHeadFirstCompetitorText;
+ }
+
+ /** Returns the second competitor's text. */
+ @Nullable
+ public Text getHeadToHeadSecondCompetitorText() {
+ return mHeadToHeadSecondCompetitorText;
+ }
+
+ /** Returns the head-to-head card's tap action. */
+ @Nullable
+ public TapAction getHeadToHeadAction() {
+ return mHeadToHeadAction;
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<HeadToHeadTemplateData> CREATOR =
+ new Creator<HeadToHeadTemplateData>() {
+ @Override
+ public HeadToHeadTemplateData createFromParcel(Parcel in) {
+ return new HeadToHeadTemplateData(in);
+ }
+
+ @Override
+ public HeadToHeadTemplateData[] newArray(int size) {
+ return new HeadToHeadTemplateData[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeTypedObject(mHeadToHeadTitle, flags);
+ out.writeTypedObject(mHeadToHeadFirstCompetitorIcon, flags);
+ out.writeTypedObject(mHeadToHeadSecondCompetitorIcon, flags);
+ out.writeTypedObject(mHeadToHeadFirstCompetitorText, flags);
+ out.writeTypedObject(mHeadToHeadSecondCompetitorText, flags);
+ out.writeTypedObject(mHeadToHeadAction, flags);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof HeadToHeadTemplateData)) return false;
+ if (!super.equals(o)) return false;
+ HeadToHeadTemplateData that = (HeadToHeadTemplateData) o;
+ return SmartspaceUtils.isEqual(mHeadToHeadTitle, that.mHeadToHeadTitle) && Objects.equals(
+ mHeadToHeadFirstCompetitorIcon, that.mHeadToHeadFirstCompetitorIcon)
+ && Objects.equals(
+ mHeadToHeadSecondCompetitorIcon, that.mHeadToHeadSecondCompetitorIcon)
+ && SmartspaceUtils.isEqual(mHeadToHeadFirstCompetitorText,
+ that.mHeadToHeadFirstCompetitorText)
+ && SmartspaceUtils.isEqual(mHeadToHeadSecondCompetitorText,
+ that.mHeadToHeadSecondCompetitorText)
+ && Objects.equals(
+ mHeadToHeadAction, that.mHeadToHeadAction);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mHeadToHeadTitle, mHeadToHeadFirstCompetitorIcon,
+ mHeadToHeadSecondCompetitorIcon, mHeadToHeadFirstCompetitorText,
+ mHeadToHeadSecondCompetitorText,
+ mHeadToHeadAction);
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + " + SmartspaceHeadToHeadUiTemplateData{"
+ + "mH2HTitle=" + mHeadToHeadTitle
+ + ", mH2HFirstCompetitorIcon=" + mHeadToHeadFirstCompetitorIcon
+ + ", mH2HSecondCompetitorIcon=" + mHeadToHeadSecondCompetitorIcon
+ + ", mH2HFirstCompetitorText=" + mHeadToHeadFirstCompetitorText
+ + ", mH2HSecondCompetitorText=" + mHeadToHeadSecondCompetitorText
+ + ", mH2HAction=" + mHeadToHeadAction
+ + '}';
+ }
+
+ /**
+ * A builder for {@link HeadToHeadTemplateData} object.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder extends BaseTemplateData.Builder {
+
+ private Text mHeadToHeadTitle;
+ private Icon mHeadToHeadFirstCompetitorIcon;
+ private Icon mHeadToHeadSecondCompetitorIcon;
+ private Text mHeadToHeadFirstCompetitorText;
+ private Text mHeadToHeadSecondCompetitorText;
+ private TapAction mHeadToHeadAction;
+
+ /**
+ * A builder for {@link HeadToHeadTemplateData}.
+ */
+ public Builder() {
+ super(SmartspaceTarget.UI_TEMPLATE_HEAD_TO_HEAD);
+ }
+
+ /**
+ * Sets the head-to-head card's title
+ */
+ @NonNull
+ public Builder setHeadToHeadTitle(@Nullable Text headToHeadTitle) {
+ mHeadToHeadTitle = headToHeadTitle;
+ return this;
+ }
+
+ /**
+ * Sets the head-to-head card's first competitor icon
+ */
+ @NonNull
+ public Builder setHeadToHeadFirstCompetitorIcon(
+ @Nullable Icon headToHeadFirstCompetitorIcon) {
+ mHeadToHeadFirstCompetitorIcon = headToHeadFirstCompetitorIcon;
+ return this;
+ }
+
+ /**
+ * Sets the head-to-head card's second competitor icon
+ */
+ @NonNull
+ public Builder setHeadToHeadSecondCompetitorIcon(
+ @Nullable Icon headToHeadSecondCompetitorIcon) {
+ mHeadToHeadSecondCompetitorIcon = headToHeadSecondCompetitorIcon;
+ return this;
+ }
+
+ /**
+ * Sets the head-to-head card's first competitor text
+ */
+ @NonNull
+ public Builder setHeadToHeadFirstCompetitorText(
+ @Nullable Text headToHeadFirstCompetitorText) {
+ mHeadToHeadFirstCompetitorText = headToHeadFirstCompetitorText;
+ return this;
+ }
+
+ /**
+ * Sets the head-to-head card's second competitor text
+ */
+ @NonNull
+ public Builder setHeadToHeadSecondCompetitorText(
+ @Nullable Text headToHeadSecondCompetitorText) {
+ mHeadToHeadSecondCompetitorText = headToHeadSecondCompetitorText;
+ return this;
+ }
+
+ /**
+ * Sets the head-to-head card's tap action
+ */
+ @NonNull
+ public Builder setHeadToHeadAction(@Nullable TapAction headToHeadAction) {
+ mHeadToHeadAction = headToHeadAction;
+ return this;
+ }
+
+ /**
+ * Builds a new SmartspaceHeadToHeadUiTemplateData instance.
+ */
+ @NonNull
+ public HeadToHeadTemplateData build() {
+ return new HeadToHeadTemplateData(getTemplateType(), getTitleText(),
+ getTitleIcon(), getSubtitleText(), getSubtitleIcon(),
+ getPrimaryTapAction(), getPrimaryLoggingInfo(),
+ getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
+ getSupplementalSubtitleTapAction(), getSupplementalSubtitleLoggingInfo(),
+ getSupplementalText(), getSupplementalIcon(),
+ getSupplementalTapAction(), getSupplementalLoggingInfo(),
+ getSupplementalAlarmText(), getLayoutWeight(),
+ mHeadToHeadTitle,
+ mHeadToHeadFirstCompetitorIcon,
+ mHeadToHeadSecondCompetitorIcon, mHeadToHeadFirstCompetitorText,
+ mHeadToHeadSecondCompetitorText,
+ mHeadToHeadAction);
+ }
+ }
+}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceIcon.java b/core/java/android/app/smartspace/uitemplatedata/Icon.java
similarity index 72%
rename from core/java/android/app/smartspace/uitemplatedata/SmartspaceIcon.java
rename to core/java/android/app/smartspace/uitemplatedata/Icon.java
index 1efbaeb..6bdc926 100644
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceIcon.java
+++ b/core/java/android/app/smartspace/uitemplatedata/Icon.java
@@ -20,7 +20,6 @@
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.smartspace.SmartspaceUtils;
-import android.graphics.drawable.Icon;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -34,62 +33,68 @@
* @hide
*/
@SystemApi
-public final class SmartspaceIcon implements Parcelable {
+public final class Icon implements Parcelable {
@NonNull
- private final Icon mIcon;
+ private final android.graphics.drawable.Icon mIcon;
@Nullable
private final CharSequence mContentDescription;
private final boolean mShouldTint;
- SmartspaceIcon(@NonNull Parcel in) {
- mIcon = in.readTypedObject(Icon.CREATOR);
+ Icon(@NonNull Parcel in) {
+ mIcon = in.readTypedObject(android.graphics.drawable.Icon.CREATOR);
mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mShouldTint = in.readBoolean();
}
- private SmartspaceIcon(@NonNull Icon icon, @Nullable CharSequence contentDescription,
+ private Icon(@NonNull android.graphics.drawable.Icon icon,
+ @Nullable CharSequence contentDescription,
boolean shouldTint) {
mIcon = icon;
mContentDescription = contentDescription;
mShouldTint = shouldTint;
}
+ /** Returns the icon image. */
@NonNull
- public Icon getIcon() {
+ public android.graphics.drawable.Icon getIcon() {
return mIcon;
}
+ /** Returns the content description of the icon image. */
@Nullable
public CharSequence getContentDescription() {
return mContentDescription;
}
- /** Return shouldTint value. The default value is true. */
+ /**
+ * Return shouldTint value, which means whether should tint the icon with the system's theme
+ * color. The default value is true.
+ */
public boolean shouldTint() {
return mShouldTint;
}
@NonNull
- public static final Creator<SmartspaceIcon> CREATOR = new Creator<SmartspaceIcon>() {
+ public static final Creator<Icon> CREATOR = new Creator<Icon>() {
@Override
- public SmartspaceIcon createFromParcel(Parcel in) {
- return new SmartspaceIcon(in);
+ public Icon createFromParcel(Parcel in) {
+ return new Icon(in);
}
@Override
- public SmartspaceIcon[] newArray(int size) {
- return new SmartspaceIcon[size];
+ public Icon[] newArray(int size) {
+ return new Icon[size];
}
};
@Override
public boolean equals(Object o) {
if (this == o) return true;
- if (!(o instanceof SmartspaceIcon)) return false;
- SmartspaceIcon that = (SmartspaceIcon) o;
+ if (!(o instanceof Icon)) return false;
+ Icon that = (Icon) o;
return mIcon.toString().equals(that.mIcon.toString()) && SmartspaceUtils.isEqual(
mContentDescription,
that.mContentDescription) && mShouldTint == that.mShouldTint;
@@ -122,23 +127,23 @@
}
/**
- * A builder for {@link SmartspaceIcon} object.
+ * A builder for {@link Icon} object.
*
* @hide
*/
@SystemApi
public static final class Builder {
- private Icon mIcon;
+ private android.graphics.drawable.Icon mIcon;
private CharSequence mContentDescription;
private boolean mShouldTint;
/**
- * A builder for {@link SmartspaceIcon}, which sets shouldTint to true by default.
+ * A builder for {@link Icon}, which sets shouldTint to true by default.
*
- * @param icon the icon image of this {@link SmartspaceIcon} instance.
+ * @param icon the icon image of this {@link Icon} instance.
*/
- public Builder(@NonNull Icon icon) {
+ public Builder(@NonNull android.graphics.drawable.Icon icon) {
mIcon = Objects.requireNonNull(icon);
mShouldTint = true;
}
@@ -153,7 +158,7 @@
}
/**
- * Sets should tint icon.
+ * Sets should tint icon with the system's theme color.
*/
@NonNull
public Builder setShouldTint(boolean shouldTint) {
@@ -165,8 +170,8 @@
* Builds a new SmartspaceIcon instance.
*/
@NonNull
- public SmartspaceIcon build() {
- return new SmartspaceIcon(mIcon, mContentDescription, mShouldTint);
+ public Icon build() {
+ return new Icon(mIcon, mContentDescription, mShouldTint);
}
}
}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceCombinedCardsUiTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SmartspaceCombinedCardsUiTemplateData.java
deleted file mode 100644
index 9d4c8e2..0000000
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceCombinedCardsUiTemplateData.java
+++ /dev/null
@@ -1,155 +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 android.app.smartspace.uitemplatedata;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.app.smartspace.SmartspaceTarget;
-import android.os.Parcel;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Holds all the relevant data needed to render a Smartspace card with the combined-card Ui
- * Template.
- *
- * We only support 1 sub-list card combined with 1 carousel card. And we may expand our supported
- * combinations in the future.
- *
- * @hide
- */
-@SystemApi
-public final class SmartspaceCombinedCardsUiTemplateData extends SmartspaceDefaultUiTemplateData {
-
- /** A list of secondary cards. */
- @NonNull
- private final List<SmartspaceDefaultUiTemplateData> mCombinedCardDataList;
-
- SmartspaceCombinedCardsUiTemplateData(@NonNull Parcel in) {
- super(in);
- mCombinedCardDataList = in.createTypedArrayList(SmartspaceDefaultUiTemplateData.CREATOR);
- }
-
- private SmartspaceCombinedCardsUiTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
- @Nullable SmartspaceText titleText,
- @Nullable SmartspaceIcon titleIcon,
- @Nullable SmartspaceText subtitleText,
- @Nullable SmartspaceIcon subTitleIcon,
- @Nullable SmartspaceTapAction primaryTapAction,
- @Nullable SmartspaceText supplementalSubtitleText,
- @Nullable SmartspaceIcon supplementalSubtitleIcon,
- @Nullable SmartspaceTapAction supplementalSubtitleTapAction,
- @Nullable SmartspaceText supplementalAlarmText,
- @NonNull List<SmartspaceDefaultUiTemplateData> combinedCardDataList) {
- super(templateType, titleText, titleIcon, subtitleText, subTitleIcon, primaryTapAction,
- supplementalSubtitleText, supplementalSubtitleIcon, supplementalSubtitleTapAction,
- supplementalAlarmText);
- mCombinedCardDataList = combinedCardDataList;
- }
-
- @NonNull
- public List<SmartspaceDefaultUiTemplateData> getCombinedCardDataList() {
- return mCombinedCardDataList;
- }
-
- /**
- * @see Parcelable.Creator
- */
- @NonNull
- public static final Creator<SmartspaceCombinedCardsUiTemplateData> CREATOR =
- new Creator<SmartspaceCombinedCardsUiTemplateData>() {
- @Override
- public SmartspaceCombinedCardsUiTemplateData createFromParcel(Parcel in) {
- return new SmartspaceCombinedCardsUiTemplateData(in);
- }
-
- @Override
- public SmartspaceCombinedCardsUiTemplateData[] newArray(int size) {
- return new SmartspaceCombinedCardsUiTemplateData[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeTypedList(mCombinedCardDataList);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof SmartspaceCombinedCardsUiTemplateData)) return false;
- if (!super.equals(o)) return false;
- SmartspaceCombinedCardsUiTemplateData that = (SmartspaceCombinedCardsUiTemplateData) o;
- return mCombinedCardDataList.equals(that.mCombinedCardDataList);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), mCombinedCardDataList);
- }
-
- @Override
- public String toString() {
- return super.toString() + " + SmartspaceCombinedCardsUiTemplateData{"
- + "mCombinedCardDataList=" + mCombinedCardDataList
- + '}';
- }
-
- /**
- * A builder for {@link SmartspaceCombinedCardsUiTemplateData} object.
- *
- * @hide
- */
- @SystemApi
- public static final class Builder extends SmartspaceDefaultUiTemplateData.Builder {
-
- private final List<SmartspaceDefaultUiTemplateData> mCombinedCardDataList;
-
- /**
- * A builder for {@link SmartspaceCombinedCardsUiTemplateData}.
- */
- public Builder(@NonNull List<SmartspaceDefaultUiTemplateData> combinedCardDataList) {
- super(SmartspaceTarget.UI_TEMPLATE_COMBINED_CARDS);
- mCombinedCardDataList = Objects.requireNonNull(combinedCardDataList);
- }
-
- /**
- * Builds a new SmartspaceCombinedCardsUiTemplateData instance.
- *
- * @throws IllegalStateException if any required non-null field is null
- */
- @NonNull
- public SmartspaceCombinedCardsUiTemplateData build() {
- if (mCombinedCardDataList == null) {
- throw new IllegalStateException("Please assign a value to all @NonNull args.");
- }
- return new SmartspaceCombinedCardsUiTemplateData(getTemplateType(), getTitleText(),
- getTitleIcon(), getSubtitleText(), getSubtitleIcon(), getPrimaryTapAction(),
- getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
- getSupplementalSubtitleTapAction(), getSupplementalAlarmText(),
- mCombinedCardDataList);
- }
- }
-}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceDefaultUiTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SmartspaceDefaultUiTemplateData.java
deleted file mode 100644
index a7ac9c7..0000000
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceDefaultUiTemplateData.java
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * 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 android.app.smartspace.uitemplatedata;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SuppressLint;
-import android.annotation.SystemApi;
-import android.app.smartspace.SmartspaceTarget.UiTemplateType;
-import android.app.smartspace.SmartspaceUtils;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * Holds all the relevant data needed to render a Smartspace card with the default Ui Template.
- *
- * @hide
- */
-@SystemApi
-@SuppressLint("ParcelNotFinal")
-public class SmartspaceDefaultUiTemplateData implements Parcelable {
-
- /**
- * {@link UiTemplateType} indicating the template type of this template data.
- *
- * @see UiTemplateType
- */
- @UiTemplateType
- private final int mTemplateType;
-
- /**
- * Title text and title icon are shown at the first row. When both are absent, the date view
- * will be used, which has its own tap action applied to the title area.
- */
- @Nullable
- private final SmartspaceText mTitleText;
-
- @Nullable
- private final SmartspaceIcon mTitleIcon;
-
- /** Subtitle text and icon are shown at the second row. */
- @Nullable
- private final SmartspaceText mSubtitleText;
-
- @Nullable
- private final SmartspaceIcon mSubtitleIcon;
-
- /**
- * Primary tap action for the entire card, including the blank spaces, except: 1. When title is
- * absent, the date view's default tap action is used; 2. Supplemental subtitle uses its own tap
- * action if being set; 3. Secondary card uses its own tap action if being set.
- */
- @Nullable
- private final SmartspaceTapAction mPrimaryTapAction;
-
- /**
- * Supplemental subtitle text and icon are shown at the second row following the subtitle text.
- * Mainly used for weather info on non-weather card.
- */
- @Nullable
- private final SmartspaceText mSupplementalSubtitleText;
-
- @Nullable
- private final SmartspaceIcon mSupplementalSubtitleIcon;
-
- /**
- * Tap action for the supplemental subtitle's text and icon. Will use the primary tap action if
- * not being set.
- */
- @Nullable
- private final SmartspaceTapAction mSupplementalSubtitleTapAction;
-
- /**
- * Supplemental alarm text is specifically used for holiday alarm, which is appended to "next
- * alarm".
- */
- @Nullable
- private final SmartspaceText mSupplementalAlarmText;
-
- SmartspaceDefaultUiTemplateData(@NonNull Parcel in) {
- mTemplateType = in.readInt();
- mTitleText = in.readTypedObject(SmartspaceText.CREATOR);
- mTitleIcon = in.readTypedObject(SmartspaceIcon.CREATOR);
- mSubtitleText = in.readTypedObject(SmartspaceText.CREATOR);
- mSubtitleIcon = in.readTypedObject(SmartspaceIcon.CREATOR);
- mPrimaryTapAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
- mSupplementalSubtitleText = in.readTypedObject(SmartspaceText.CREATOR);
- mSupplementalSubtitleIcon = in.readTypedObject(SmartspaceIcon.CREATOR);
- mSupplementalSubtitleTapAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
- mSupplementalAlarmText = in.readTypedObject(SmartspaceText.CREATOR);
- }
-
- /**
- * Should ONLY used by subclasses. For the general instance creation, please use
- * SmartspaceDefaultUiTemplateData.Builder.
- */
- SmartspaceDefaultUiTemplateData(@UiTemplateType int templateType,
- @Nullable SmartspaceText titleText,
- @Nullable SmartspaceIcon titleIcon,
- @Nullable SmartspaceText subtitleText,
- @Nullable SmartspaceIcon subtitleIcon,
- @Nullable SmartspaceTapAction primaryTapAction,
- @Nullable SmartspaceText supplementalSubtitleText,
- @Nullable SmartspaceIcon supplementalSubtitleIcon,
- @Nullable SmartspaceTapAction supplementalSubtitleTapAction,
- @Nullable SmartspaceText supplementalAlarmText) {
- mTemplateType = templateType;
- mTitleText = titleText;
- mTitleIcon = titleIcon;
- mSubtitleText = subtitleText;
- mSubtitleIcon = subtitleIcon;
- mPrimaryTapAction = primaryTapAction;
- mSupplementalSubtitleText = supplementalSubtitleText;
- mSupplementalSubtitleIcon = supplementalSubtitleIcon;
- mSupplementalSubtitleTapAction = supplementalSubtitleTapAction;
- mSupplementalAlarmText = supplementalAlarmText;
- }
-
- @UiTemplateType
- public int getTemplateType() {
- return mTemplateType;
- }
-
- @Nullable
- public SmartspaceText getTitleText() {
- return mTitleText;
- }
-
- @Nullable
- public SmartspaceIcon getTitleIcon() {
- return mTitleIcon;
- }
-
- @Nullable
- public SmartspaceText getSubtitleText() {
- return mSubtitleText;
- }
-
- @Nullable
- public SmartspaceIcon getSubtitleIcon() {
- return mSubtitleIcon;
- }
-
- @Nullable
- public SmartspaceTapAction getPrimaryTapAction() {
- return mPrimaryTapAction;
- }
-
- @Nullable
- public SmartspaceText getSupplementalSubtitleText() {
- return mSupplementalSubtitleText;
- }
-
- @Nullable
- public SmartspaceIcon getSupplementalSubtitleIcon() {
- return mSupplementalSubtitleIcon;
- }
-
- @Nullable
- public SmartspaceTapAction getSupplementalSubtitleTapAction() {
- return mSupplementalSubtitleTapAction;
- }
-
- @Nullable
- public SmartspaceText getSupplementalAlarmText() {
- return mSupplementalAlarmText;
- }
-
- /**
- * @see Parcelable.Creator
- */
- @NonNull
- public static final Creator<SmartspaceDefaultUiTemplateData> CREATOR =
- new Creator<SmartspaceDefaultUiTemplateData>() {
- @Override
- public SmartspaceDefaultUiTemplateData createFromParcel(Parcel in) {
- return new SmartspaceDefaultUiTemplateData(in);
- }
-
- @Override
- public SmartspaceDefaultUiTemplateData[] newArray(int size) {
- return new SmartspaceDefaultUiTemplateData[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel out, int flags) {
- out.writeInt(mTemplateType);
- out.writeTypedObject(mTitleText, flags);
- out.writeTypedObject(mTitleIcon, flags);
- out.writeTypedObject(mSubtitleText, flags);
- out.writeTypedObject(mSubtitleIcon, flags);
- out.writeTypedObject(mPrimaryTapAction, flags);
- out.writeTypedObject(mSupplementalSubtitleText, flags);
- out.writeTypedObject(mSupplementalSubtitleIcon, flags);
- out.writeTypedObject(mSupplementalSubtitleTapAction, flags);
- out.writeTypedObject(mSupplementalAlarmText, flags);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof SmartspaceDefaultUiTemplateData)) return false;
- SmartspaceDefaultUiTemplateData that = (SmartspaceDefaultUiTemplateData) o;
- return mTemplateType == that.mTemplateType && SmartspaceUtils.isEqual(mTitleText,
- that.mTitleText)
- && Objects.equals(mTitleIcon, that.mTitleIcon)
- && SmartspaceUtils.isEqual(mSubtitleText, that.mSubtitleText)
- && Objects.equals(mSubtitleIcon, that.mSubtitleIcon)
- && Objects.equals(mPrimaryTapAction, that.mPrimaryTapAction)
- && SmartspaceUtils.isEqual(mSupplementalSubtitleText,
- that.mSupplementalSubtitleText)
- && Objects.equals(mSupplementalSubtitleIcon, that.mSupplementalSubtitleIcon)
- && Objects.equals(mSupplementalSubtitleTapAction,
- that.mSupplementalSubtitleTapAction)
- && SmartspaceUtils.isEqual(mSupplementalAlarmText, that.mSupplementalAlarmText);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mTemplateType, mTitleText, mTitleIcon, mSubtitleText, mSubtitleIcon,
- mPrimaryTapAction, mSupplementalSubtitleText, mSupplementalSubtitleIcon,
- mSupplementalSubtitleTapAction, mSupplementalAlarmText);
- }
-
- @Override
- public String toString() {
- return "SmartspaceDefaultUiTemplateData{"
- + "mTemplateType=" + mTemplateType
- + ", mTitleText=" + mTitleText
- + ", mTitleIcon=" + mTitleIcon
- + ", mSubtitleText=" + mSubtitleText
- + ", mSubTitleIcon=" + mSubtitleIcon
- + ", mPrimaryTapAction=" + mPrimaryTapAction
- + ", mSupplementalSubtitleText=" + mSupplementalSubtitleText
- + ", mSupplementalSubtitleIcon=" + mSupplementalSubtitleIcon
- + ", mSupplementalSubtitleTapAction=" + mSupplementalSubtitleTapAction
- + ", mSupplementalAlarmText=" + mSupplementalAlarmText
- + '}';
- }
-
- /**
- * A builder for {@link SmartspaceDefaultUiTemplateData} object.
- *
- * @hide
- */
- @SystemApi
- @SuppressLint("StaticFinalBuilder")
- public static class Builder {
- @UiTemplateType
- private final int mTemplateType;
- private SmartspaceText mTitleText;
- private SmartspaceIcon mTitleIcon;
- private SmartspaceText mSubtitleText;
- private SmartspaceIcon mSubtitleIcon;
- private SmartspaceTapAction mPrimaryTapAction;
- private SmartspaceText mSupplementalSubtitleText;
- private SmartspaceIcon mSupplementalSubtitleIcon;
- private SmartspaceTapAction mSupplementalSubtitleTapAction;
- private SmartspaceText mSupplementalAlarmText;
-
- /**
- * A builder for {@link SmartspaceDefaultUiTemplateData}.
- *
- * @param templateType the {@link UiTemplateType} of this template data.
- */
- public Builder(@UiTemplateType int templateType) {
- mTemplateType = templateType;
- }
-
- /** Should ONLY be used by the subclasses */
- @UiTemplateType
- @SuppressLint("GetterOnBuilder")
- int getTemplateType() {
- return mTemplateType;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceText getTitleText() {
- return mTitleText;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceIcon getTitleIcon() {
- return mTitleIcon;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceText getSubtitleText() {
- return mSubtitleText;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceIcon getSubtitleIcon() {
- return mSubtitleIcon;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceTapAction getPrimaryTapAction() {
- return mPrimaryTapAction;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceText getSupplementalSubtitleText() {
- return mSupplementalSubtitleText;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceIcon getSupplementalSubtitleIcon() {
- return mSupplementalSubtitleIcon;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceTapAction getSupplementalSubtitleTapAction() {
- return mSupplementalSubtitleTapAction;
- }
-
- /** Should ONLY be used by the subclasses */
- @Nullable
- @SuppressLint("GetterOnBuilder")
- SmartspaceText getSupplementalAlarmText() {
- return mSupplementalAlarmText;
- }
-
- /**
- * Sets the card title.
- */
- @NonNull
- public Builder setTitleText(@NonNull SmartspaceText titleText) {
- mTitleText = titleText;
- return this;
- }
-
- /**
- * Sets the card title icon.
- */
- @NonNull
- public Builder setTitleIcon(@NonNull SmartspaceIcon titleIcon) {
- mTitleIcon = titleIcon;
- return this;
- }
-
- /**
- * Sets the card subtitle.
- */
- @NonNull
- public Builder setSubtitleText(@NonNull SmartspaceText subtitleText) {
- mSubtitleText = subtitleText;
- return this;
- }
-
- /**
- * Sets the card subtitle icon.
- */
- @NonNull
- public Builder setSubtitleIcon(@NonNull SmartspaceIcon subtitleIcon) {
- mSubtitleIcon = subtitleIcon;
- return this;
- }
-
- /**
- * Sets the card primary tap action.
- */
- @NonNull
- public Builder setPrimaryTapAction(@NonNull SmartspaceTapAction primaryTapAction) {
- mPrimaryTapAction = primaryTapAction;
- return this;
- }
-
- /**
- * Sets the supplemental subtitle text.
- */
- @NonNull
- public Builder setSupplementalSubtitleText(
- @NonNull SmartspaceText supplementalSubtitleText) {
- mSupplementalSubtitleText = supplementalSubtitleText;
- return this;
- }
-
- /**
- * Sets the supplemental subtitle icon.
- */
- @NonNull
- public Builder setSupplementalSubtitleIcon(
- @NonNull SmartspaceIcon supplementalSubtitleIcon) {
- mSupplementalSubtitleIcon = supplementalSubtitleIcon;
- return this;
- }
-
- /**
- * Sets the supplemental subtitle tap action. {@code mPrimaryTapAction} will be used if not
- * being
- * set.
- */
- @NonNull
- public Builder setSupplementalSubtitleTapAction(
- @NonNull SmartspaceTapAction supplementalSubtitleTapAction) {
- mSupplementalSubtitleTapAction = supplementalSubtitleTapAction;
- return this;
- }
-
- /**
- * Sets the supplemental alarm text.
- */
- @NonNull
- public Builder setSupplementalAlarmText(@NonNull SmartspaceText supplementalAlarmText) {
- mSupplementalAlarmText = supplementalAlarmText;
- return this;
- }
-
- /**
- * Builds a new SmartspaceDefaultUiTemplateData instance.
- */
- @NonNull
- public SmartspaceDefaultUiTemplateData build() {
- return new SmartspaceDefaultUiTemplateData(mTemplateType, mTitleText, mTitleIcon,
- mSubtitleText, mSubtitleIcon, mPrimaryTapAction, mSupplementalSubtitleText,
- mSupplementalSubtitleIcon, mSupplementalSubtitleTapAction,
- mSupplementalAlarmText);
- }
- }
-}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceHeadToHeadUiTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SmartspaceHeadToHeadUiTemplateData.java
deleted file mode 100644
index bcd12eb..0000000
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceHeadToHeadUiTemplateData.java
+++ /dev/null
@@ -1,285 +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 android.app.smartspace.uitemplatedata;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.app.smartspace.SmartspaceTarget;
-import android.app.smartspace.SmartspaceUtils;
-import android.os.Parcel;
-
-import java.util.Objects;
-
-/**
- * Holds all the relevant data needed to render a Smartspace card with the head-to-head Ui Template.
- *
- * @hide
- */
-@SystemApi
-public final class SmartspaceHeadToHeadUiTemplateData extends SmartspaceDefaultUiTemplateData {
-
- @Nullable
- private final SmartspaceText mHeadToHeadTitle;
- @Nullable
- private final SmartspaceIcon mHeadToHeadFirstCompetitorIcon;
- @Nullable
- private final SmartspaceIcon mHeadToHeadSecondCompetitorIcon;
- @Nullable
- private final SmartspaceText mHeadToHeadFirstCompetitorText;
- @Nullable
- private final SmartspaceText mHeadToHeadSecondCompetitorText;
-
- /** Tap action for the head-to-head secondary card. */
- @Nullable
- private final SmartspaceTapAction mHeadToHeadAction;
-
- SmartspaceHeadToHeadUiTemplateData(@NonNull Parcel in) {
- super(in);
- mHeadToHeadTitle = in.readTypedObject(SmartspaceText.CREATOR);
- mHeadToHeadFirstCompetitorIcon = in.readTypedObject(SmartspaceIcon.CREATOR);
- mHeadToHeadSecondCompetitorIcon = in.readTypedObject(SmartspaceIcon.CREATOR);
- mHeadToHeadFirstCompetitorText = in.readTypedObject(SmartspaceText.CREATOR);
- mHeadToHeadSecondCompetitorText = in.readTypedObject(SmartspaceText.CREATOR);
- mHeadToHeadAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
- }
-
- private SmartspaceHeadToHeadUiTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
- @Nullable SmartspaceText titleText,
- @Nullable SmartspaceIcon titleIcon,
- @Nullable SmartspaceText subtitleText,
- @Nullable SmartspaceIcon subTitleIcon,
- @Nullable SmartspaceTapAction primaryTapAction,
- @Nullable SmartspaceText supplementalSubtitleText,
- @Nullable SmartspaceIcon supplementalSubtitleIcon,
- @Nullable SmartspaceTapAction supplementalSubtitleTapAction,
- @Nullable SmartspaceText supplementalAlarmText,
- @Nullable SmartspaceText headToHeadTitle,
- @Nullable SmartspaceIcon headToHeadFirstCompetitorIcon,
- @Nullable SmartspaceIcon headToHeadSecondCompetitorIcon,
- @Nullable SmartspaceText headToHeadFirstCompetitorText,
- @Nullable SmartspaceText headToHeadSecondCompetitorText,
- @Nullable SmartspaceTapAction headToHeadAction) {
- super(templateType, titleText, titleIcon, subtitleText, subTitleIcon, primaryTapAction,
- supplementalSubtitleText, supplementalSubtitleIcon, supplementalSubtitleTapAction,
- supplementalAlarmText);
- mHeadToHeadTitle = headToHeadTitle;
- mHeadToHeadFirstCompetitorIcon = headToHeadFirstCompetitorIcon;
- mHeadToHeadSecondCompetitorIcon = headToHeadSecondCompetitorIcon;
- mHeadToHeadFirstCompetitorText = headToHeadFirstCompetitorText;
- mHeadToHeadSecondCompetitorText = headToHeadSecondCompetitorText;
- mHeadToHeadAction = headToHeadAction;
- }
-
- @Nullable
- public SmartspaceText getHeadToHeadTitle() {
- return mHeadToHeadTitle;
- }
-
- @Nullable
- public SmartspaceIcon getHeadToHeadFirstCompetitorIcon() {
- return mHeadToHeadFirstCompetitorIcon;
- }
-
- @Nullable
- public SmartspaceIcon getHeadToHeadSecondCompetitorIcon() {
- return mHeadToHeadSecondCompetitorIcon;
- }
-
- @Nullable
- public SmartspaceText getHeadToHeadFirstCompetitorText() {
- return mHeadToHeadFirstCompetitorText;
- }
-
- @Nullable
- public SmartspaceText getHeadToHeadSecondCompetitorText() {
- return mHeadToHeadSecondCompetitorText;
- }
-
- @Nullable
- public SmartspaceTapAction getHeadToHeadAction() {
- return mHeadToHeadAction;
- }
-
- /**
- * @see Parcelable.Creator
- */
- @NonNull
- public static final Creator<SmartspaceHeadToHeadUiTemplateData> CREATOR =
- new Creator<SmartspaceHeadToHeadUiTemplateData>() {
- @Override
- public SmartspaceHeadToHeadUiTemplateData createFromParcel(Parcel in) {
- return new SmartspaceHeadToHeadUiTemplateData(in);
- }
-
- @Override
- public SmartspaceHeadToHeadUiTemplateData[] newArray(int size) {
- return new SmartspaceHeadToHeadUiTemplateData[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeTypedObject(mHeadToHeadTitle, flags);
- out.writeTypedObject(mHeadToHeadFirstCompetitorIcon, flags);
- out.writeTypedObject(mHeadToHeadSecondCompetitorIcon, flags);
- out.writeTypedObject(mHeadToHeadFirstCompetitorText, flags);
- out.writeTypedObject(mHeadToHeadSecondCompetitorText, flags);
- out.writeTypedObject(mHeadToHeadAction, flags);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof SmartspaceHeadToHeadUiTemplateData)) return false;
- if (!super.equals(o)) return false;
- SmartspaceHeadToHeadUiTemplateData that = (SmartspaceHeadToHeadUiTemplateData) o;
- return SmartspaceUtils.isEqual(mHeadToHeadTitle, that.mHeadToHeadTitle) && Objects.equals(
- mHeadToHeadFirstCompetitorIcon, that.mHeadToHeadFirstCompetitorIcon)
- && Objects.equals(
- mHeadToHeadSecondCompetitorIcon, that.mHeadToHeadSecondCompetitorIcon)
- && SmartspaceUtils.isEqual(mHeadToHeadFirstCompetitorText,
- that.mHeadToHeadFirstCompetitorText)
- && SmartspaceUtils.isEqual(mHeadToHeadSecondCompetitorText,
- that.mHeadToHeadSecondCompetitorText)
- && Objects.equals(
- mHeadToHeadAction, that.mHeadToHeadAction);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), mHeadToHeadTitle, mHeadToHeadFirstCompetitorIcon,
- mHeadToHeadSecondCompetitorIcon, mHeadToHeadFirstCompetitorText,
- mHeadToHeadSecondCompetitorText,
- mHeadToHeadAction);
- }
-
- @Override
- public String toString() {
- return super.toString() + " + SmartspaceHeadToHeadUiTemplateData{"
- + "mH2HTitle=" + mHeadToHeadTitle
- + ", mH2HFirstCompetitorIcon=" + mHeadToHeadFirstCompetitorIcon
- + ", mH2HSecondCompetitorIcon=" + mHeadToHeadSecondCompetitorIcon
- + ", mH2HFirstCompetitorText=" + mHeadToHeadFirstCompetitorText
- + ", mH2HSecondCompetitorText=" + mHeadToHeadSecondCompetitorText
- + ", mH2HAction=" + mHeadToHeadAction
- + '}';
- }
-
- /**
- * A builder for {@link SmartspaceHeadToHeadUiTemplateData} object.
- *
- * @hide
- */
- @SystemApi
- public static final class Builder extends SmartspaceDefaultUiTemplateData.Builder {
-
- private SmartspaceText mHeadToHeadTitle;
- private SmartspaceIcon mHeadToHeadFirstCompetitorIcon;
- private SmartspaceIcon mHeadToHeadSecondCompetitorIcon;
- private SmartspaceText mHeadToHeadFirstCompetitorText;
- private SmartspaceText mHeadToHeadSecondCompetitorText;
- private SmartspaceTapAction mHeadToHeadAction;
-
- /**
- * A builder for {@link SmartspaceHeadToHeadUiTemplateData}.
- */
- public Builder() {
- super(SmartspaceTarget.UI_TEMPLATE_HEAD_TO_HEAD);
- }
-
- /**
- * Sets the head-to-head card's title
- */
- @NonNull
- public Builder setHeadToHeadTitle(@Nullable SmartspaceText headToHeadTitle) {
- mHeadToHeadTitle = headToHeadTitle;
- return this;
- }
-
- /**
- * Sets the head-to-head card's first competitor icon
- */
- @NonNull
- public Builder setHeadToHeadFirstCompetitorIcon(
- @Nullable SmartspaceIcon headToHeadFirstCompetitorIcon) {
- mHeadToHeadFirstCompetitorIcon = headToHeadFirstCompetitorIcon;
- return this;
- }
-
- /**
- * Sets the head-to-head card's second competitor icon
- */
- @NonNull
- public Builder setHeadToHeadSecondCompetitorIcon(
- @Nullable SmartspaceIcon headToHeadSecondCompetitorIcon) {
- mHeadToHeadSecondCompetitorIcon = headToHeadSecondCompetitorIcon;
- return this;
- }
-
- /**
- * Sets the head-to-head card's first competitor text
- */
- @NonNull
- public Builder setHeadToHeadFirstCompetitorText(
- @Nullable SmartspaceText headToHeadFirstCompetitorText) {
- mHeadToHeadFirstCompetitorText = headToHeadFirstCompetitorText;
- return this;
- }
-
- /**
- * Sets the head-to-head card's second competitor text
- */
- @NonNull
- public Builder setHeadToHeadSecondCompetitorText(
- @Nullable SmartspaceText headToHeadSecondCompetitorText) {
- mHeadToHeadSecondCompetitorText = headToHeadSecondCompetitorText;
- return this;
- }
-
- /**
- * Sets the head-to-head card's tap action
- */
- @NonNull
- public Builder setHeadToHeadAction(@Nullable SmartspaceTapAction headToHeadAction) {
- mHeadToHeadAction = headToHeadAction;
- return this;
- }
-
- /**
- * Builds a new SmartspaceHeadToHeadUiTemplateData instance.
- */
- @NonNull
- public SmartspaceHeadToHeadUiTemplateData build() {
- return new SmartspaceHeadToHeadUiTemplateData(getTemplateType(), getTitleText(),
- getTitleIcon(), getSubtitleText(), getSubtitleIcon(), getPrimaryTapAction(),
- getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
- getSupplementalSubtitleTapAction(), getSupplementalAlarmText(),
- mHeadToHeadTitle,
- mHeadToHeadFirstCompetitorIcon,
- mHeadToHeadSecondCompetitorIcon, mHeadToHeadFirstCompetitorText,
- mHeadToHeadSecondCompetitorText,
- mHeadToHeadAction);
- }
- }
-}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubCardUiTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubCardUiTemplateData.java
deleted file mode 100644
index 2db13d31..0000000
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubCardUiTemplateData.java
+++ /dev/null
@@ -1,197 +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 android.app.smartspace.uitemplatedata;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.app.smartspace.SmartspaceTarget;
-import android.app.smartspace.SmartspaceUtils;
-import android.os.Parcel;
-
-import java.util.Objects;
-
-/**
- * Holds all the relevant data needed to render a Smartspace card with the sub-card Ui Template.
- *
- * @hide
- */
-@SystemApi
-public final class SmartspaceSubCardUiTemplateData extends SmartspaceDefaultUiTemplateData {
-
- /** Icon for the sub-card. */
- @NonNull
- private final SmartspaceIcon mSubCardIcon;
-
- /** Text for the sub-card, which shows below the icon when being set. */
- @Nullable
- private final SmartspaceText mSubCardText;
-
- /** Tap action for the sub-card secondary card. */
- @Nullable
- private final SmartspaceTapAction mSubCardAction;
-
- SmartspaceSubCardUiTemplateData(@NonNull Parcel in) {
- super(in);
- mSubCardIcon = in.readTypedObject(SmartspaceIcon.CREATOR);
- mSubCardText = in.readTypedObject(SmartspaceText.CREATOR);
- mSubCardAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
- }
-
- private SmartspaceSubCardUiTemplateData(int templateType,
- @Nullable SmartspaceText titleText,
- @Nullable SmartspaceIcon titleIcon,
- @Nullable SmartspaceText subtitleText,
- @Nullable SmartspaceIcon subTitleIcon,
- @Nullable SmartspaceTapAction primaryTapAction,
- @Nullable SmartspaceText supplementalSubtitleText,
- @Nullable SmartspaceIcon supplementalSubtitleIcon,
- @Nullable SmartspaceTapAction supplementalSubtitleTapAction,
- @Nullable SmartspaceText supplementalAlarmText,
- @NonNull SmartspaceIcon subCardIcon,
- @Nullable SmartspaceText subCardText,
- @Nullable SmartspaceTapAction subCardAction) {
- super(templateType, titleText, titleIcon, subtitleText, subTitleIcon, primaryTapAction,
- supplementalSubtitleText, supplementalSubtitleIcon, supplementalSubtitleTapAction,
- supplementalAlarmText);
- mSubCardIcon = subCardIcon;
- mSubCardText = subCardText;
- mSubCardAction = subCardAction;
- }
-
- @NonNull
- public SmartspaceIcon getSubCardIcon() {
- return mSubCardIcon;
- }
-
- @Nullable
- public SmartspaceText getSubCardText() {
- return mSubCardText;
- }
-
- @Nullable
- public SmartspaceTapAction getSubCardAction() {
- return mSubCardAction;
- }
-
- /**
- * @see Parcelable.Creator
- */
- @NonNull
- public static final Creator<SmartspaceSubCardUiTemplateData> CREATOR =
- new Creator<SmartspaceSubCardUiTemplateData>() {
- @Override
- public SmartspaceSubCardUiTemplateData createFromParcel(Parcel in) {
- return new SmartspaceSubCardUiTemplateData(in);
- }
-
- @Override
- public SmartspaceSubCardUiTemplateData[] newArray(int size) {
- return new SmartspaceSubCardUiTemplateData[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeTypedObject(mSubCardIcon, flags);
- out.writeTypedObject(mSubCardText, flags);
- out.writeTypedObject(mSubCardAction, flags);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof SmartspaceSubCardUiTemplateData)) return false;
- if (!super.equals(o)) return false;
- SmartspaceSubCardUiTemplateData that = (SmartspaceSubCardUiTemplateData) o;
- return mSubCardIcon.equals(that.mSubCardIcon) && SmartspaceUtils.isEqual(mSubCardText,
- that.mSubCardText) && Objects.equals(mSubCardAction,
- that.mSubCardAction);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), mSubCardIcon, mSubCardText, mSubCardAction);
- }
-
- @Override
- public String toString() {
- return super.toString() + " + SmartspaceSubCardUiTemplateData{"
- + "mSubCardIcon=" + mSubCardIcon
- + ", mSubCardText=" + mSubCardText
- + ", mSubCardAction=" + mSubCardAction
- + '}';
- }
-
- /**
- * A builder for {@link SmartspaceSubCardUiTemplateData} object.
- *
- * @hide
- */
- @SystemApi
- public static final class Builder extends SmartspaceDefaultUiTemplateData.Builder {
-
- private final SmartspaceIcon mSubCardIcon;
- private SmartspaceText mSubCardText;
- private SmartspaceTapAction mSubCardAction;
-
- /**
- * A builder for {@link SmartspaceSubCardUiTemplateData}.
- */
- public Builder(@NonNull SmartspaceIcon subCardIcon) {
- super(SmartspaceTarget.UI_TEMPLATE_SUB_CARD);
- mSubCardIcon = Objects.requireNonNull(subCardIcon);
- }
-
- /**
- * Sets the card text.
- */
- @NonNull
- public Builder setSubCardText(@NonNull SmartspaceText subCardText) {
- mSubCardText = subCardText;
- return this;
- }
-
- /**
- * Sets the card tap action.
- */
- @NonNull
- public Builder setSubCardAction(@NonNull SmartspaceTapAction subCardAction) {
- mSubCardAction = subCardAction;
- return this;
- }
-
- /**
- * Builds a new SmartspaceSubCardUiTemplateData instance.
- */
- @NonNull
- public SmartspaceSubCardUiTemplateData build() {
- return new SmartspaceSubCardUiTemplateData(getTemplateType(), getTitleText(),
- getTitleIcon(), getSubtitleText(), getSubtitleIcon(), getPrimaryTapAction(),
- getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
- getSupplementalSubtitleTapAction(), getSupplementalAlarmText(), mSubCardIcon,
- mSubCardText,
- mSubCardAction);
- }
- }
-}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubImageUiTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubImageUiTemplateData.java
deleted file mode 100644
index 2fe4cf8..0000000
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubImageUiTemplateData.java
+++ /dev/null
@@ -1,190 +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 android.app.smartspace.uitemplatedata;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.app.smartspace.SmartspaceTarget;
-import android.os.Parcel;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Holds all the relevant data needed to render a Smartspace card with the sub-image Ui Template.
- *
- * @hide
- */
-@SystemApi
-public final class SmartspaceSubImageUiTemplateData extends SmartspaceDefaultUiTemplateData {
-
- /** Texts are shown next to the image as a vertical list */
- @NonNull
- private final List<SmartspaceText> mSubImageTexts;
-
- /** If multiple images are passed in, they will be rendered as GIF. */
- @NonNull
- private final List<SmartspaceIcon> mSubImages;
-
- /** Tap action for the sub-image secondary card. */
- @Nullable
- private final SmartspaceTapAction mSubImageAction;
-
- SmartspaceSubImageUiTemplateData(@NonNull Parcel in) {
- super(in);
- mSubImageTexts = in.createTypedArrayList(SmartspaceText.CREATOR);
- mSubImages = in.createTypedArrayList(SmartspaceIcon.CREATOR);
- mSubImageAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
- }
-
- private SmartspaceSubImageUiTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
- @Nullable SmartspaceText titleText,
- @Nullable SmartspaceIcon titleIcon,
- @Nullable SmartspaceText subtitleText,
- @Nullable SmartspaceIcon subTitleIcon,
- @Nullable SmartspaceTapAction primaryTapAction,
- @Nullable SmartspaceText supplementalSubtitleText,
- @Nullable SmartspaceIcon supplementalSubtitleIcon,
- @Nullable SmartspaceTapAction supplementalSubtitleTapAction,
- @Nullable SmartspaceText supplementalAlarmText,
- @NonNull List<SmartspaceText> subImageTexts,
- @NonNull List<SmartspaceIcon> subImages,
- @Nullable SmartspaceTapAction subImageAction) {
- super(templateType, titleText, titleIcon, subtitleText, subTitleIcon, primaryTapAction,
- supplementalSubtitleText, supplementalSubtitleIcon, supplementalSubtitleTapAction,
- supplementalAlarmText);
- mSubImageTexts = subImageTexts;
- mSubImages = subImages;
- mSubImageAction = subImageAction;
- }
-
- @NonNull
- public List<SmartspaceText> getSubImageTexts() {
- return mSubImageTexts;
- }
-
- @NonNull
- public List<SmartspaceIcon> getSubImages() {
- return mSubImages;
- }
-
- @Nullable
- public SmartspaceTapAction getSubImageAction() {
- return mSubImageAction;
- }
-
- /**
- * @see Parcelable.Creator
- */
- @NonNull
- public static final Creator<SmartspaceSubImageUiTemplateData> CREATOR =
- new Creator<SmartspaceSubImageUiTemplateData>() {
- @Override
- public SmartspaceSubImageUiTemplateData createFromParcel(Parcel in) {
- return new SmartspaceSubImageUiTemplateData(in);
- }
-
- @Override
- public SmartspaceSubImageUiTemplateData[] newArray(int size) {
- return new SmartspaceSubImageUiTemplateData[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeTypedList(mSubImageTexts);
- out.writeTypedList(mSubImages);
- out.writeTypedObject(mSubImageAction, flags);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof SmartspaceSubImageUiTemplateData)) return false;
- if (!super.equals(o)) return false;
- SmartspaceSubImageUiTemplateData that = (SmartspaceSubImageUiTemplateData) o;
- return Objects.equals(mSubImageTexts, that.mSubImageTexts)
- && Objects.equals(mSubImages, that.mSubImages) && Objects.equals(
- mSubImageAction, that.mSubImageAction);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), mSubImageTexts, mSubImages, mSubImageAction);
- }
-
- @Override
- public String toString() {
- return super.toString() + " + SmartspaceSubImageUiTemplateData{"
- + "mSubImageTexts=" + mSubImageTexts
- + ", mSubImages=" + mSubImages
- + ", mSubImageAction=" + mSubImageAction
- + '}';
- }
-
- /**
- * A builder for {@link SmartspaceSubImageUiTemplateData} object.
- *
- * @hide
- */
- @SystemApi
- public static final class Builder extends SmartspaceDefaultUiTemplateData.Builder {
-
- private final List<SmartspaceText> mSubImageTexts;
- private final List<SmartspaceIcon> mSubImages;
- private SmartspaceTapAction mSubImageAction;
-
- /**
- * A builder for {@link SmartspaceSubImageUiTemplateData}.
- */
- public Builder(@NonNull List<SmartspaceText> subImageTexts,
- @NonNull List<SmartspaceIcon> subImages) {
- super(SmartspaceTarget.UI_TEMPLATE_SUB_IMAGE);
- mSubImageTexts = Objects.requireNonNull(subImageTexts);
- mSubImages = Objects.requireNonNull(subImages);
- }
-
- /**
- * Sets the card tap action.
- */
- @NonNull
- public Builder setSubImageAction(@NonNull SmartspaceTapAction subImageAction) {
- mSubImageAction = subImageAction;
- return this;
- }
-
- /**
- * Builds a new SmartspaceSubImageUiTemplateData instance.
- */
- @NonNull
- public SmartspaceSubImageUiTemplateData build() {
- return new SmartspaceSubImageUiTemplateData(getTemplateType(), getTitleText(),
- getTitleIcon(), getSubtitleText(), getSubtitleIcon(), getPrimaryTapAction(),
- getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
- getSupplementalSubtitleTapAction(), getSupplementalAlarmText(), mSubImageTexts,
- mSubImages,
- mSubImageAction);
- }
- }
-}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubListUiTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubListUiTemplateData.java
deleted file mode 100644
index 9512c7f..0000000
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceSubListUiTemplateData.java
+++ /dev/null
@@ -1,195 +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 android.app.smartspace.uitemplatedata;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.app.smartspace.SmartspaceTarget;
-import android.os.Parcel;
-
-import java.util.List;
-import java.util.Objects;
-
-
-/**
- * Holds all the relevant data needed to render a Smartspace card with the sub-list Ui Template.
- *
- * @hide
- */
-@SystemApi
-public final class SmartspaceSubListUiTemplateData extends SmartspaceDefaultUiTemplateData {
-
- @Nullable
- private final SmartspaceIcon mSubListIcon;
- @NonNull
- private final List<SmartspaceText> mSubListTexts;
-
- /** Tap action for the sub-list secondary card. */
- @Nullable
- private final SmartspaceTapAction mSubListAction;
-
- SmartspaceSubListUiTemplateData(@NonNull Parcel in) {
- super(in);
- mSubListIcon = in.readTypedObject(SmartspaceIcon.CREATOR);
- mSubListTexts = in.createTypedArrayList(SmartspaceText.CREATOR);
- mSubListAction = in.readTypedObject(SmartspaceTapAction.CREATOR);
- }
-
- private SmartspaceSubListUiTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
- @Nullable SmartspaceText titleText,
- @Nullable SmartspaceIcon titleIcon,
- @Nullable SmartspaceText subtitleText,
- @Nullable SmartspaceIcon subTitleIcon,
- @Nullable SmartspaceTapAction primaryTapAction,
- @Nullable SmartspaceText supplementalSubtitleText,
- @Nullable SmartspaceIcon supplementalSubtitleIcon,
- @Nullable SmartspaceTapAction supplementalSubtitleTapAction,
- @Nullable SmartspaceText supplementalAlarmText,
- @Nullable SmartspaceIcon subListIcon,
- @NonNull List<SmartspaceText> subListTexts,
- @Nullable SmartspaceTapAction subListAction) {
- super(templateType, titleText, titleIcon, subtitleText, subTitleIcon, primaryTapAction,
- supplementalSubtitleText, supplementalSubtitleIcon, supplementalSubtitleTapAction,
- supplementalAlarmText);
- mSubListIcon = subListIcon;
- mSubListTexts = subListTexts;
- mSubListAction = subListAction;
- }
-
- @Nullable
- public SmartspaceIcon getSubListIcon() {
- return mSubListIcon;
- }
-
- @NonNull
- public List<SmartspaceText> getSubListTexts() {
- return mSubListTexts;
- }
-
- @Nullable
- public SmartspaceTapAction getSubListAction() {
- return mSubListAction;
- }
-
- /**
- * @see Parcelable.Creator
- */
- @NonNull
- public static final Creator<SmartspaceSubListUiTemplateData> CREATOR =
- new Creator<SmartspaceSubListUiTemplateData>() {
- @Override
- public SmartspaceSubListUiTemplateData createFromParcel(Parcel in) {
- return new SmartspaceSubListUiTemplateData(in);
- }
-
- @Override
- public SmartspaceSubListUiTemplateData[] newArray(int size) {
- return new SmartspaceSubListUiTemplateData[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeTypedObject(mSubListIcon, flags);
- out.writeTypedList(mSubListTexts);
- out.writeTypedObject(mSubListAction, flags);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof SmartspaceSubListUiTemplateData)) return false;
- if (!super.equals(o)) return false;
- SmartspaceSubListUiTemplateData that = (SmartspaceSubListUiTemplateData) o;
- return Objects.equals(mSubListIcon, that.mSubListIcon) && Objects.equals(
- mSubListTexts, that.mSubListTexts) && Objects.equals(mSubListAction,
- that.mSubListAction);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), mSubListIcon, mSubListTexts, mSubListAction);
- }
-
- @Override
- public String toString() {
- return super.toString() + " + SmartspaceSubListUiTemplateData{"
- + "mSubListIcon=" + mSubListIcon
- + ", mSubListTexts=" + mSubListTexts
- + ", mSubListAction=" + mSubListAction
- + '}';
- }
-
- /**
- * A builder for {@link SmartspaceSubListUiTemplateData} object.
- *
- * @hide
- */
- @SystemApi
- public static final class Builder extends SmartspaceDefaultUiTemplateData.Builder {
-
- private SmartspaceIcon mSubListIcon;
- private final List<SmartspaceText> mSubListTexts;
- private SmartspaceTapAction mSubListAction;
-
- /**
- * A builder for {@link SmartspaceSubListUiTemplateData}.
- */
- public Builder(@NonNull List<SmartspaceText> subListTexts) {
- super(SmartspaceTarget.UI_TEMPLATE_SUB_LIST);
- mSubListTexts = Objects.requireNonNull(subListTexts);
- }
-
- /**
- * Sets the sub-list card icon.
- */
- @NonNull
- public Builder setSubListIcon(@NonNull SmartspaceIcon subListIcon) {
- mSubListIcon = subListIcon;
- return this;
- }
-
- /**
- * Sets the card tap action.
- */
- @NonNull
- public Builder setSubListAction(@NonNull SmartspaceTapAction subListAction) {
- mSubListAction = subListAction;
- return this;
- }
-
- /**
- * Builds a new SmartspaceSubListUiTemplateData instance.
- */
- @NonNull
- public SmartspaceSubListUiTemplateData build() {
- return new SmartspaceSubListUiTemplateData(getTemplateType(), getTitleText(),
- getTitleIcon(), getSubtitleText(), getSubtitleIcon(), getPrimaryTapAction(),
- getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
- getSupplementalSubtitleTapAction(), getSupplementalAlarmText(), mSubListIcon,
- mSubListTexts,
- mSubListAction);
- }
- }
-}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SubCardTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SubCardTemplateData.java
new file mode 100644
index 0000000..48af9c1
--- /dev/null
+++ b/core/java/android/app/smartspace/uitemplatedata/SubCardTemplateData.java
@@ -0,0 +1,223 @@
+/*
+ * 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 android.app.smartspace.uitemplatedata;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.smartspace.SmartspaceTarget;
+import android.app.smartspace.SmartspaceUtils;
+import android.os.Parcel;
+
+import java.util.Objects;
+
+/**
+ * Holds all the relevant data needed to render a Smartspace card with the sub-card Ui Template.
+ *
+ * This template will add a sub-card card within the default-template card:
+ * <ul>
+ * <li> sub-card icon </li>
+ * <li> sub-card text </li>
+ * </ul>
+ *
+ * @hide
+ */
+@SystemApi
+public final class SubCardTemplateData extends BaseTemplateData {
+
+ /** Icon for the sub-card. */
+ @NonNull
+ private final Icon mSubCardIcon;
+
+ /** Text for the sub-card, which shows below the icon when being set. */
+ @Nullable
+ private final Text mSubCardText;
+
+ /** Tap action for the sub-card secondary card. */
+ @Nullable
+ private final TapAction mSubCardAction;
+
+ SubCardTemplateData(@NonNull Parcel in) {
+ super(in);
+ mSubCardIcon = in.readTypedObject(Icon.CREATOR);
+ mSubCardText = in.readTypedObject(Text.CREATOR);
+ mSubCardAction = in.readTypedObject(TapAction.CREATOR);
+ }
+
+ private SubCardTemplateData(int templateType,
+ @Nullable Text titleText,
+ @Nullable Icon titleIcon,
+ @Nullable Text subtitleText,
+ @Nullable Icon subtitleIcon,
+ @Nullable TapAction primaryTapAction,
+ @Nullable SubItemLoggingInfo primaryLoggingInfo,
+ @Nullable Text supplementalSubtitleText,
+ @Nullable Icon supplementalSubtitleIcon,
+ @Nullable TapAction supplementalSubtitleTapAction,
+ @Nullable SubItemLoggingInfo supplementalSubtitleLoggingInfo,
+ @Nullable Text supplementalText,
+ @Nullable Icon supplementalIcon,
+ @Nullable TapAction supplementalTapAction,
+ @Nullable SubItemLoggingInfo supplementalLoggingInfo,
+ @Nullable Text supplementalAlarmText,
+ int layoutWeight,
+ @NonNull Icon subCardIcon,
+ @Nullable Text subCardText,
+ @Nullable TapAction subCardAction) {
+ super(templateType, titleText, titleIcon, subtitleText, subtitleIcon,
+ primaryTapAction, primaryLoggingInfo,
+ supplementalSubtitleText, supplementalSubtitleIcon,
+ supplementalSubtitleTapAction, supplementalSubtitleLoggingInfo,
+ supplementalText, supplementalIcon,
+ supplementalTapAction, supplementalLoggingInfo,
+ supplementalAlarmText, layoutWeight);
+
+ mSubCardIcon = subCardIcon;
+ mSubCardText = subCardText;
+ mSubCardAction = subCardAction;
+ }
+
+ /** Returns the sub-card card's icon. */
+ @NonNull
+ public Icon getSubCardIcon() {
+ return mSubCardIcon;
+ }
+
+ /** Returns the sub-card card's text. */
+ @Nullable
+ public Text getSubCardText() {
+ return mSubCardText;
+ }
+
+ /** Returns the sub-card card's tap action. */
+ @Nullable
+ public TapAction getSubCardAction() {
+ return mSubCardAction;
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<SubCardTemplateData> CREATOR =
+ new Creator<SubCardTemplateData>() {
+ @Override
+ public SubCardTemplateData createFromParcel(Parcel in) {
+ return new SubCardTemplateData(in);
+ }
+
+ @Override
+ public SubCardTemplateData[] newArray(int size) {
+ return new SubCardTemplateData[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeTypedObject(mSubCardIcon, flags);
+ out.writeTypedObject(mSubCardText, flags);
+ out.writeTypedObject(mSubCardAction, flags);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SubCardTemplateData)) return false;
+ if (!super.equals(o)) return false;
+ SubCardTemplateData that = (SubCardTemplateData) o;
+ return mSubCardIcon.equals(that.mSubCardIcon) && SmartspaceUtils.isEqual(mSubCardText,
+ that.mSubCardText) && Objects.equals(mSubCardAction,
+ that.mSubCardAction);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mSubCardIcon, mSubCardText, mSubCardAction);
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + " + SmartspaceSubCardUiTemplateData{"
+ + "mSubCardIcon=" + mSubCardIcon
+ + ", mSubCardText=" + mSubCardText
+ + ", mSubCardAction=" + mSubCardAction
+ + '}';
+ }
+
+ /**
+ * A builder for {@link SubCardTemplateData} object.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder extends BaseTemplateData.Builder {
+
+ private final Icon mSubCardIcon;
+ private Text mSubCardText;
+ private TapAction mSubCardAction;
+
+ /**
+ * A builder for {@link SubCardTemplateData}.
+ */
+ public Builder(@NonNull Icon subCardIcon) {
+ super(SmartspaceTarget.UI_TEMPLATE_SUB_CARD);
+ mSubCardIcon = Objects.requireNonNull(subCardIcon);
+ }
+
+ /**
+ * Sets the card text.
+ */
+ @NonNull
+ public Builder setSubCardText(@NonNull Text subCardText) {
+ mSubCardText = subCardText;
+ return this;
+ }
+
+ /**
+ * Sets the card tap action.
+ */
+ @NonNull
+ public Builder setSubCardAction(@NonNull TapAction subCardAction) {
+ mSubCardAction = subCardAction;
+ return this;
+ }
+
+ /**
+ * Builds a new SmartspaceSubCardUiTemplateData instance.
+ */
+ @NonNull
+ public SubCardTemplateData build() {
+ return new SubCardTemplateData(getTemplateType(), getTitleText(),
+ getTitleIcon(), getSubtitleText(), getSubtitleIcon(),
+ getPrimaryTapAction(), getPrimaryLoggingInfo(),
+ getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
+ getSupplementalSubtitleTapAction(), getSupplementalSubtitleLoggingInfo(),
+ getSupplementalText(), getSupplementalIcon(),
+ getSupplementalTapAction(), getSupplementalLoggingInfo(),
+ getSupplementalAlarmText(), getLayoutWeight(),
+ mSubCardIcon,
+ mSubCardText,
+ mSubCardAction);
+ }
+ }
+}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SubImageTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SubImageTemplateData.java
new file mode 100644
index 0000000..38692cd
--- /dev/null
+++ b/core/java/android/app/smartspace/uitemplatedata/SubImageTemplateData.java
@@ -0,0 +1,220 @@
+/*
+ * 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 android.app.smartspace.uitemplatedata;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.smartspace.SmartspaceTarget;
+import android.os.Parcel;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Holds all the relevant data needed to render a Smartspace card with the sub-image Ui Template.
+ *
+ * This template will add a sub-image card within the default-template card:
+ * <ul>
+ * <li> sub-image text1 </li> <ul>
+ * <li> sub-image text2 </li> image (can be a GIF)
+ * ... </ul>
+ * </ul>
+ *
+ * @hide
+ */
+@SystemApi
+public final class SubImageTemplateData extends BaseTemplateData {
+
+ /** Texts are shown next to the image as a vertical list */
+ @NonNull
+ private final List<Text> mSubImageTexts;
+
+ /** If multiple images are passed in, they will be rendered as GIF. */
+ @NonNull
+ private final List<Icon> mSubImages;
+
+ /** Tap action for the sub-image secondary card. */
+ @Nullable
+ private final TapAction mSubImageAction;
+
+ SubImageTemplateData(@NonNull Parcel in) {
+ super(in);
+ mSubImageTexts = in.createTypedArrayList(Text.CREATOR);
+ mSubImages = in.createTypedArrayList(Icon.CREATOR);
+ mSubImageAction = in.readTypedObject(TapAction.CREATOR);
+ }
+
+ private SubImageTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
+ @Nullable Text titleText,
+ @Nullable Icon titleIcon,
+ @Nullable Text subtitleText,
+ @Nullable Icon subtitleIcon,
+ @Nullable TapAction primaryTapAction,
+ @Nullable SubItemLoggingInfo primaryLoggingInfo,
+ @Nullable Text supplementalSubtitleText,
+ @Nullable Icon supplementalSubtitleIcon,
+ @Nullable TapAction supplementalSubtitleTapAction,
+ @Nullable SubItemLoggingInfo supplementalSubtitleLoggingInfo,
+ @Nullable Text supplementalText,
+ @Nullable Icon supplementalIcon,
+ @Nullable TapAction supplementalTapAction,
+ @Nullable SubItemLoggingInfo supplementalLoggingInfo,
+ @Nullable Text supplementalAlarmText,
+ int layoutWeight,
+ @NonNull List<Text> subImageTexts,
+ @NonNull List<Icon> subImages,
+ @Nullable TapAction subImageAction) {
+ super(templateType, titleText, titleIcon, subtitleText, subtitleIcon,
+ primaryTapAction, primaryLoggingInfo,
+ supplementalSubtitleText, supplementalSubtitleIcon,
+ supplementalSubtitleTapAction, supplementalSubtitleLoggingInfo,
+ supplementalText, supplementalIcon,
+ supplementalTapAction, supplementalLoggingInfo,
+ supplementalAlarmText, layoutWeight);
+
+ mSubImageTexts = subImageTexts;
+ mSubImages = subImages;
+ mSubImageAction = subImageAction;
+ }
+
+ /** Returns the list of sub-image card's texts. Can be empty if not being set. */
+ @NonNull
+ public List<Text> getSubImageTexts() {
+ return mSubImageTexts;
+ }
+
+ /**
+ * Returns the list of sub-image card's image. It's a single-element list if it's a static
+ * image, or a multi-elements list if it's a GIF.
+ */
+ @NonNull
+ public List<Icon> getSubImages() {
+ return mSubImages;
+ }
+
+ /** Returns the sub-image card's tap action. */
+ @Nullable
+ public TapAction getSubImageAction() {
+ return mSubImageAction;
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<SubImageTemplateData> CREATOR =
+ new Creator<SubImageTemplateData>() {
+ @Override
+ public SubImageTemplateData createFromParcel(Parcel in) {
+ return new SubImageTemplateData(in);
+ }
+
+ @Override
+ public SubImageTemplateData[] newArray(int size) {
+ return new SubImageTemplateData[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeTypedList(mSubImageTexts);
+ out.writeTypedList(mSubImages);
+ out.writeTypedObject(mSubImageAction, flags);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SubImageTemplateData)) return false;
+ if (!super.equals(o)) return false;
+ SubImageTemplateData that = (SubImageTemplateData) o;
+ return Objects.equals(mSubImageTexts, that.mSubImageTexts)
+ && Objects.equals(mSubImages, that.mSubImages) && Objects.equals(
+ mSubImageAction, that.mSubImageAction);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mSubImageTexts, mSubImages, mSubImageAction);
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + " + SmartspaceSubImageUiTemplateData{"
+ + "mSubImageTexts=" + mSubImageTexts
+ + ", mSubImages=" + mSubImages
+ + ", mSubImageAction=" + mSubImageAction
+ + '}';
+ }
+
+ /**
+ * A builder for {@link SubImageTemplateData} object.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder extends BaseTemplateData.Builder {
+
+ private final List<Text> mSubImageTexts;
+ private final List<Icon> mSubImages;
+ private TapAction mSubImageAction;
+
+ /**
+ * A builder for {@link SubImageTemplateData}.
+ */
+ public Builder(@NonNull List<Text> subImageTexts,
+ @NonNull List<Icon> subImages) {
+ super(SmartspaceTarget.UI_TEMPLATE_SUB_IMAGE);
+ mSubImageTexts = Objects.requireNonNull(subImageTexts);
+ mSubImages = Objects.requireNonNull(subImages);
+ }
+
+ /**
+ * Sets the card tap action.
+ */
+ @NonNull
+ public Builder setSubImageAction(@NonNull TapAction subImageAction) {
+ mSubImageAction = subImageAction;
+ return this;
+ }
+
+ /**
+ * Builds a new SmartspaceSubImageUiTemplateData instance.
+ */
+ @NonNull
+ public SubImageTemplateData build() {
+ return new SubImageTemplateData(getTemplateType(), getTitleText(),
+ getTitleIcon(), getSubtitleText(), getSubtitleIcon(),
+ getPrimaryTapAction(), getPrimaryLoggingInfo(),
+ getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
+ getSupplementalSubtitleTapAction(), getSupplementalSubtitleLoggingInfo(),
+ getSupplementalText(), getSupplementalIcon(),
+ getSupplementalTapAction(), getSupplementalLoggingInfo(),
+ getSupplementalAlarmText(), getLayoutWeight(),
+ mSubImageTexts,
+ mSubImages,
+ mSubImageAction);
+ }
+ }
+}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SubListTemplateData.java b/core/java/android/app/smartspace/uitemplatedata/SubListTemplateData.java
new file mode 100644
index 0000000..b1535f1
--- /dev/null
+++ b/core/java/android/app/smartspace/uitemplatedata/SubListTemplateData.java
@@ -0,0 +1,223 @@
+/*
+ * 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 android.app.smartspace.uitemplatedata;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.smartspace.SmartspaceTarget;
+import android.os.Parcel;
+
+import java.util.List;
+import java.util.Objects;
+
+
+/**
+ * Holds all the relevant data needed to render a Smartspace card with the sub-list Ui Template.
+ *
+ * This template will add a sub-list card within the default-template card:
+ * <ul>
+ * <li> sub-list text1 sub-list icon </li>
+ * <li> sub-list text2 </li>
+ * <li> sub-list text3 </li>
+ * ...
+ * </ul>
+ *
+ * @hide
+ */
+@SystemApi
+public final class SubListTemplateData extends BaseTemplateData {
+
+ @Nullable
+ private final Icon mSubListIcon;
+ @NonNull
+ private final List<Text> mSubListTexts;
+
+ /** Tap action for the sub-list secondary card. */
+ @Nullable
+ private final TapAction mSubListAction;
+
+ SubListTemplateData(@NonNull Parcel in) {
+ super(in);
+ mSubListIcon = in.readTypedObject(Icon.CREATOR);
+ mSubListTexts = in.createTypedArrayList(Text.CREATOR);
+ mSubListAction = in.readTypedObject(TapAction.CREATOR);
+ }
+
+ private SubListTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
+ @Nullable Text titleText,
+ @Nullable Icon titleIcon,
+ @Nullable Text subtitleText,
+ @Nullable Icon subtitleIcon,
+ @Nullable TapAction primaryTapAction,
+ @Nullable SubItemLoggingInfo primaryLoggingInfo,
+ @Nullable Text supplementalSubtitleText,
+ @Nullable Icon supplementalSubtitleIcon,
+ @Nullable TapAction supplementalSubtitleTapAction,
+ @Nullable SubItemLoggingInfo supplementalSubtitleLoggingInfo,
+ @Nullable Text supplementalText,
+ @Nullable Icon supplementalIcon,
+ @Nullable TapAction supplementalTapAction,
+ @Nullable SubItemLoggingInfo supplementalLoggingInfo,
+ @Nullable Text supplementalAlarmText,
+ int layoutWeight,
+ @Nullable Icon subListIcon,
+ @NonNull List<Text> subListTexts,
+ @Nullable TapAction subListAction) {
+ super(templateType, titleText, titleIcon, subtitleText, subtitleIcon,
+ primaryTapAction, primaryLoggingInfo,
+ supplementalSubtitleText, supplementalSubtitleIcon,
+ supplementalSubtitleTapAction, supplementalSubtitleLoggingInfo,
+ supplementalText, supplementalIcon,
+ supplementalTapAction, supplementalLoggingInfo,
+ supplementalAlarmText, layoutWeight);
+
+ mSubListIcon = subListIcon;
+ mSubListTexts = subListTexts;
+ mSubListAction = subListAction;
+ }
+
+ /** Returns the sub-list card's icon. */
+ @Nullable
+ public Icon getSubListIcon() {
+ return mSubListIcon;
+ }
+
+ /** Returns the sub-list card's texts list. */
+ @NonNull
+ public List<Text> getSubListTexts() {
+ return mSubListTexts;
+ }
+
+ /** Returns the sub-list card's tap action. */
+ @Nullable
+ public TapAction getSubListAction() {
+ return mSubListAction;
+ }
+
+ /**
+ * @see Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<SubListTemplateData> CREATOR =
+ new Creator<SubListTemplateData>() {
+ @Override
+ public SubListTemplateData createFromParcel(Parcel in) {
+ return new SubListTemplateData(in);
+ }
+
+ @Override
+ public SubListTemplateData[] newArray(int size) {
+ return new SubListTemplateData[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeTypedObject(mSubListIcon, flags);
+ out.writeTypedList(mSubListTexts);
+ out.writeTypedObject(mSubListAction, flags);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SubListTemplateData)) return false;
+ if (!super.equals(o)) return false;
+ SubListTemplateData that = (SubListTemplateData) o;
+ return Objects.equals(mSubListIcon, that.mSubListIcon) && Objects.equals(
+ mSubListTexts, that.mSubListTexts) && Objects.equals(mSubListAction,
+ that.mSubListAction);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mSubListIcon, mSubListTexts, mSubListAction);
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + " + SmartspaceSubListUiTemplateData{"
+ + "mSubListIcon=" + mSubListIcon
+ + ", mSubListTexts=" + mSubListTexts
+ + ", mSubListAction=" + mSubListAction
+ + '}';
+ }
+
+ /**
+ * A builder for {@link SubListTemplateData} object.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder extends BaseTemplateData.Builder {
+
+ private Icon mSubListIcon;
+ private final List<Text> mSubListTexts;
+ private TapAction mSubListAction;
+
+ /**
+ * A builder for {@link SubListTemplateData}.
+ */
+ public Builder(@NonNull List<Text> subListTexts) {
+ super(SmartspaceTarget.UI_TEMPLATE_SUB_LIST);
+ mSubListTexts = Objects.requireNonNull(subListTexts);
+ }
+
+ /**
+ * Sets the sub-list card icon.
+ */
+ @NonNull
+ public Builder setSubListIcon(@NonNull Icon subListIcon) {
+ mSubListIcon = subListIcon;
+ return this;
+ }
+
+ /**
+ * Sets the card tap action.
+ */
+ @NonNull
+ public Builder setSubListAction(@NonNull TapAction subListAction) {
+ mSubListAction = subListAction;
+ return this;
+ }
+
+ /**
+ * Builds a new SmartspaceSubListUiTemplateData instance.
+ */
+ @NonNull
+ public SubListTemplateData build() {
+ return new SubListTemplateData(getTemplateType(), getTitleText(),
+ getTitleIcon(), getSubtitleText(), getSubtitleIcon(),
+ getPrimaryTapAction(), getPrimaryLoggingInfo(),
+ getSupplementalSubtitleText(), getSupplementalSubtitleIcon(),
+ getSupplementalSubtitleTapAction(), getSupplementalSubtitleLoggingInfo(),
+ getSupplementalText(), getSupplementalIcon(),
+ getSupplementalTapAction(), getSupplementalLoggingInfo(),
+ getSupplementalAlarmText(), getLayoutWeight(),
+ mSubListIcon,
+ mSubListTexts,
+ mSubListAction);
+ }
+ }
+}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceTapAction.java b/core/java/android/app/smartspace/uitemplatedata/TapAction.java
similarity index 67%
rename from core/java/android/app/smartspace/uitemplatedata/SmartspaceTapAction.java
rename to core/java/android/app/smartspace/uitemplatedata/TapAction.java
index 27d8e5f..b8e1afb 100644
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceTapAction.java
+++ b/core/java/android/app/smartspace/uitemplatedata/TapAction.java
@@ -33,7 +33,7 @@
import java.util.Objects;
/**
- * A {@link SmartspaceTapAction} represents an action which can be taken by a user by tapping on
+ * A {@link TapAction} represents an action which can be taken by a user by tapping on
* either the title, the subtitle or on the icon. Supported instances are Intents and
* PendingIntents. These actions can be called from another process or within the client process.
*
@@ -42,9 +42,9 @@
* @hide
*/
@SystemApi
-public final class SmartspaceTapAction implements Parcelable {
+public final class TapAction implements Parcelable {
- /** A unique Id of this {@link SmartspaceTapAction}. */
+ /** A unique Id of this {@link TapAction}. */
@Nullable
private final CharSequence mId;
@@ -58,53 +58,74 @@
private final UserHandle mUserHandle;
@Nullable
- private Bundle mExtras;
+ private final Bundle mExtras;
- SmartspaceTapAction(@NonNull Parcel in) {
+ /**
+ * Whether the tap action's result should be shown on the lockscreen (e.g. turn off the
+ * flashlight can be done on LS bypassing the keyguard). Default value is false.
+ */
+ private final boolean mShouldShowOnLockscreen;
+
+ TapAction(@NonNull Parcel in) {
mId = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mIntent = in.readTypedObject(Intent.CREATOR);
mPendingIntent = in.readTypedObject(PendingIntent.CREATOR);
mUserHandle = in.readTypedObject(UserHandle.CREATOR);
mExtras = in.readBundle();
+ mShouldShowOnLockscreen = in.readBoolean();
}
- private SmartspaceTapAction(@Nullable CharSequence id, @Nullable Intent intent,
+ private TapAction(@Nullable CharSequence id, @Nullable Intent intent,
@Nullable PendingIntent pendingIntent, @Nullable UserHandle userHandle,
- @Nullable Bundle extras) {
+ @Nullable Bundle extras, boolean shouldShowOnLockscreen) {
mId = id;
mIntent = intent;
mPendingIntent = pendingIntent;
mUserHandle = userHandle;
mExtras = extras;
+ mShouldShowOnLockscreen = shouldShowOnLockscreen;
}
+ /** Returns the unique id of the tap action. */
@Nullable
public CharSequence getId() {
return mId;
}
+ /** Returns the intent of the tap action. */
@SuppressLint("IntentBuilderName")
@Nullable
public Intent getIntent() {
return mIntent;
}
+ /** Returns the pending intent of the tap action. */
@Nullable
public PendingIntent getPendingIntent() {
return mPendingIntent;
}
+ /** Returns the user handle of the tap action. */
@Nullable
public UserHandle getUserHandle() {
return mUserHandle;
}
+ /** Returns the extras bundle of the tap action. */
@Nullable
@SuppressLint("NullableCollection")
public Bundle getExtras() {
return mExtras;
}
+ /**
+ * Whether the tap action's result should be shown on the lockscreen. If true, the tap action's
+ * handling should bypass the keyguard. Default value is false.
+ */
+ public boolean shouldShowOnLockscreen() {
+ return mShouldShowOnLockscreen;
+ }
+
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
TextUtils.writeToParcel(mId, out, flags);
@@ -112,6 +133,7 @@
out.writeTypedObject(mPendingIntent, flags);
out.writeTypedObject(mUserHandle, flags);
out.writeBundle(mExtras);
+ out.writeBoolean(mShouldShowOnLockscreen);
}
@Override
@@ -120,23 +142,23 @@
}
@NonNull
- public static final Creator<SmartspaceTapAction> CREATOR = new Creator<SmartspaceTapAction>() {
+ public static final Creator<TapAction> CREATOR = new Creator<TapAction>() {
@Override
- public SmartspaceTapAction createFromParcel(Parcel in) {
- return new SmartspaceTapAction(in);
+ public TapAction createFromParcel(Parcel in) {
+ return new TapAction(in);
}
@Override
- public SmartspaceTapAction[] newArray(int size) {
- return new SmartspaceTapAction[size];
+ public TapAction[] newArray(int size) {
+ return new TapAction[size];
}
};
@Override
public boolean equals(Object o) {
if (this == o) return true;
- if (!(o instanceof SmartspaceTapAction)) return false;
- SmartspaceTapAction that = (SmartspaceTapAction) o;
+ if (!(o instanceof TapAction)) return false;
+ TapAction that = (TapAction) o;
return SmartspaceUtils.isEqual(mId, that.mId);
}
@@ -153,11 +175,12 @@
+ ", mPendingIntent=" + mPendingIntent
+ ", mUserHandle=" + mUserHandle
+ ", mExtras=" + mExtras
+ + ", mShouldShowOnLockscreen=" + mShouldShowOnLockscreen
+ '}';
}
/**
- * A builder for {@link SmartspaceTapAction} object.
+ * A builder for {@link TapAction} object.
*
* @hide
*/
@@ -169,14 +192,16 @@
private PendingIntent mPendingIntent;
private UserHandle mUserHandle;
private Bundle mExtras;
+ private boolean mShouldShowOnLockScreen;
/**
- * A builder for {@link SmartspaceTapAction}.
+ * A builder for {@link TapAction}. By default sets should_show_on_lockscreen to false.
*
- * @param id A unique Id of this {@link SmartspaceTapAction}.
+ * @param id A unique Id of this {@link TapAction}.
*/
public Builder(@NonNull CharSequence id) {
mId = Objects.requireNonNull(id);
+ mShouldShowOnLockScreen = false;
}
/**
@@ -217,16 +242,27 @@
}
/**
+ * Sets whether the tap action's result should be shown on the lockscreen, to bypass the
+ * keyguard when the tap action is triggered.
+ */
+ @NonNull
+ public Builder setShouldShowOnLockscreen(@NonNull boolean shouldShowOnLockScreen) {
+ mShouldShowOnLockScreen = shouldShowOnLockScreen;
+ return this;
+ }
+
+ /**
* Builds a new SmartspaceTapAction instance.
*
* @throws IllegalStateException if the tap action is empty.
*/
@NonNull
- public SmartspaceTapAction build() {
+ public TapAction build() {
if (mIntent == null && mPendingIntent == null && mExtras == null) {
throw new IllegalStateException("Please assign at least 1 valid tap field");
}
- return new SmartspaceTapAction(mId, mIntent, mPendingIntent, mUserHandle, mExtras);
+ return new TapAction(mId, mIntent, mPendingIntent, mUserHandle, mExtras,
+ mShouldShowOnLockScreen);
}
}
}
diff --git a/core/java/android/app/smartspace/uitemplatedata/SmartspaceText.java b/core/java/android/app/smartspace/uitemplatedata/Text.java
similarity index 64%
rename from core/java/android/app/smartspace/uitemplatedata/SmartspaceText.java
rename to core/java/android/app/smartspace/uitemplatedata/Text.java
index 25d13e6..e1afce7 100644
--- a/core/java/android/app/smartspace/uitemplatedata/SmartspaceText.java
+++ b/core/java/android/app/smartspace/uitemplatedata/Text.java
@@ -32,43 +32,54 @@
* @hide
*/
@SystemApi
-public final class SmartspaceText implements Parcelable {
+public final class Text implements Parcelable {
@NonNull
private final CharSequence mText;
private final TextUtils.TruncateAt mTruncateAtType;
- SmartspaceText(Parcel in) {
+ private final int mMaxLines;
+
+ Text(Parcel in) {
mText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mTruncateAtType = TextUtils.TruncateAt.valueOf(in.readString());
+ mMaxLines = in.readInt();
}
- private SmartspaceText(@NonNull CharSequence text, TextUtils.TruncateAt truncateAtType) {
+ private Text(@NonNull CharSequence text, TextUtils.TruncateAt truncateAtType, int maxLines) {
mText = text;
mTruncateAtType = truncateAtType;
+ mMaxLines = maxLines;
}
+ /** Returns the text content. */
@NonNull
public CharSequence getText() {
return mText;
}
+ /** Returns the {@link TextUtils.TruncateAt} type of the text content. */
@NonNull
public TextUtils.TruncateAt getTruncateAtType() {
return mTruncateAtType;
}
+ /** Returns the allowed max lines for presenting the text content. */
+ public int getMaxLines() {
+ return mMaxLines;
+ }
+
@NonNull
- public static final Creator<SmartspaceText> CREATOR = new Creator<SmartspaceText>() {
+ public static final Creator<Text> CREATOR = new Creator<Text>() {
@Override
- public SmartspaceText createFromParcel(Parcel in) {
- return new SmartspaceText(in);
+ public Text createFromParcel(Parcel in) {
+ return new Text(in);
}
@Override
- public SmartspaceText[] newArray(int size) {
- return new SmartspaceText[size];
+ public Text[] newArray(int size) {
+ return new Text[size];
}
};
@@ -80,25 +91,26 @@
@Override
public boolean equals(Object o) {
if (this == o) return true;
- if (!(o instanceof SmartspaceText)) return false;
- SmartspaceText that = (SmartspaceText) o;
+ if (!(o instanceof Text)) return false;
+ Text that = (Text) o;
return mTruncateAtType == that.mTruncateAtType && SmartspaceUtils.isEqual(mText,
- that.mText);
+ that.mText) && mMaxLines == that.mMaxLines;
}
@Override
public int hashCode() {
- return Objects.hash(mText, mTruncateAtType);
+ return Objects.hash(mText, mTruncateAtType, mMaxLines);
}
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
TextUtils.writeToParcel(mText, out, flags);
out.writeString(mTruncateAtType.name());
+ out.writeInt(mMaxLines);
}
/**
- * A builder for {@link SmartspaceText} object.
+ * A builder for {@link Text} object.
*
* @hide
*/
@@ -106,25 +118,21 @@
public static final class Builder {
private final CharSequence mText;
private TextUtils.TruncateAt mTruncateAtType;
+ private int mMaxLines;
/**
- * A builder for {@link SmartspaceText}, which sets TruncateAtType to AT_END by default.
+ * A builder for {@link Text}, which by default sets TruncateAtType to AT_END, and the max
+ * lines to 1.
*/
public Builder(@NonNull CharSequence text) {
mText = Objects.requireNonNull(text);
mTruncateAtType = TextUtils.TruncateAt.END;
+ mMaxLines = 1;
}
/**
- * A builder for {@link SmartspaceText}.
- */
- public Builder(@NonNull CharSequence text, @NonNull TextUtils.TruncateAt truncateAtType) {
- mText = Objects.requireNonNull(text);
- mTruncateAtType = Objects.requireNonNull(truncateAtType);
- }
-
- /**
- * Sets truncateAtType.
+ * Sets truncateAtType, where the text content should be truncated if not all the content
+ * can be presented.
*/
@NonNull
public Builder setTruncateAtType(@NonNull TextUtils.TruncateAt truncateAtType) {
@@ -133,11 +141,20 @@
}
/**
+ * Sets the allowed max lines for the text content.
+ */
+ @NonNull
+ public Builder setMaxLines(int maxLines) {
+ mMaxLines = maxLines;
+ return this;
+ }
+
+ /**
* Builds a new SmartspaceText instance.
*/
@NonNull
- public SmartspaceText build() {
- return new SmartspaceText(mText, mTruncateAtType);
+ public Text build() {
+ return new Text(mText, mTruncateAtType, mMaxLines);
}
}
}
diff --git a/core/java/android/app/time/ExternalTimeSuggestion.java b/core/java/android/app/time/ExternalTimeSuggestion.java
index 0f98b44..c118558 100644
--- a/core/java/android/app/time/ExternalTimeSuggestion.java
+++ b/core/java/android/app/time/ExternalTimeSuggestion.java
@@ -50,16 +50,17 @@
* <p>The creator of an external suggestion is expected to be separate Android process, e.g. a
* process integrating with the external time source via a HAL or local network. The creator must
* capture the elapsed realtime reference clock, e.g. via {@link SystemClock#elapsedRealtime()},
- * when the UTC time is first obtained (usually under a wakelock). This enables Android to adjust
- * for latency introduced between suggestion creation and eventual use. Adjustments for other
+ * when the Unix epoch time is first obtained (usually under a wakelock). This enables Android to
+ * adjust for latency introduced between suggestion creation and eventual use. Adjustments for other
* sources of latency, i.e. those before the external time suggestion is created, must be handled by
* the creator.
*
* <p>{@code elapsedRealtimeMillis} and {@code suggestionMillis} represent the suggested time.
- * {@code suggestionMillis} is the number of milliseconds elapsed since 1/1/1970 00:00:00 UTC.
- * {@code elapsedRealtimeMillis} is the value of the elapsed realtime clock when {@code
- * suggestionMillis} was established. Note that the elapsed realtime clock is considered accurate
- * but it is volatile, so time suggestions cannot be persisted across device resets.
+ * {@code suggestionMillis} is the number of milliseconds elapsed since 1/1/1970 00:00:00 UTC
+ * according to the Unix time scale. {@code elapsedRealtimeMillis} is the value of the elapsed
+ * realtime clock when {@code suggestionMillis} was established. Note that the elapsed realtime
+ * clock is considered accurate but it is volatile, so time suggestions cannot be persisted across
+ * device resets.
*
* <p>{@code debugInfo} contains debugging metadata associated with the suggestion. This is used to
* record why the suggestion exists and how it was entered. This information exists only to aid in
@@ -83,7 +84,7 @@
};
@NonNull
- private final TimestampedValue<Long> mUtcTime;
+ private final TimestampedValue<Long> mUnixEpochTime;
@Nullable
private ArrayList<String> mDebugInfo;
@@ -92,12 +93,12 @@
* ExternalTimeSuggestion} for more details.
*
* @param elapsedRealtimeMillis the elapsed realtime clock reference for the suggestion
- * @param suggestionMillis the suggested UTC time in milliseconds since the start of the
+ * @param suggestionMillis the suggested time in milliseconds since the start of the
* Unix epoch
*/
public ExternalTimeSuggestion(@ElapsedRealtimeLong long elapsedRealtimeMillis,
@CurrentTimeMillisLong long suggestionMillis) {
- mUtcTime = new TimestampedValue(elapsedRealtimeMillis, suggestionMillis);
+ mUnixEpochTime = new TimestampedValue(elapsedRealtimeMillis, suggestionMillis);
}
private static ExternalTimeSuggestion createFromParcel(Parcel in) {
@@ -117,7 +118,7 @@
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeParcelable(mUtcTime, 0);
+ dest.writeParcelable(mUnixEpochTime, 0);
dest.writeList(mDebugInfo);
}
@@ -125,8 +126,8 @@
* {@hide}
*/
@NonNull
- public TimestampedValue<Long> getUtcTime() {
- return mUtcTime;
+ public TimestampedValue<Long> getUnixEpochTime() {
+ return mUnixEpochTime;
}
/**
@@ -160,17 +161,18 @@
return false;
}
ExternalTimeSuggestion that = (ExternalTimeSuggestion) o;
- return Objects.equals(mUtcTime, that.mUtcTime);
+ return Objects.equals(mUnixEpochTime, that.mUnixEpochTime);
}
@Override
public int hashCode() {
- return Objects.hash(mUtcTime);
+ return Objects.hash(mUnixEpochTime);
}
@Override
public String toString() {
- return "ExternalTimeSuggestion{" + "mUtcTime=" + mUtcTime + ", mDebugInfo=" + mDebugInfo
+ return "ExternalTimeSuggestion{" + "mUnixEpochTime=" + mUnixEpochTime
+ + ", mDebugInfo=" + mDebugInfo
+ '}';
}
}
diff --git a/core/java/android/app/timedetector/GnssTimeSuggestion.java b/core/java/android/app/timedetector/GnssTimeSuggestion.java
index 8ccff62..463e5f0 100644
--- a/core/java/android/app/timedetector/GnssTimeSuggestion.java
+++ b/core/java/android/app/timedetector/GnssTimeSuggestion.java
@@ -31,11 +31,11 @@
/**
* A time signal from a GNSS source.
*
- * <p>{@code utcTime} is the suggested time. The {@code utcTime.value} is the number of milliseconds
- * elapsed since 1/1/1970 00:00:00 UTC. The {@code utcTime.referenceTimeMillis} is the value of the
- * elapsed realtime clock when the {@code utcTime.value} was established.
- * Note that the elapsed realtime clock is considered accurate but it is volatile, so time
- * suggestions cannot be persisted across device resets.
+ * <p>{@code unixEpochTime} is the suggested time. The {@code unixEpochTime.value} is the number of
+ * milliseconds elapsed since 1/1/1970 00:00:00 UTC according to the Unix time system. The {@code
+ * unixEpochTime.referenceTimeMillis} is the value of the elapsed realtime clock when the {@code
+ * unixEpochTime.value} was established. Note that the elapsed realtime clock is considered accurate
+ * but it is volatile, so time suggestions cannot be persisted across device resets.
*
* <p>{@code debugInfo} contains debugging metadata associated with the suggestion. This is used to
* record why the suggestion exists and how it was entered. This information exists only to aid in
@@ -57,19 +57,21 @@
}
};
- @NonNull private final TimestampedValue<Long> mUtcTime;
+ @NonNull private final TimestampedValue<Long> mUnixEpochTime;
@Nullable private ArrayList<String> mDebugInfo;
- public GnssTimeSuggestion(@NonNull TimestampedValue<Long> utcTime) {
- mUtcTime = Objects.requireNonNull(utcTime);
- Objects.requireNonNull(utcTime.getValue());
+ public GnssTimeSuggestion(@NonNull TimestampedValue<Long> unixEpochTime) {
+ mUnixEpochTime = Objects.requireNonNull(unixEpochTime);
+ Objects.requireNonNull(unixEpochTime.getValue());
}
private static GnssTimeSuggestion createFromParcel(Parcel in) {
- TimestampedValue<Long> utcTime = in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
- GnssTimeSuggestion suggestion = new GnssTimeSuggestion(utcTime);
+ TimestampedValue<Long> unixEpochTime =
+ in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
+ GnssTimeSuggestion suggestion = new GnssTimeSuggestion(unixEpochTime);
@SuppressWarnings("unchecked")
- ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(null /* classLoader */, java.lang.String.class);
+ ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(
+ null /* classLoader */, java.lang.String.class);
suggestion.mDebugInfo = debugInfo;
return suggestion;
}
@@ -81,13 +83,13 @@
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeParcelable(mUtcTime, 0);
+ dest.writeParcelable(mUnixEpochTime, 0);
dest.writeList(mDebugInfo);
}
@NonNull
- public TimestampedValue<Long> getUtcTime() {
- return mUtcTime;
+ public TimestampedValue<Long> getUnixEpochTime() {
+ return mUnixEpochTime;
}
@NonNull
@@ -117,18 +119,18 @@
return false;
}
GnssTimeSuggestion that = (GnssTimeSuggestion) o;
- return Objects.equals(mUtcTime, that.mUtcTime);
+ return Objects.equals(mUnixEpochTime, that.mUnixEpochTime);
}
@Override
public int hashCode() {
- return Objects.hash(mUtcTime);
+ return Objects.hash(mUnixEpochTime);
}
@Override
public String toString() {
return "GnssTimeSuggestion{"
- + "mUtcTime=" + mUtcTime
+ + "mUnixEpochTime=" + mUnixEpochTime
+ ", mDebugInfo=" + mDebugInfo
+ '}';
}
diff --git a/core/java/android/app/timedetector/ManualTimeSuggestion.java b/core/java/android/app/timedetector/ManualTimeSuggestion.java
index 1699a5f..247d971 100644
--- a/core/java/android/app/timedetector/ManualTimeSuggestion.java
+++ b/core/java/android/app/timedetector/ManualTimeSuggestion.java
@@ -31,9 +31,9 @@
/**
* A time signal from a manual (user provided) source.
*
- * <p>{@code utcTime} is the suggested time. The {@code utcTime.value} is the number of milliseconds
- * elapsed since 1/1/1970 00:00:00 UTC. The {@code utcTime.referenceTimeMillis} is the value of the
- * elapsed realtime clock when the {@code utcTime.value} was established.
+ * <p>{@code unixEpochTime} is the suggested time. The {@code unixEpochTime.value} is the number of
+ * milliseconds elapsed since 1/1/1970 00:00:00 UTC. The {@code unixEpochTime.referenceTimeMillis}
+ * is the value of the elapsed realtime clock when the {@code unixEpochTime.value} was established.
* Note that the elapsed realtime clock is considered accurate but it is volatile, so time
* suggestions cannot be persisted across device resets.
*
@@ -57,19 +57,21 @@
}
};
- @NonNull private final TimestampedValue<Long> mUtcTime;
+ @NonNull private final TimestampedValue<Long> mUnixEpochTime;
@Nullable private ArrayList<String> mDebugInfo;
- public ManualTimeSuggestion(@NonNull TimestampedValue<Long> utcTime) {
- mUtcTime = Objects.requireNonNull(utcTime);
- Objects.requireNonNull(utcTime.getValue());
+ public ManualTimeSuggestion(@NonNull TimestampedValue<Long> unixEpochTime) {
+ mUnixEpochTime = Objects.requireNonNull(unixEpochTime);
+ Objects.requireNonNull(unixEpochTime.getValue());
}
private static ManualTimeSuggestion createFromParcel(Parcel in) {
- TimestampedValue<Long> utcTime = in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
- ManualTimeSuggestion suggestion = new ManualTimeSuggestion(utcTime);
+ TimestampedValue<Long> unixEpochTime =
+ in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
+ ManualTimeSuggestion suggestion = new ManualTimeSuggestion(unixEpochTime);
@SuppressWarnings("unchecked")
- ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(null /* classLoader */, java.lang.String.class);
+ ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(
+ null /* classLoader */, java.lang.String.class);
suggestion.mDebugInfo = debugInfo;
return suggestion;
}
@@ -81,13 +83,13 @@
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeParcelable(mUtcTime, 0);
+ dest.writeParcelable(mUnixEpochTime, 0);
dest.writeList(mDebugInfo);
}
@NonNull
- public TimestampedValue<Long> getUtcTime() {
- return mUtcTime;
+ public TimestampedValue<Long> getUnixEpochTime() {
+ return mUnixEpochTime;
}
@NonNull
@@ -117,18 +119,18 @@
return false;
}
ManualTimeSuggestion that = (ManualTimeSuggestion) o;
- return Objects.equals(mUtcTime, that.mUtcTime);
+ return Objects.equals(mUnixEpochTime, that.mUnixEpochTime);
}
@Override
public int hashCode() {
- return Objects.hash(mUtcTime);
+ return Objects.hash(mUnixEpochTime);
}
@Override
public String toString() {
return "ManualTimeSuggestion{"
- + "mUtcTime=" + mUtcTime
+ + "mUnixEpochTime=" + mUnixEpochTime
+ ", mDebugInfo=" + mDebugInfo
+ '}';
}
diff --git a/core/java/android/app/timedetector/NetworkTimeSuggestion.java b/core/java/android/app/timedetector/NetworkTimeSuggestion.java
index 2030083..f620bc9 100644
--- a/core/java/android/app/timedetector/NetworkTimeSuggestion.java
+++ b/core/java/android/app/timedetector/NetworkTimeSuggestion.java
@@ -31,11 +31,12 @@
/**
* A time signal from a network time source like NTP.
*
- * <p>{@code utcTime} contains the suggested time. The {@code utcTime.value} is the number of
- * milliseconds elapsed since 1/1/1970 00:00:00 UTC. The {@code utcTime.referenceTimeMillis} is the
- * value of the elapsed realtime clock when the {@code utcTime.value} was established.
- * Note that the elapsed realtime clock is considered accurate but it is volatile, so time
- * suggestions cannot be persisted across device resets.
+ * <p>{@code unixEpochTime} contains the suggested time. The {@code unixEpochTime.value} is the
+ * number of milliseconds elapsed since 1/1/1970 00:00:00 UTC according to the Unix time system.
+ * The {@code unixEpochTime.referenceTimeMillis} is the value of the elapsed realtime clock when
+ * the {@code unixEpochTime.value} was established. Note that the elapsed realtime clock is
+ * considered accurate but it is volatile, so time suggestions cannot be persisted across device
+ * resets.
*
* <p>{@code debugInfo} contains debugging metadata associated with the suggestion. This is used to
* record why the suggestion exists and how it was determined. This information exists only to aid
@@ -57,19 +58,21 @@
}
};
- @NonNull private final TimestampedValue<Long> mUtcTime;
+ @NonNull private final TimestampedValue<Long> mUnixEpochTime;
@Nullable private ArrayList<String> mDebugInfo;
- public NetworkTimeSuggestion(@NonNull TimestampedValue<Long> utcTime) {
- mUtcTime = Objects.requireNonNull(utcTime);
- Objects.requireNonNull(utcTime.getValue());
+ public NetworkTimeSuggestion(@NonNull TimestampedValue<Long> unixEpochTime) {
+ mUnixEpochTime = Objects.requireNonNull(unixEpochTime);
+ Objects.requireNonNull(unixEpochTime.getValue());
}
private static NetworkTimeSuggestion createFromParcel(Parcel in) {
- TimestampedValue<Long> utcTime = in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
- NetworkTimeSuggestion suggestion = new NetworkTimeSuggestion(utcTime);
+ TimestampedValue<Long> unixEpochTime =
+ in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
+ NetworkTimeSuggestion suggestion = new NetworkTimeSuggestion(unixEpochTime);
@SuppressWarnings("unchecked")
- ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(null /* classLoader */, java.lang.String.class);
+ ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(
+ null /* classLoader */, java.lang.String.class);
suggestion.mDebugInfo = debugInfo;
return suggestion;
}
@@ -81,13 +84,13 @@
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeParcelable(mUtcTime, 0);
+ dest.writeParcelable(mUnixEpochTime, 0);
dest.writeList(mDebugInfo);
}
@NonNull
- public TimestampedValue<Long> getUtcTime() {
- return mUtcTime;
+ public TimestampedValue<Long> getUnixEpochTime() {
+ return mUnixEpochTime;
}
@NonNull
@@ -117,18 +120,18 @@
return false;
}
NetworkTimeSuggestion that = (NetworkTimeSuggestion) o;
- return Objects.equals(mUtcTime, that.mUtcTime);
+ return Objects.equals(mUnixEpochTime, that.mUnixEpochTime);
}
@Override
public int hashCode() {
- return Objects.hash(mUtcTime);
+ return Objects.hash(mUnixEpochTime);
}
@Override
public String toString() {
return "NetworkTimeSuggestion{"
- + "mUtcTime=" + mUtcTime
+ + "mUnixEpochTime=" + mUnixEpochTime
+ ", mDebugInfo=" + mDebugInfo
+ '}';
}
diff --git a/core/java/android/app/timedetector/TelephonyTimeSuggestion.java b/core/java/android/app/timedetector/TelephonyTimeSuggestion.java
index 52d0bbe..1fa392a 100644
--- a/core/java/android/app/timedetector/TelephonyTimeSuggestion.java
+++ b/core/java/android/app/timedetector/TelephonyTimeSuggestion.java
@@ -34,12 +34,12 @@
* <p>{@code slotIndex} identifies the suggestion source. This enables detection logic to identify
* suggestions from the same source when there are several in use.
*
- * <p>{@code utcTime}. When not {@code null}, the {@code utcTime.value} is the number of
- * milliseconds elapsed since 1/1/1970 00:00:00 UTC. The {@code utcTime.referenceTimeMillis} is the
- * value of the elapsed realtime clock when the {@code utcTime.value} was established.
+ * <p>{@code unixEpochTime}. When not {@code null}, the {@code unixEpochTime.value} is the number of
+ * milliseconds elapsed since 1/1/1970 00:00:00 UTC. The {@code unixEpochTime.referenceTimeMillis}
+ * is the value of the elapsed realtime clock when the {@code unixEpochTime.value} was established.
* Note that the elapsed realtime clock is considered accurate but it is volatile, so time
- * suggestions cannot be persisted across device resets. {@code utcTime} can be {@code null} to
- * indicate that the telephony source has entered an "un-opinionated" state and any previous
+ * suggestions cannot be persisted across device resets. {@code unixEpochTime} can be {@code null}
+ * to indicate that the telephony source has entered an "un-opinionated" state and any previous
* suggestion from the source is being withdrawn.
*
* <p>{@code debugInfo} contains debugging metadata associated with the suggestion. This is used to
@@ -65,22 +65,25 @@
};
private final int mSlotIndex;
- @Nullable private final TimestampedValue<Long> mUtcTime;
+ @Nullable private final TimestampedValue<Long> mUnixEpochTime;
@Nullable private ArrayList<String> mDebugInfo;
private TelephonyTimeSuggestion(Builder builder) {
mSlotIndex = builder.mSlotIndex;
- mUtcTime = builder.mUtcTime;
+ mUnixEpochTime = builder.mUnixEpochTime;
mDebugInfo = builder.mDebugInfo != null ? new ArrayList<>(builder.mDebugInfo) : null;
}
private static TelephonyTimeSuggestion createFromParcel(Parcel in) {
int slotIndex = in.readInt();
+ TimestampedValue<Long> unixEpochTime =
+ in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
TelephonyTimeSuggestion suggestion = new TelephonyTimeSuggestion.Builder(slotIndex)
- .setUtcTime(in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class))
+ .setUnixEpochTime(unixEpochTime)
.build();
@SuppressWarnings("unchecked")
- ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(null /* classLoader */, java.lang.String.class);
+ ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(
+ null /* classLoader */, java.lang.String.class);
if (debugInfo != null) {
suggestion.addDebugInfo(debugInfo);
}
@@ -95,7 +98,7 @@
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mSlotIndex);
- dest.writeParcelable(mUtcTime, 0);
+ dest.writeParcelable(mUnixEpochTime, 0);
dest.writeList(mDebugInfo);
}
@@ -111,11 +114,11 @@
/**
* Returns the suggested time or {@code null} if there isn't one.
*
- * <p>See {@link TelephonyTimeSuggestion} for more information about {@code utcTime}.
+ * <p>See {@link TelephonyTimeSuggestion} for more information about {@code unixEpochTime}.
*/
@Nullable
- public TimestampedValue<Long> getUtcTime() {
- return mUtcTime;
+ public TimestampedValue<Long> getUnixEpochTime() {
+ return mUnixEpochTime;
}
/**
@@ -163,19 +166,19 @@
}
TelephonyTimeSuggestion that = (TelephonyTimeSuggestion) o;
return mSlotIndex == that.mSlotIndex
- && Objects.equals(mUtcTime, that.mUtcTime);
+ && Objects.equals(mUnixEpochTime, that.mUnixEpochTime);
}
@Override
public int hashCode() {
- return Objects.hash(mSlotIndex, mUtcTime);
+ return Objects.hash(mSlotIndex, mUnixEpochTime);
}
@Override
public String toString() {
return "TelephonyTimeSuggestion{"
+ "mSlotIndex='" + mSlotIndex + '\''
- + ", mUtcTime=" + mUtcTime
+ + ", mUnixEpochTime=" + mUnixEpochTime
+ ", mDebugInfo=" + mDebugInfo
+ '}';
}
@@ -187,7 +190,7 @@
*/
public static final class Builder {
private final int mSlotIndex;
- @Nullable private TimestampedValue<Long> mUtcTime;
+ @Nullable private TimestampedValue<Long> mUnixEpochTime;
@Nullable private List<String> mDebugInfo;
/**
@@ -202,16 +205,16 @@
/**
* Returns the builder for call chaining.
*
- * <p>See {@link TelephonyTimeSuggestion} for more information about {@code utcTime}.
+ * <p>See {@link TelephonyTimeSuggestion} for more information about {@code unixEpochTime}.
*/
@NonNull
- public Builder setUtcTime(@Nullable TimestampedValue<Long> utcTime) {
- if (utcTime != null) {
- // utcTime can be null, but the value it holds cannot.
- Objects.requireNonNull(utcTime.getValue());
+ public Builder setUnixEpochTime(@Nullable TimestampedValue<Long> unixEpochTime) {
+ if (unixEpochTime != null) {
+ // unixEpochTime can be null, but the value it holds cannot.
+ Objects.requireNonNull(unixEpochTime.getValue());
}
- mUtcTime = utcTime;
+ mUnixEpochTime = unixEpochTime;
return this;
}
diff --git a/core/java/android/app/usage/BroadcastResponseStats.java b/core/java/android/app/usage/BroadcastResponseStats.java
index 5acc3dda..e1d37e1 100644
--- a/core/java/android/app/usage/BroadcastResponseStats.java
+++ b/core/java/android/app/usage/BroadcastResponseStats.java
@@ -23,6 +23,8 @@
import android.os.Parcel;
import android.os.Parcelable;
+import java.util.Objects;
+
/**
* Class containing a collection of stats related to response events started from an app
* after receiving a broadcast.
@@ -32,17 +34,30 @@
@SystemApi
public final class BroadcastResponseStats implements Parcelable {
private final String mPackageName;
+ private final long mId;
private int mBroadcastsDispatchedCount;
private int mNotificationsPostedCount;
private int mNotificationsUpdatedCount;
private int mNotificationsCancelledCount;
- public BroadcastResponseStats(@NonNull String packageName) {
+ /**
+ * Creates a new {@link BroadcastResponseStats} object that contain the stats for broadcasts
+ * with {@code id} (specified using
+ * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)} by the sender) that
+ * were sent to {@code packageName}.
+ *
+ * @param packageName the name of the package that broadcasts were sent to.
+ * @param id the ID specified by the sender using
+ * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}.
+ */
+ public BroadcastResponseStats(@NonNull String packageName, @IntRange(from = 1) long id) {
mPackageName = packageName;
+ mId = id;
}
private BroadcastResponseStats(@NonNull Parcel in) {
mPackageName = in.readString8();
+ mId = in.readLong();
mBroadcastsDispatchedCount = in.readInt();
mNotificationsPostedCount = in.readInt();
mNotificationsUpdatedCount = in.readInt();
@@ -58,6 +73,14 @@
}
/**
+ * @return the ID of the broadcasts that the stats in this object correspond to.
+ */
+ @IntRange(from = 1)
+ public long getId() {
+ return mId;
+ }
+
+ /**
* Returns the total number of broadcasts that were dispatched to the app by the caller.
*
* <b> Note that the returned count will only include the broadcasts that the caller explicitly
@@ -148,9 +171,35 @@
}
@Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || !(obj instanceof BroadcastResponseStats)) {
+ return false;
+ }
+ final BroadcastResponseStats other = (BroadcastResponseStats) obj;
+ return this.mBroadcastsDispatchedCount == other.mBroadcastsDispatchedCount
+ && this.mNotificationsPostedCount == other.mNotificationsPostedCount
+ && this.mNotificationsUpdatedCount == other.mNotificationsUpdatedCount
+ && this.mNotificationsCancelledCount == other.mNotificationsCancelledCount
+ && this.mId == other.mId
+ && this.mPackageName.equals(other.mPackageName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mPackageName, mId, mBroadcastsDispatchedCount,
+ mNotificationsPostedCount, mNotificationsUpdatedCount,
+ mNotificationsCancelledCount);
+ }
+
+ @Override
public @NonNull String toString() {
return "stats {"
- + "broadcastsSent=" + mBroadcastsDispatchedCount
+ + "package=" + mPackageName
+ + ",id=" + mId
+ + ",broadcastsSent=" + mBroadcastsDispatchedCount
+ ",notificationsPosted=" + mNotificationsPostedCount
+ ",notificationsUpdated=" + mNotificationsUpdatedCount
+ ",notificationsCancelled=" + mNotificationsCancelledCount
@@ -165,6 +214,7 @@
@Override
public void writeToParcel(@NonNull Parcel dest, @WriteFlags int flags) {
dest.writeString8(mPackageName);
+ dest.writeLong(mId);
dest.writeInt(mBroadcastsDispatchedCount);
dest.writeInt(mNotificationsPostedCount);
dest.writeInt(mNotificationsUpdatedCount);
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.aidl b/core/java/android/app/usage/BroadcastResponseStatsList.aidl
similarity index 87%
copy from packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.aidl
copy to core/java/android/app/usage/BroadcastResponseStatsList.aidl
index 62b50ed..7380359 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.aidl
+++ b/core/java/android/app/usage/BroadcastResponseStatsList.aidl
@@ -14,6 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.shared.media;
+package android.app.usage;
-parcelable NearbyDevice;
+/** {@hide} */
+parcelable BroadcastResponseStatsList;
\ No newline at end of file
diff --git a/core/java/android/app/usage/BroadcastResponseStatsList.java b/core/java/android/app/usage/BroadcastResponseStatsList.java
new file mode 100644
index 0000000..4d2ff286
--- /dev/null
+++ b/core/java/android/app/usage/BroadcastResponseStatsList.java
@@ -0,0 +1,83 @@
+/*
+ * 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 android.app.usage;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/** @hide */
+public final class BroadcastResponseStatsList implements Parcelable {
+ private List<BroadcastResponseStats> mBroadcastResponseStats;
+
+ public BroadcastResponseStatsList(
+ @NonNull List<BroadcastResponseStats> broadcastResponseStats) {
+ mBroadcastResponseStats = broadcastResponseStats;
+ }
+
+ private BroadcastResponseStatsList(@NonNull Parcel in) {
+ mBroadcastResponseStats = new ArrayList<>();
+ final byte[] bytes = in.readBlob();
+ final Parcel data = Parcel.obtain();
+ try {
+ data.unmarshall(bytes, 0, bytes.length);
+ data.setDataPosition(0);
+ data.readTypedList(mBroadcastResponseStats, BroadcastResponseStats.CREATOR);
+ } finally {
+ data.recycle();
+ }
+ }
+
+ @NonNull
+ public List<BroadcastResponseStats> getList() {
+ return mBroadcastResponseStats == null ? Collections.emptyList() : mBroadcastResponseStats;
+ }
+
+ @Override
+ public @ContentsFlags int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, @WriteFlags int flags) {
+ final Parcel data = Parcel.obtain();
+ try {
+ data.writeTypedList(mBroadcastResponseStats);
+ dest.writeBlob(data.marshall());
+ } finally {
+ data.recycle();
+ }
+ }
+
+ public static final @NonNull Creator<BroadcastResponseStatsList> CREATOR =
+ new Creator<BroadcastResponseStatsList>() {
+ @Override
+ public @NonNull BroadcastResponseStatsList createFromParcel(
+ @NonNull Parcel source) {
+ return new BroadcastResponseStatsList(source);
+ }
+
+ @Override
+ public @NonNull BroadcastResponseStatsList[] newArray(int size) {
+ return new BroadcastResponseStatsList[size];
+ }
+ };
+}
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index 6f8fea1..a430714 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -18,6 +18,7 @@
import android.app.PendingIntent;
import android.app.usage.BroadcastResponseStats;
+import android.app.usage.BroadcastResponseStatsList;
import android.app.usage.UsageEvents;
import android.content.pm.ParceledListSlice;
@@ -73,9 +74,11 @@
void forceUsageSourceSettingRead();
long getLastTimeAnyComponentUsed(String packageName, String callingPackage);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)")
- BroadcastResponseStats queryBroadcastResponseStats(
+ BroadcastResponseStatsList queryBroadcastResponseStats(
String packageName, long id, String callingPackage, int userId);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)")
void clearBroadcastResponseStats(String packageName, long id, String callingPackage,
int userId);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)")
+ void clearBroadcastEvents(String callingPackage, int userId);
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index b81c62d..d7152b3 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -1397,29 +1397,46 @@
* Returns the broadcast response stats since the last boot corresponding to
* {@code packageName} and {@code id}.
*
- * <p>Broadcast response stats will include the aggregated data of what actions an app took upon
- * receiving a broadcast. This data will consider the broadcasts that the caller sent to
+ * <p> Broadcast response stats will include the aggregated data of what actions an app took
+ * upon receiving a broadcast. This data will consider the broadcasts that the caller sent to
* {@code packageName} and explicitly requested to record the response events using
* {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}.
*
- * @param packageName The name of the package that the caller wants to query for.
- * @param id The ID corresponding to the broadcasts that the caller wants to query for. This is
- * the ID the caller specifies when requesting a broadcast response event to be
- * recorded using {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}.
+ * <p> The returned list could one or more {@link BroadcastResponseStats} objects or be empty
+ * depending on the {@code packageName} and {@code id} and whether there is any data
+ * corresponding to these. If the {@code packageName} is not {@code null} and {@code id} is
+ * {@code > 0}, then the returned list would contain at most one {@link BroadcastResponseStats}
+ * object. Otherwise, the returned list could contain more than one
+ * {@link BroadcastResponseStats} object in no particular order.
*
- * @return the broadcast response stats corresponding to {@code packageName} and {@code id}.
+ * <p> Note: It is possible that same {@code id} was used for broadcasts sent to different
+ * packages. So, callers can query the data corresponding to
+ * all broadcasts with a particular {@code id} by passing {@code packageName} as {@code null}.
*
+ * @param packageName The name of the package that the caller wants to query for
+ * or {@code null} to indicate that data corresponding to all packages
+ * should be returned.
+ * @param id The ID corresponding to the broadcasts that the caller wants to query for, or
+ * {@code 0} to indicate that data corresponding to all IDs should be returned.
+ * This is the ID the caller specifies when requesting a broadcast response event
+ * to be recorded using
+ * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}.
+ *
+ * @return the list of broadcast response stats corresponding to {@code packageName}
+ * and {@code id}.
+ *
+ * @see #clearBroadcastResponseStats(String, long)
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)
@UserHandleAware
@NonNull
- public BroadcastResponseStats queryBroadcastResponseStats(
- @NonNull String packageName, @IntRange(from = 1) long id) {
+ public List<BroadcastResponseStats> queryBroadcastResponseStats(
+ @Nullable String packageName, @IntRange(from = 0) long id) {
try {
return mService.queryBroadcastResponseStats(packageName, id,
- mContext.getOpPackageName(), mContext.getUserId());
+ mContext.getOpPackageName(), mContext.getUserId()).getList();
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -1428,12 +1445,15 @@
/**
* Clears the broadcast response stats corresponding to {@code packageName} and {@code id}.
*
- * When a caller uses this API, stats related to the events occurring till that point will be
- * cleared and subsequent calls to {@link #queryBroadcastResponseStats(String, long)} will
+ * <p> When a caller uses this API, stats related to the events occurring till that point will
+ * be cleared and subsequent calls to {@link #queryBroadcastResponseStats(String, long)} will
* return stats related to events occurring after this.
*
- * @param packageName The name of the package that the caller wants to clear the data for.
- * @param id The ID corresponding to the broadcasts that the caller wants to clear the data for.
+ * @param packageName The name of the package that the caller wants to clear the data for or
+ * {@code null} to indicate that data corresponding to all packages should
+ * be cleared.
+ * @param id The ID corresponding to the broadcasts that the caller wants to clear the data
+ * for, or {code 0} to indicate that data corresponding to all IDs should be deleted.
* This is the ID the caller specifies when requesting a broadcast response event
* to be recorded using
* {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}.
@@ -1444,8 +1464,8 @@
@SystemApi
@RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)
@UserHandleAware
- public void clearBroadcastResponseStats(@NonNull String packageName,
- @IntRange(from = 1) long id) {
+ public void clearBroadcastResponseStats(@Nullable String packageName,
+ @IntRange(from = 0) long id) {
try {
mService.clearBroadcastResponseStats(packageName, id,
mContext.getOpPackageName(), mContext.getUserId());
@@ -1453,4 +1473,19 @@
throw re.rethrowFromSystemServer();
}
}
+
+ /**
+ * Clears the broadcast events that were sent by the caller uid.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)
+ @UserHandleAware
+ public void clearBroadcastEvents() {
+ try {
+ mService.clearBroadcastEvents(mContext.getOpPackageName(), mContext.getUserId());
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/attention/AttentionManagerInternal.java b/core/java/android/attention/AttentionManagerInternal.java
index 4e00da1..47bec61 100644
--- a/core/java/android/attention/AttentionManagerInternal.java
+++ b/core/java/android/attention/AttentionManagerInternal.java
@@ -49,21 +49,19 @@
/**
* Requests the continuous updates of proximity signal via the provided callback,
* until the given callback is unregistered. Currently, AttentionManagerService only
- * anticipates one client and updates one client at a time. If a new client wants to
- * onboard to receiving Proximity updates, please make a feature request to make proximity
- * feature multi-client before depending on this feature.
+ * anticipates one client and updates one client at a time.
*
* @param callback a callback that receives the proximity updates
* @return {@code true} if the registration should succeed.
*/
- public abstract boolean onStartProximityUpdates(ProximityCallbackInternal callback);
+ public abstract boolean onStartProximityUpdates(ProximityUpdateCallbackInternal callback);
/**
* Requests to stop providing continuous updates until the callback is registered.
*
* @param callback a callback that was used in {@link #onStartProximityUpdates}
*/
- public abstract void onStopProximityUpdates(ProximityCallbackInternal callback);
+ public abstract void onStopProximityUpdates(ProximityUpdateCallbackInternal callback);
/** Internal interface for attention callback. */
public abstract static class AttentionCallbackInternal {
@@ -85,7 +83,7 @@
}
/** Internal interface for proximity callback. */
- public abstract static class ProximityCallbackInternal {
+ public abstract static class ProximityUpdateCallbackInternal {
/**
* @param distance the estimated distance of the user (in meter)
* The distance will be PROXIMITY_UNKNOWN if the proximity sensing was inconclusive.
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index f1abb05..99ce147 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -82,14 +82,21 @@
}
/**
- * Creates a virtual device.
+ * Creates a virtual device where applications can launch and receive input events injected by
+ * the creator.
+ *
+ * <p>The {@link android.Manifest.permission#CREATE_VIRTUAL_DEVICE} permission is required to
+ * create virtual devices, which is only available to system apps holding specific roles.
*
* @param associationId The association ID as returned by {@link AssociationInfo#getId()} from
* Companion Device Manager. Virtual devices must have a corresponding association with CDM in
* order to be created.
+ * @param params The parameters for creating virtual devices. See {@link VirtualDeviceParams}
+ * for the available options.
+ * @return The created virtual device.
*/
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- @Nullable
+ @NonNull
public VirtualDevice createVirtualDevice(
int associationId,
@NonNull VirtualDeviceParams params) {
@@ -141,6 +148,8 @@
}
}
};
+ @Nullable
+ private VirtualAudioDevice mVirtualAudioDevice;
private VirtualDevice(
IVirtualDeviceManager service,
@@ -248,8 +257,8 @@
}
/**
- * Closes the virtual device, stopping and tearing down any virtual displays,
- * audio policies, and event injection that's currently in progress.
+ * Closes the virtual device, stopping and tearing down any virtual displays, associated
+ * virtual audio device, and event injection that's currently in progress.
*/
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public void close() {
@@ -258,6 +267,10 @@
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
+ if (mVirtualAudioDevice != null) {
+ mVirtualAudioDevice.close();
+ mVirtualAudioDevice = null;
+ }
}
/**
@@ -344,8 +357,10 @@
* Creates a VirtualAudioDevice, capable of recording audio emanating from this device,
* or injecting audio from another device.
*
- * <p>Note: This object does not support capturing privileged playback, such as voice call
- * audio.
+ * <p>Note: One {@link VirtualDevice} can only create one {@link VirtualAudioDevice}, so
+ * calling this method multiple times will return the same instance. When
+ * {@link VirtualDevice#close()} is called, the associated {@link VirtualAudioDevice} will
+ * also be closed automatically.
*
* @param display The target virtual display to capture from and inject into.
* @param executor The {@link Executor} object for the thread on which to execute
@@ -361,7 +376,11 @@
@NonNull VirtualDisplay display,
@Nullable Executor executor,
@Nullable AudioConfigurationChangeCallback callback) {
- return new VirtualAudioDevice(mContext, mVirtualDevice, display, executor, callback);
+ if (mVirtualAudioDevice == null) {
+ mVirtualAudioDevice = new VirtualAudioDevice(
+ mContext, mVirtualDevice, display, executor, callback);
+ }
+ return mVirtualAudioDevice;
}
/**
diff --git a/core/java/android/companion/virtual/audio/UserRestrictionsDetector.java b/core/java/android/companion/virtual/audio/UserRestrictionsDetector.java
index 5c246d3..c816da7 100644
--- a/core/java/android/companion/virtual/audio/UserRestrictionsDetector.java
+++ b/core/java/android/companion/virtual/audio/UserRestrictionsDetector.java
@@ -60,7 +60,6 @@
/** Registers user restrictions change. */
void register(@NonNull UserRestrictionsCallback callback) {
mUserRestrictionsCallback = callback;
-
IntentFilter filter = new IntentFilter();
filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
mContext.registerReceiver(/* receiver= */ this, filter);
@@ -73,8 +72,10 @@
/** Unregisters user restrictions change. */
void unregister() {
- mUserRestrictionsCallback = null;
- mContext.unregisterReceiver(/* receiver= */ this);
+ if (mUserRestrictionsCallback != null) {
+ mUserRestrictionsCallback = null;
+ mContext.unregisterReceiver(/* receiver= */ this);
+ }
}
@Override
diff --git a/core/java/android/companion/virtual/audio/VirtualAudioDevice.java b/core/java/android/companion/virtual/audio/VirtualAudioDevice.java
index 38e37ec..3f7299f 100644
--- a/core/java/android/companion/virtual/audio/VirtualAudioDevice.java
+++ b/core/java/android/companion/virtual/audio/VirtualAudioDevice.java
@@ -24,6 +24,7 @@
import android.content.Context;
import android.hardware.display.VirtualDisplay;
import android.media.AudioFormat;
+import android.media.AudioManager;
import android.media.AudioPlaybackConfiguration;
import android.media.AudioRecordingConfiguration;
import android.os.RemoteException;
@@ -96,7 +97,7 @@
if (mOngoingSession != null && mOngoingSession.getAudioInjection() != null) {
throw new IllegalStateException("Cannot start an audio injection while a session is "
- + "ongoing. Call close() on this device first to end the previous injection.");
+ + "ongoing. Call close() on this device first to end the previous session.");
}
if (mOngoingSession == null) {
mOngoingSession = new VirtualAudioSession(mContext, mCallback, mExecutor);
@@ -114,6 +115,9 @@
/**
* Begins recording audio emanating from this device.
*
+ * <p>Note: This method does not support capturing privileged playback, which means the
+ * application can opt out of capturing by {@link AudioManager#setAllowedCapturePolicy(int)}.
+ *
* @return An {@link AudioCapture} containing the recorded audio.
*/
@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
@@ -150,6 +154,7 @@
return mOngoingSession != null ? mOngoingSession.getAudioInjection() : null;
}
+ /** Stops audio capture and injection then releases all the resources */
@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
@Override
public void close() {
diff --git a/core/java/android/companion/virtual/audio/VirtualAudioSession.java b/core/java/android/companion/virtual/audio/VirtualAudioSession.java
index bc71bd6..c6a1045 100644
--- a/core/java/android/companion/virtual/audio/VirtualAudioSession.java
+++ b/core/java/android/companion/virtual/audio/VirtualAudioSession.java
@@ -120,7 +120,7 @@
@NonNull
public AudioInjection startAudioInjection(@NonNull AudioFormat injectionFormat) {
Objects.requireNonNull(injectionFormat, "injectionFormat must not be null");
- mUserRestrictionsDetector.register(/* callback= */ this);
+
synchronized (mLock) {
if (mAudioInjection != null) {
throw new IllegalStateException(
@@ -130,6 +130,8 @@
mInjectionFormat = injectionFormat;
mAudioInjection = new AudioInjection();
mAudioInjection.play();
+
+ mUserRestrictionsDetector.register(/* callback= */ this);
mAudioInjection.setSilent(mUserRestrictionsDetector.isUnmuteMicrophoneDisallowed());
return mAudioInjection;
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 0fed733..8f82a0a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3525,7 +3525,7 @@
public abstract boolean stopServiceAsUser(Intent service, UserHandle user);
/**
- * Connect to an application service, creating it if needed. This defines
+ * Connects to an application service, creating it if needed. This defines
* a dependency between your application and the service. The given
* <var>conn</var> will receive the service object when it is created and be
* told if it dies and restarts. The service will be considered required
@@ -3540,11 +3540,8 @@
* will be invoked instead of
* {@link ServiceConnection#onServiceConnected(ComponentName, IBinder) onServiceConnected()}.
*
- * <p>This method will throw {@link SecurityException} if the calling app does not
- * have permission to bind to the given service.
- *
- * <p class="note">Note: this method <em>cannot be called from a
- * {@link BroadcastReceiver} component</em>. A pattern you can use to
+ * <p class="note"><b>Note:</b> This method <em>cannot</em> be called from a
+ * {@link BroadcastReceiver} component. A pattern you can use to
* communicate from a BroadcastReceiver to a Service is to call
* {@link #startService} with the arguments containing the command to be
* sent, with the service calling its
@@ -3559,33 +3556,34 @@
* specify an explicit component name.
* @param conn Receives information as the service is started and stopped.
* This must be a valid ServiceConnection object; it must not be null.
- * @param flags Operation options for the binding. May be 0,
- * {@link #BIND_AUTO_CREATE}, {@link #BIND_DEBUG_UNBIND},
- * {@link #BIND_NOT_FOREGROUND}, {@link #BIND_ABOVE_CLIENT},
- * {@link #BIND_ALLOW_OOM_MANAGEMENT}, {@link #BIND_WAIVE_PRIORITY}.
- * {@link #BIND_IMPORTANT}, {@link #BIND_ADJUST_WITH_ACTIVITY},
- * {@link #BIND_NOT_PERCEPTIBLE}, or {@link #BIND_INCLUDE_CAPABILITIES}.
- * @return {@code true} if the system is in the process of bringing up a
+ * @param flags Operation options for the binding. Can be:
+ * <ul>
+ * <li>0
+ * <li>{@link #BIND_AUTO_CREATE}
+ * <li>{@link #BIND_DEBUG_UNBIND}
+ * <li>{@link #BIND_NOT_FOREGROUND}
+ * <li>{@link #BIND_ABOVE_CLIENT}
+ * <li>{@link #BIND_ALLOW_OOM_MANAGEMENT}
+ * <li>{@link #BIND_WAIVE_PRIORITY}
+ * <li>{@link #BIND_IMPORTANT}
+ * <li>{@link #BIND_ADJUST_WITH_ACTIVITY}
+ * <li>{@link #BIND_NOT_PERCEPTIBLE}
+ * <li>{@link #BIND_INCLUDE_CAPABILITIES}
+ * </ul>
+ *
+ * @return {@code true} if the system is in the process of bringing up a
* service that your client has permission to bind to; {@code false}
* if the system couldn't find the service or if your client doesn't
* have permission to bind to it. You should call {@link #unbindService}
* to release the connection even if this method returned {@code false}.
*
- * @throws SecurityException If the caller does not have permission to access the service
- * or the service can not be found.
+ * @throws SecurityException If the caller does not have permission to
+ * access the service or the service cannot be found. Call
+ * {@link #unbindService} to release the connection when this exception
+ * is thrown.
*
* @see #unbindService
* @see #startService
- * @see #BIND_AUTO_CREATE
- * @see #BIND_DEBUG_UNBIND
- * @see #BIND_NOT_FOREGROUND
- * @see #BIND_ABOVE_CLIENT
- * @see #BIND_ALLOW_OOM_MANAGEMENT
- * @see #BIND_WAIVE_PRIORITY
- * @see #BIND_IMPORTANT
- * @see #BIND_ADJUST_WITH_ACTIVITY
- * @see #BIND_NOT_PERCEPTIBLE
- * @see #BIND_INCLUDE_CAPABILITIES
*/
public abstract boolean bindService(@RequiresPermission Intent service,
@NonNull ServiceConnection conn, @BindServiceFlags int flags);
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index e5cffb1..0aa25ef 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -9209,6 +9209,16 @@
}
/**
+ * Returns the total size of the extras in bytes, or 0 if no extras are present.
+ * @hide
+ */
+ public int getExtrasTotalSize() {
+ return (mExtras != null)
+ ? mExtras.getSize()
+ : 0;
+ }
+
+ /**
* @return Whether {@link #maybeStripForHistory} will return an lightened intent or
* return itself as-is.
* @hide
diff --git a/core/java/android/content/ServiceConnection.java b/core/java/android/content/ServiceConnection.java
index 21398f6..660a7f0 100644
--- a/core/java/android/content/ServiceConnection.java
+++ b/core/java/android/content/ServiceConnection.java
@@ -63,8 +63,12 @@
* happen, for example, if the application hosting the service it is bound to
* has been updated.
*
- * @param name The concrete component name of the service whose
- * connection is dead.
+ * <p class="note"><b>Note:</b> The app that requested the binding must call
+ * {@link Context#unbindService(ServiceConnection)} to release the tracking
+ * resources associated with this ServiceConnection even if this callback was
+ * invoked following {@link Context#bindService Context.bindService() bindService()}.
+ *
+ * @param name The concrete component name of the service whose connection is dead.
*/
default void onBindingDied(ComponentName name) {
}
@@ -72,10 +76,10 @@
/**
* Called when the service being bound has returned {@code null} from its
* {@link android.app.Service#onBind(Intent) onBind()} method. This indicates
- * that the attempting service binding represented by this ServiceConnection
+ * that the attempted service binding represented by this ServiceConnection
* will never become usable.
*
- * <p class="note">The app which requested the binding must still call
+ * <p class="note"><b>Note:</b> The app that requested the binding must still call
* {@link Context#unbindService(ServiceConnection)} to release the tracking
* resources associated with this ServiceConnection even if this callback was
* invoked following {@link Context#bindService Context.bindService() bindService()}.
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 2528e16..be58ba7 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -39,6 +39,7 @@
import android.util.Printer;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
+import android.view.OnBackInvokedCallback;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Parcelling;
@@ -801,11 +802,24 @@
*/
public static final int PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE = 1 << 2;
+
+ /**
+ * If false, {@link android.view.KeyEvent#KEYCODE_BACK} related events will be forwarded to
+ * the Activities, Dialogs and Views and {@link android.app.Activity#onBackPressed()},
+ * {@link android.app.Dialog#onBackPressed} will be called. Otherwise, those events will be
+ * replaced by a call to {@link OnBackInvokedCallback#onBackInvoked()} on the focused window.
+ *
+ * @hide
+ * @see android.R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback
+ */
+ public static final int PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK = 1 << 3;
+
/** @hide */
@IntDef(flag = true, prefix = { "PRIVATE_FLAG_EXT_" }, value = {
PRIVATE_FLAG_EXT_PROFILEABLE,
PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION,
PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE,
+ PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ApplicationInfoPrivateFlagsExt {}
@@ -1683,6 +1697,7 @@
pw.println(prefix + "localeConfigRes=0x"
+ Integer.toHexString(localeConfigRes));
}
+ pw.println(prefix + "enableOnBackInvokedCallback=" + isOnBackInvokedCallbackEnabled());
}
pw.println(prefix + "createTimestamp=" + createTimestamp);
if (mKnownActivityEmbeddingCerts != null) {
@@ -2566,6 +2581,17 @@
}
/**
+ * Returns whether the application will use the {@link android.view.OnBackInvokedCallback}
+ * navigation system instead of the {@link android.view.KeyEvent#KEYCODE_BACK} and related
+ * callbacks.
+ *
+ * @hide
+ */
+ public boolean isOnBackInvokedCallbackEnabled() {
+ return ((privateFlagsExt & PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK)) != 0;
+ }
+
+ /**
* @hide
*/
@Override protected ApplicationInfo getApplicationInfo() {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index dc79ee6..a162c41 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -8035,6 +8035,7 @@
return PackageParser.generatePackageInfo(pkg, null, (int) flagsBits, 0, 0, null,
FrameworkPackageUserState.DEFAULT);
} catch (PackageParser.PackageParserException e) {
+ Log.w(TAG, "Failure to parse package archive", e);
return null;
}
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 98cc8f6..e914432 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -59,6 +59,7 @@
import android.content.pm.overlay.OverlayPaths;
import android.content.pm.parsing.result.ParseResult;
import android.content.pm.parsing.result.ParseTypeImpl;
+import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.content.pm.pkg.FrameworkPackageUserState;
import android.content.res.ApkAssets;
import android.content.res.AssetManager;
@@ -2417,9 +2418,28 @@
Slog.i(TAG, newPermsMsg.toString());
}
- final List<PermissionManager.SplitPermissionInfo> splitPermissions =
- ActivityThread.currentApplication().getSystemService(PermissionManager.class)
- .getSplitPermissions();
+ // Must build permission info manually for legacy code, which can be called before
+ // Appication is available through the app process, so the normal API doesn't work.
+ List<SplitPermissionInfoParcelable> splitPermissionParcelables;
+ try {
+ splitPermissionParcelables = ActivityThread.getPermissionManager()
+ .getSplitPermissions();
+ } catch (RemoteException e) {
+ splitPermissionParcelables = Collections.emptyList();
+ }
+
+ int splitPermissionsSize = splitPermissionParcelables.size();
+ List<PermissionManager.SplitPermissionInfo> splitPermissions =
+ new ArrayList<>(splitPermissionsSize);
+ for (int index = 0; index < splitPermissionsSize; index++) {
+ SplitPermissionInfoParcelable splitPermissionParcelable =
+ splitPermissionParcelables.get(index);
+ splitPermissions.add(new PermissionManager.SplitPermissionInfo(
+ splitPermissionParcelable.getSplitPermission(),
+ splitPermissionParcelable.getNewPermissions(),
+ splitPermissionParcelable.getTargetSdk()
+ ));
+ }
final int listSize = splitPermissions.size();
for (int is = 0; is < listSize; is++) {
diff --git a/core/java/android/content/res/FontResourcesParser.java b/core/java/android/content/res/FontResourcesParser.java
index ecd240d..24ae31e 100644
--- a/core/java/android/content/res/FontResourcesParser.java
+++ b/core/java/android/content/res/FontResourcesParser.java
@@ -199,6 +199,7 @@
certs.add(certsList);
}
}
+ typedArray.recycle();
}
return new ProviderResourceEntry(
authority,
diff --git a/core/java/android/hardware/ISensorPrivacyListener.aidl b/core/java/android/hardware/ISensorPrivacyListener.aidl
index 5d40265..2ac21d2 100644
--- a/core/java/android/hardware/ISensorPrivacyListener.aidl
+++ b/core/java/android/hardware/ISensorPrivacyListener.aidl
@@ -24,6 +24,6 @@
// the ones in
// frameworks/native/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyListener.aidl
// =============== Beginning of transactions used on native side as well ======================
- void onSensorPrivacyChanged(boolean enabled);
+ void onSensorPrivacyChanged(int toggleType, int sensor, boolean enabled);
// =============== End of transactions used on native side as well ============================
}
diff --git a/core/java/android/hardware/ISensorPrivacyManager.aidl b/core/java/android/hardware/ISensorPrivacyManager.aidl
index 5571165..a392afd 100644
--- a/core/java/android/hardware/ISensorPrivacyManager.aidl
+++ b/core/java/android/hardware/ISensorPrivacyManager.aidl
@@ -24,34 +24,31 @@
// the ones in
// frameworks/native/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl
// =============== Beginning of transactions used on native side as well ======================
- boolean supportsSensorToggle(int sensor);
+ boolean supportsSensorToggle(int toggleType, int sensor);
void addSensorPrivacyListener(in ISensorPrivacyListener listener);
- void addIndividualSensorPrivacyListener(int userId, int sensor,
- in ISensorPrivacyListener listener);
+ void addToggleSensorPrivacyListener(in ISensorPrivacyListener listener);
void removeSensorPrivacyListener(in ISensorPrivacyListener listener);
- void removeIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener);
+ void removeToggleSensorPrivacyListener(in ISensorPrivacyListener listener);
boolean isSensorPrivacyEnabled();
- boolean isIndividualSensorPrivacyEnabled(int userId, int sensor);
+ boolean isCombinedToggleSensorPrivacyEnabled(int sensor);
+
+ boolean isToggleSensorPrivacyEnabled(int toggleType, int sensor);
void setSensorPrivacy(boolean enable);
- void setIndividualSensorPrivacy(int userId, int source, int sensor, boolean enable);
+ void setToggleSensorPrivacy(int userId, int source, int sensor, boolean enable);
- void setIndividualSensorPrivacyForProfileGroup(int userId, int source, int sensor, boolean enable);
+ void setToggleSensorPrivacyForProfileGroup(int userId, int source, int sensor, boolean enable);
// =============== End of transactions used on native side as well ============================
- void suppressIndividualSensorPrivacyReminders(int userId, int sensor, IBinder token,
+ void suppressToggleSensorPrivacyReminders(int userId, int sensor, IBinder token,
boolean suppress);
- void addUserGlobalIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener);
-
- void removeUserGlobalIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener);
-
void showSensorUseDialog(int sensor);
}
\ No newline at end of file
diff --git a/core/java/android/hardware/SensorEvent.java b/core/java/android/hardware/SensorEvent.java
index 45d4c09..6113932 100644
--- a/core/java/android/hardware/SensorEvent.java
+++ b/core/java/android/hardware/SensorEvent.java
@@ -17,6 +17,7 @@
package android.hardware;
import android.annotation.NonNull;
+import android.annotation.SuppressLint;
import android.compat.annotation.UnsupportedAppUsage;
/**
@@ -664,16 +665,20 @@
* The first three elements provide the transform from the (arbitrary, possibly slowly drifting)
* reference frame to the head frame. The magnitude of this vector is in range [0, π]
* radians, while the value of individual axes is in range [-π, π]. The next three
- * elements provide the estimated rotational velocity of the user's head relative to itself, in
- * radians per second.
+ * elements optionally provide the estimated rotational velocity of the user's head relative to
+ * itself, in radians per second. If a given sensor does not support determining velocity, these
+ * elements are set to 0.
*
* <ul>
* <li> values[0] : X component of Euler vector representing rotation</li>
* <li> values[1] : Y component of Euler vector representing rotation</li>
* <li> values[2] : Z component of Euler vector representing rotation</li>
- * <li> values[3] : X component of Euler vector representing angular velocity</li>
- * <li> values[4] : Y component of Euler vector representing angular velocity</li>
- * <li> values[5] : Z component of Euler vector representing angular velocity</li>
+ * <li> values[3] : X component of Euler vector representing angular velocity (if
+ * supported, otherwise 0)</li>
+ * <li> values[4] : Y component of Euler vector representing angular velocity (if
+ * supported, otherwise 0)</li>
+ * <li> values[5] : Z component of Euler vector representing angular velocity (if
+ * supported, otherwise 0)</li>
* </ul>
*
* <h4>{@link android.hardware.Sensor#TYPE_ACCELEROMETER_LIMITED_AXES
@@ -820,6 +825,21 @@
*/
public long timestamp;
+ /**
+ * Set to true when this is the first sensor event after a discontinuity.
+ *
+ * The exact meaning of discontinuity depends on the sensor type. For
+ * {@link android.hardware.Sensor#TYPE_HEAD_TRACKER Sensor.TYPE_HEAD_TRACKER}, this means that
+ * the reference frame has suddenly and significantly changed, for example if the head tracking
+ * device was removed then put back.
+ *
+ * Note that this concept is either not relevant to or not supported by most sensor types,
+ * {@link android.hardware.Sensor#TYPE_HEAD_TRACKER Sensor.TYPE_HEAD_TRACKER} being the notable
+ * exception.
+ */
+ @SuppressLint("MutableBareField")
+ public boolean firstEventAfterDiscontinuity;
+
@UnsupportedAppUsage
SensorEvent(int valueSize) {
values = new float[valueSize];
diff --git a/core/java/android/hardware/SensorEventCallback.java b/core/java/android/hardware/SensorEventCallback.java
index 7b0092d..bac212a 100644
--- a/core/java/android/hardware/SensorEventCallback.java
+++ b/core/java/android/hardware/SensorEventCallback.java
@@ -16,8 +16,6 @@
package android.hardware;
-import android.annotation.NonNull;
-
/**
* Used for receiving sensor additional information frames.
*/
@@ -54,21 +52,4 @@
* reported from sensor hardware.
*/
public void onSensorAdditionalInfo(SensorAdditionalInfo info) {}
-
- /**
- * Called when the next {@link android.hardware.SensorEvent SensorEvent} to be delivered via the
- * {@link #onSensorChanged(SensorEvent) onSensorChanged} method represents the first event after
- * a discontinuity.
- *
- * The exact meaning of discontinuity depends on the sensor type. For {@link
- * android.hardware.Sensor#TYPE_HEAD_TRACKER Sensor.TYPE_HEAD_TRACKER}, this means that the
- * reference frame has suddenly and significantly changed.
- *
- * Note that this concept is either not relevant to or not supported by most sensor types,
- * {@link android.hardware.Sensor#TYPE_HEAD_TRACKER Sensor.TYPE_HEAD_TRACKER} being the notable
- * exception.
- *
- * @param sensor The {@link android.hardware.Sensor Sensor} which experienced the discontinuity.
- */
- public void onSensorDiscontinuity(@NonNull Sensor sensor) {}
}
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 47659a9..dec424c 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -639,7 +639,7 @@
/**
* Unregisters a listener for the sensors with which it is registered.
*
- * <p class="note"></p>
+ * <p class="note">
* Note: Don't use this method with a one shot trigger sensor such as
* {@link Sensor#TYPE_SIGNIFICANT_MOTION}.
* Use {@link #cancelTriggerSensor(TriggerEventListener, Sensor)} instead.
diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java
index 79153d7..a3cc01c 100644
--- a/core/java/android/hardware/SensorPrivacyManager.java
+++ b/core/java/android/hardware/SensorPrivacyManager.java
@@ -36,7 +36,6 @@
import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
-import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -73,8 +72,6 @@
public static final String EXTRA_ALL_SENSORS = SensorPrivacyManager.class.getName()
+ ".extra.all_sensors";
- private final SparseArray<Boolean> mToggleSupportCache = new SparseArray<>();
-
/**
* Sensor constants which are used in {@link SensorPrivacyManager}
*/
@@ -161,36 +158,30 @@
}
+
+ /**
+ * Constant for software toggle.
+ */
+ public static final int TOGGLE_TYPE_SOFTWARE =
+ SensorPrivacyIndividualEnabledSensorProto.SOFTWARE;
+
+ /**
+ * Constant for hardware toggle.
+ */
+ public static final int TOGGLE_TYPE_HARDWARE =
+ SensorPrivacyIndividualEnabledSensorProto.HARDWARE;
+
/**
* Types of toggles which can exist for sensor privacy
+ *
* @hide
*/
- public static class ToggleTypes {
- private ToggleTypes() {}
-
- /**
- * Constant for software toggle.
- */
- public static final int SOFTWARE = SensorPrivacyIndividualEnabledSensorProto.SOFTWARE;
-
- /**
- * Constant for hardware toggle.
- */
- public static final int HARDWARE = SensorPrivacyIndividualEnabledSensorProto.HARDWARE;
-
- /**
- * Types of toggles which can exist for sensor privacy
- *
- * @hide
- */
- @IntDef(value = {
- SOFTWARE,
- HARDWARE
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface ToggleType {}
-
- }
+ @IntDef(value = {
+ TOGGLE_TYPE_SOFTWARE,
+ TOGGLE_TYPE_HARDWARE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ToggleType {}
/**
* Types of state which can exist for the sensor privacy toggle
@@ -235,14 +226,57 @@
/**
* Callback invoked when the sensor privacy state changes.
*
+ * @param params Parameters describing the new state
+ */
+ default void onSensorPrivacyChanged(@NonNull SensorPrivacyChangedParams params) {
+ onSensorPrivacyChanged(params.mSensor, params.mEnabled);
+ }
+
+ /**
+ * Callback invoked when the sensor privacy state changes.
+ *
* @param sensor the sensor whose state is changing
* @param enabled true if sensor privacy is enabled, false otherwise.
+ *
+ * @deprecated Please use
+ * {@link #onSensorPrivacyChanged(SensorPrivacyChangedParams)}
*/
+ @Deprecated
void onSensorPrivacyChanged(int sensor, boolean enabled);
+
+ /**
+ * A class containing information about what the sensor privacy state has changed to.
+ */
+ class SensorPrivacyChangedParams {
+
+ private int mToggleType;
+ private int mSensor;
+ private boolean mEnabled;
+
+ private SensorPrivacyChangedParams(int toggleType, int sensor, boolean enabled) {
+ mToggleType = toggleType;
+ mSensor = sensor;
+ mEnabled = enabled;
+ }
+
+ public @ToggleType int getToggleType() {
+ return mToggleType;
+ }
+
+ public @Sensors.Sensor int getSensor() {
+ return mSensor;
+ }
+
+ public boolean isEnabled() {
+ return mEnabled;
+ }
+ }
}
private static final Object sInstanceLock = new Object();
+ private final Object mLock = new Object();
+
@GuardedBy("sInstanceLock")
private static SensorPrivacyManager sInstance;
@@ -252,12 +286,46 @@
@NonNull
private final ISensorPrivacyManager mService;
+ @GuardedBy("mLock")
+ private final ArrayMap<Pair<Integer, Integer>, Boolean> mToggleSupportCache = new ArrayMap<>();
+
@NonNull
private final ArrayMap<OnAllSensorPrivacyChangedListener, ISensorPrivacyListener> mListeners;
+ /** Registered listeners */
+ @GuardedBy("mLock")
@NonNull
- private final ArrayMap<Pair<OnSensorPrivacyChangedListener, Integer>, ISensorPrivacyListener>
- mIndividualListeners;
+ private final ArrayMap<OnSensorPrivacyChangedListener, Executor> mToggleListeners =
+ new ArrayMap<>();
+
+ /** Listeners registered using the deprecated APIs and which
+ * OnSensorPrivacyChangedListener they're using. */
+ @GuardedBy("mLock")
+ @NonNull
+ private final ArrayMap<Pair<Integer, OnSensorPrivacyChangedListener>,
+ OnSensorPrivacyChangedListener> mLegacyToggleListeners = new ArrayMap<>();
+
+ /** The singleton ISensorPrivacyListener for IPC which will be used to dispatch to local
+ * listeners */
+ @NonNull
+ private final ISensorPrivacyListener mIToggleListener = new ISensorPrivacyListener.Stub() {
+ @Override
+ public void onSensorPrivacyChanged(int toggleType, int sensor, boolean enabled) {
+ synchronized (mLock) {
+ for (int i = 0; i < mToggleListeners.size(); i++) {
+ OnSensorPrivacyChangedListener listener = mToggleListeners.keyAt(i);
+ mToggleListeners.valueAt(i).execute(() -> listener
+ .onSensorPrivacyChanged(new OnSensorPrivacyChangedListener
+ .SensorPrivacyChangedParams(toggleType, sensor, enabled)));
+ }
+ }
+ }
+ };
+
+ /** Whether the singleton ISensorPrivacyListener has been registered */
+ @GuardedBy("mLock")
+ @NonNull
+ private boolean mToggleListenerRegistered = false;
/**
* Private constructor to ensure only a single instance is created.
@@ -266,7 +334,6 @@
mContext = context;
mService = service;
mListeners = new ArrayMap<>();
- mIndividualListeners = new ArrayMap<>();
}
/**
@@ -290,30 +357,56 @@
}
/**
+ * Returns the single instance of the SensorPrivacyManager.
+ *
+ * @hide
+ */
+ public static SensorPrivacyManager getInstance(Context context, ISensorPrivacyManager service) {
+ synchronized (sInstanceLock) {
+ sInstance = new SensorPrivacyManager(context, service);
+ return sInstance;
+ }
+ }
+
+ /**
* Checks if the given toggle is supported on this device
* @param sensor The sensor to check
* @return whether the toggle for the sensor is supported on this device.
*/
public boolean supportsSensorToggle(@Sensors.Sensor int sensor) {
+ return supportsSensorToggle(TOGGLE_TYPE_SOFTWARE, sensor);
+ }
+
+ /**
+ * Checks if the given toggle is supported on this device
+ * @param sensor The sensor to check
+ * @return whether the toggle for the sensor is supported on this device.
+ *
+ */
+ public boolean supportsSensorToggle(@ToggleType int toggleType, @Sensors.Sensor int sensor) {
try {
- Boolean val = mToggleSupportCache.get(sensor);
- if (val == null) {
- val = mService.supportsSensorToggle(sensor);
- mToggleSupportCache.put(sensor, val);
+ Pair key = new Pair(toggleType, sensor);
+ synchronized (mLock) {
+ Boolean val = mToggleSupportCache.get(key);
+ if (val == null) {
+ val = mService.supportsSensorToggle(toggleType, sensor);
+ mToggleSupportCache.put(key, val);
+ }
+ return val;
}
- return val;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
+ *
* Registers a new listener to receive notification when the state of sensor privacy
* changes.
*
* @param sensor the sensor to listen to changes to
* @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor
- * privacy changes.
+ * privacy changes.
*
* @hide
*/
@@ -325,6 +418,7 @@
}
/**
+ *
* Registers a new listener to receive notification when the state of sensor privacy
* changes.
*
@@ -336,19 +430,20 @@
* @hide
*/
@RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
- public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @UserIdInt int userId,
+ public void addSensorPrivacyListener(@Sensors.Sensor int sensor, int userId,
@NonNull OnSensorPrivacyChangedListener listener) {
- addSensorPrivacyListener(sensor, userId, mContext.getMainExecutor(), listener);
+ addSensorPrivacyListener(sensor, mContext.getMainExecutor(), listener);
}
/**
+ *
* Registers a new listener to receive notification when the state of sensor privacy
* changes.
*
* @param sensor the sensor to listen to changes to
* @param executor the executor to dispatch the callback on
* @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor
- * privacy changes.
+ * privacy changes.
*
* @hide
*/
@@ -356,61 +451,76 @@
@RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @NonNull Executor executor,
@NonNull OnSensorPrivacyChangedListener listener) {
- Pair<OnSensorPrivacyChangedListener, Integer> key = new Pair<>(listener, sensor);
- synchronized (mIndividualListeners) {
- ISensorPrivacyListener iListener = mIndividualListeners.get(key);
- if (iListener == null) {
- iListener = new ISensorPrivacyListener.Stub() {
- @Override
- public void onSensorPrivacyChanged(boolean enabled) {
- executor.execute(() -> listener.onSensorPrivacyChanged(sensor, enabled));
- }
- };
- mIndividualListeners.put(key, iListener);
+ Pair<Integer, OnSensorPrivacyChangedListener> pair = new Pair(sensor, listener);
+ OnSensorPrivacyChangedListener toggleListener = new OnSensorPrivacyChangedListener() {
+ @Override
+ public void onSensorPrivacyChanged(SensorPrivacyChangedParams params) {
+ if (params.getSensor() == sensor) {
+ listener.onSensorPrivacyChanged(params.getSensor(), params.isEnabled());
+ }
}
+ @Override
+ public void onSensorPrivacyChanged(int sensor, boolean enabled) {
+ }
+ };
- try {
- mService.addUserGlobalIndividualSensorPrivacyListener(sensor, iListener);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ synchronized (mLock) {
+ mLegacyToggleListeners.put(pair, toggleListener);
+ addSensorPrivacyListenerLocked(executor, toggleListener);
}
}
/**
+ *
* Registers a new listener to receive notification when the state of sensor privacy
* changes.
*
- * @param sensor the sensor to listen to changes to
- * @param executor the executor to dispatch the callback on
- * @param userId the user's id
- * @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor
- * privacy changes.
+ * @param listener the OnSensorPrivacyChangedListener to be notified when the state of
+ * sensor privacy changes.
*
* @hide
*/
+ @SystemApi
@RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
- public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @UserIdInt int userId,
- @NonNull Executor executor, @NonNull OnSensorPrivacyChangedListener listener) {
- synchronized (mIndividualListeners) {
- ISensorPrivacyListener iListener = mIndividualListeners.get(listener);
- if (iListener == null) {
- iListener = new ISensorPrivacyListener.Stub() {
- @Override
- public void onSensorPrivacyChanged(boolean enabled) {
- executor.execute(() -> listener.onSensorPrivacyChanged(sensor, enabled));
- }
- };
- mIndividualListeners.put(new Pair<>(listener, sensor), iListener);
- }
+ public void addSensorPrivacyListener(@NonNull OnSensorPrivacyChangedListener listener) {
+ addSensorPrivacyListener(mContext.getMainExecutor(), listener);
+ }
+ /**
+ *
+ * Registers a new listener to receive notification when the state of sensor privacy
+ * changes.
+ *
+ * @param executor the executor to dispatch the callback on
+ * @param listener the OnSensorPrivacyChangedListener to be notified when the state of
+ * sensor privacy changes.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+ public void addSensorPrivacyListener(@NonNull Executor executor,
+ @NonNull OnSensorPrivacyChangedListener listener) {
+ synchronized (mLock) {
+ addSensorPrivacyListenerLocked(executor, listener);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void addSensorPrivacyListenerLocked(@NonNull Executor executor,
+ @NonNull OnSensorPrivacyChangedListener listener) {
+ if (!mToggleListenerRegistered) {
try {
- mService.addIndividualSensorPrivacyListener(userId, sensor,
- iListener);
+ mService.addToggleSensorPrivacyListener(mIToggleListener);
+ mToggleListenerRegistered = true;
} catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ e.rethrowFromSystemServer();
}
}
+ if (mToggleListeners.containsKey(listener)) {
+ throw new IllegalArgumentException("listener is already registered");
+ }
+ mToggleListeners.put(listener, executor);
}
/**
@@ -426,23 +536,66 @@
@RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
public void removeSensorPrivacyListener(@Sensors.Sensor int sensor,
@NonNull OnSensorPrivacyChangedListener listener) {
- synchronized (mListeners) {
- for (int i = 0; i < mIndividualListeners.size(); i++) {
- Pair<OnSensorPrivacyChangedListener, Integer> pair = mIndividualListeners.keyAt(i);
- if (pair.second == sensor && pair.first.equals(listener)) {
- try {
- mService.removeIndividualSensorPrivacyListener(sensor,
- mIndividualListeners.valueAt(i));
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- mIndividualListeners.removeAt(i--);
- }
+ Pair<Integer, OnSensorPrivacyChangedListener> pair = new Pair(sensor, listener);
+ synchronized (mLock) {
+ OnSensorPrivacyChangedListener onToggleSensorPrivacyChangedListener =
+ mLegacyToggleListeners.remove(pair);
+ if (onToggleSensorPrivacyChangedListener != null) {
+ removeSensorPrivacyListenerLocked(onToggleSensorPrivacyChangedListener);
}
}
}
/**
+ * Unregisters the specified listener from receiving notifications when the state of any sensor
+ * privacy changes.
+ *
+ * @param listener the {@link OnSensorPrivacyChangedListener} to be unregistered from
+ * notifications when sensor privacy changes.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+ public void removeSensorPrivacyListener(
+ @NonNull OnSensorPrivacyChangedListener listener) {
+ synchronized (mLock) {
+ removeSensorPrivacyListenerLocked(listener);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void removeSensorPrivacyListenerLocked(
+ @NonNull OnSensorPrivacyChangedListener listener) {
+ mToggleListeners.remove(listener);
+ if (mToggleListeners.size() == 0) {
+ try {
+ mService.removeToggleSensorPrivacyListener(mIToggleListener);
+ mToggleListenerRegistered = false;
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Returns whether sensor privacy is currently enabled by software control for a specific
+ * sensor.
+ *
+ * @return true if sensor privacy is currently enabled, false otherwise.
+ *
+ * @deprecated Prefer to use {@link #isSensorPrivacyEnabled(int, int)}
+ *
+ * @hide
+ */
+ @Deprecated
+ @SystemApi
+ @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+ public boolean isSensorPrivacyEnabled(@Sensors.Sensor int sensor) {
+ return isSensorPrivacyEnabled(TOGGLE_TYPE_SOFTWARE, sensor);
+ }
+
+ /**
* Returns whether sensor privacy is currently enabled for a specific sensor.
*
* @return true if sensor privacy is currently enabled, false otherwise.
@@ -451,21 +604,29 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
- public boolean isSensorPrivacyEnabled(@Sensors.Sensor int sensor) {
- return isSensorPrivacyEnabled(sensor, UserHandle.USER_CURRENT);
+ public boolean isSensorPrivacyEnabled(@ToggleType int toggleType,
+ @Sensors.Sensor int sensor) {
+ try {
+ return mService.isToggleSensorPrivacyEnabled(toggleType, sensor);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
/**
* Returns whether sensor privacy is currently enabled for a specific sensor.
+ * Combines the state of the SW + HW toggles and returns true if either the
+ * SOFTWARE or the HARDWARE toggles are enabled.
*
* @return true if sensor privacy is currently enabled, false otherwise.
*
* @hide
*/
+ @SystemApi
@RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
- public boolean isSensorPrivacyEnabled(@Sensors.Sensor int sensor, @UserIdInt int userId) {
+ public boolean areAnySensorPrivacyTogglesEnabled(@Sensors.Sensor int sensor) {
try {
- return mService.isIndividualSensorPrivacyEnabled(userId, sensor);
+ return mService.isCombinedToggleSensorPrivacyEnabled(sensor);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -524,7 +685,7 @@
public void setSensorPrivacy(@Sources.Source int source, @Sensors.Sensor int sensor,
boolean enable, @UserIdInt int userId) {
try {
- mService.setIndividualSensorPrivacy(userId, source, sensor, enable);
+ mService.setToggleSensorPrivacy(userId, source, sensor, enable);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -561,7 +722,7 @@
public void setSensorPrivacyForProfileGroup(@Sources.Source int source,
@Sensors.Sensor int sensor, boolean enable, @UserIdInt int userId) {
try {
- mService.setIndividualSensorPrivacyForProfileGroup(userId, source, sensor, enable);
+ mService.setToggleSensorPrivacyForProfileGroup(userId, source, sensor, enable);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -592,7 +753,7 @@
public void suppressSensorPrivacyReminders(int sensor,
boolean suppress, @UserIdInt int userId) {
try {
- mService.suppressIndividualSensorPrivacyReminders(userId, sensor,
+ mService.suppressToggleSensorPrivacyReminders(userId, sensor,
token, suppress);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -667,7 +828,8 @@
if (iListener == null) {
iListener = new ISensorPrivacyListener.Stub() {
@Override
- public void onSensorPrivacyChanged(boolean enabled) {
+ public void onSensorPrivacyChanged(int toggleType, int sensor,
+ boolean enabled) {
listener.onAllSensorPrivacyChanged(enabled);
}
};
diff --git a/core/java/android/hardware/SensorPrivacyManagerInternal.java b/core/java/android/hardware/SensorPrivacyManagerInternal.java
index d12e9f8..f4de966 100644
--- a/core/java/android/hardware/SensorPrivacyManagerInternal.java
+++ b/core/java/android/hardware/SensorPrivacyManagerInternal.java
@@ -61,4 +61,9 @@
*/
public abstract void addSensorPrivacyListenerForAllUsers(int sensor,
OnUserSensorPrivacyChangedListener listener);
+
+ /**
+ * Set the HW toggle sensor value based on HW switch states, called from InputManagerService
+ */
+ public abstract void setPhysicalToggleSensorPrivacy(int userId, int sensor, boolean enable);
}
diff --git a/core/java/android/hardware/SyncFence.java b/core/java/android/hardware/SyncFence.java
index b0a6f51..99791ce 100644
--- a/core/java/android/hardware/SyncFence.java
+++ b/core/java/android/hardware/SyncFence.java
@@ -17,12 +17,17 @@
package android.hardware;
import android.annotation.NonNull;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLSync;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
-import java.io.Closeable;
+import libcore.util.NativeAllocationRegistry;
+
+import java.io.FileDescriptor;
import java.io.IOException;
+import java.time.Duration;
/**
* A SyncFence represents a synchronization primitive which signals when hardware buffers have
@@ -34,19 +39,57 @@
* Once the fence signals, then the backing storage for the framebuffer may be safely read from,
* such as for display or for media encoding.</p>
*
- * @see <a href="https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateFence.html">
- * VkFence</a>
+ * @see android.opengl.EGLExt#eglDupNativeFenceFDANDROID(EGLDisplay, EGLSync)
+ * @see android.media.Image#getFence()
*/
-public final class SyncFence implements Closeable, Parcelable {
- private static final String TAG = "SyncFence";
+public final class SyncFence implements AutoCloseable, Parcelable {
/**
- * Wrapped {@link android.os.ParcelFileDescriptor}.
+ * An invalid signal time. Represents either the signal time for a SyncFence that isn't valid
+ * (that is, {@link #isValid()} is false), or if an error occurred while attempting to retrieve
+ * the signal time.
*/
- private ParcelFileDescriptor mWrapped;
+ public static final long SIGNAL_TIME_INVALID = -1;
+
+ /**
+ * A pending signal time. This is equivalent to the max value of a long, representing an
+ * infinitely far point in the future.
+ */
+ public static final long SIGNAL_TIME_PENDING = Long.MAX_VALUE;
+
+ private static final NativeAllocationRegistry sRegistry =
+ NativeAllocationRegistry.createNonmalloced(SyncFence.class.getClassLoader(),
+ nGetDestructor(), 4);
+
+ private long mNativePtr;
+
+ // The destructor for this object
+ // This is also used as our internal lock object. Although SyncFence doesn't claim to be
+ // thread-safe, the cost of doing so to avoid issues around double-close or similar issues
+ // is well worth making.
+ private final Runnable mCloser;
private SyncFence(@NonNull ParcelFileDescriptor wrapped) {
- mWrapped = wrapped;
+ mNativePtr = nCreate(wrapped.detachFd());
+ mCloser = sRegistry.registerNativeAllocation(this, mNativePtr);
+ }
+
+ private SyncFence(@NonNull Parcel parcel) {
+ boolean valid = parcel.readBoolean();
+ FileDescriptor fileDescriptor = null;
+ if (valid) {
+ fileDescriptor = parcel.readRawFileDescriptor();
+ }
+ if (fileDescriptor != null) {
+ mNativePtr = nCreate(fileDescriptor.getInt$());
+ mCloser = sRegistry.registerNativeAllocation(this, mNativePtr);
+ } else {
+ mCloser = () -> {};
+ }
+ }
+
+ private SyncFence() {
+ mCloser = () -> {};
}
/***
@@ -56,7 +99,7 @@
* @hide
*/
public static @NonNull SyncFence createEmpty() {
- return new SyncFence(ParcelFileDescriptor.adoptFd(-1));
+ return new SyncFence();
}
/**
@@ -75,7 +118,13 @@
* @hide
*/
public @NonNull ParcelFileDescriptor getFdDup() throws IOException {
- return mWrapped.dup();
+ synchronized (mCloser) {
+ final int fd = mNativePtr != 0 ? nGetFd(mNativePtr) : -1;
+ if (fd == -1) {
+ throw new IllegalStateException("Cannot dup the FD of an invalid SyncFence");
+ }
+ return ParcelFileDescriptor.fromFd(fd);
+ }
}
/**
@@ -85,29 +134,94 @@
* {@code false} otherwise.
*/
public boolean isValid() {
- return mWrapped.getFileDescriptor().valid();
+ synchronized (mCloser) {
+ return mNativePtr != 0 && nIsValid(mNativePtr);
+ }
+ }
+
+ /**
+ * Waits for a SyncFence to signal for up to the timeout duration.
+ *
+ * An invalid SyncFence, that is if {@link #isValid()} is false, is treated equivalently
+ * to a SyncFence that has already signaled. That is, wait() will immediately return true.
+ *
+ * @param timeout The timeout duration. If the duration is negative, then this waits forever.
+ * @return true if the fence signaled or isn't valid, false otherwise.
+ */
+ public boolean await(@NonNull Duration timeout) {
+ final long timeoutNanos;
+ if (timeout.isNegative()) {
+ timeoutNanos = -1;
+ } else {
+ timeoutNanos = timeout.toNanos();
+ }
+ return await(timeoutNanos);
+ }
+
+ /**
+ * Waits forever for a SyncFence to signal.
+ *
+ * An invalid SyncFence, that is if {@link #isValid()} is false, is treated equivalently
+ * to a SyncFence that has already signaled. That is, wait() will immediately return true.
+ *
+ * @return true if the fence signaled or isn't valid, false otherwise.
+ */
+ public boolean awaitForever() {
+ return await(-1);
+ }
+
+ private boolean await(long timeoutNanos) {
+ synchronized (mCloser) {
+ return mNativePtr != 0 && nWait(mNativePtr, timeoutNanos);
+ }
+ }
+
+ /**
+ * Returns the time that the fence signaled in the CLOCK_MONOTONIC time domain.
+ *
+ * If the fence isn't valid, that is if {@link #isValid()} is false, then this returns
+ * {@link #SIGNAL_TIME_INVALID}. Similarly, if an error occurs while trying to access the
+ * signal time, then {@link #SIGNAL_TIME_INVALID} is also returned.
+ *
+ * If the fence hasn't yet signaled, then {@link #SIGNAL_TIME_PENDING} is returned.
+ *
+ * @return The time the fence signaled, {@link #SIGNAL_TIME_INVALID} if there's an error,
+ * or {@link #SIGNAL_TIME_PENDING} if the fence hasn't signaled yet.
+ */
+ public long getSignalTime() {
+ synchronized (mCloser) {
+ return mNativePtr != 0 ? nGetSignalTime(mNativePtr) : SIGNAL_TIME_INVALID;
+ }
}
/**
* Close the SyncFence. This implementation closes the underlying OS resources allocated
* this stream.
- *
- * @throws IOException If an error occurs attempting to close this SyncFence.
*/
@Override
- public void close() throws IOException {
- if (mWrapped != null) {
- try {
- mWrapped.close();
- } finally {
- // success
+ public void close() {
+ synchronized (mCloser) {
+ if (mNativePtr == 0) {
+ return;
}
+ mNativePtr = 0;
+ mCloser.run();
}
}
@Override
public int describeContents() {
- return mWrapped.describeContents();
+ return CONTENTS_FILE_DESCRIPTOR;
+ }
+
+ /** @hide */
+ public Object getLock() {
+ return mCloser;
+ }
+
+ /** @hide */
+ public long getNativeFence() {
+ return mNativePtr;
}
/**
@@ -119,23 +233,36 @@
*/
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
- try {
- mWrapped.writeToParcel(out, flags);
- } finally {
- // success
+ synchronized (mCloser) {
+ final int fd = mNativePtr != 0 ? nGetFd(mNativePtr) : -1;
+ if (fd == -1) {
+ out.writeBoolean(false);
+ } else {
+ out.writeBoolean(true);
+ FileDescriptor temp = new FileDescriptor();
+ temp.setInt$(fd);
+ out.writeFileDescriptor(temp);
+ }
}
}
public static final @NonNull Parcelable.Creator<SyncFence> CREATOR =
new Parcelable.Creator<SyncFence>() {
- @Override
- public SyncFence createFromParcel(Parcel in) {
- return new SyncFence(ParcelFileDescriptor.CREATOR.createFromParcel(in));
- }
+ @Override
+ public SyncFence createFromParcel(Parcel in) {
+ return new SyncFence(in);
+ }
- @Override
- public SyncFence[] newArray(int size) {
- return new SyncFence[size];
- }
- };
+ @Override
+ public SyncFence[] newArray(int size) {
+ return new SyncFence[size];
+ }
+ };
+
+ private static native long nGetDestructor();
+ private static native long nCreate(int fd);
+ private static native boolean nIsValid(long nPtr);
+ private static native int nGetFd(long nPtr);
+ private static native boolean nWait(long nPtr, long timeout);
+ private static native long nGetSignalTime(long nPtr);
}
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java
index 32a5ee7..18d86d6 100644
--- a/core/java/android/hardware/SystemSensorManager.java
+++ b/core/java/android/hardware/SystemSensorManager.java
@@ -881,13 +881,13 @@
mListener.onAccuracyChanged(t.sensor, t.accuracy);
}
- // call onSensorDiscontinuity() if the discontinuity counter changed
- if (t.sensor.getType() == Sensor.TYPE_HEAD_TRACKER
- && mListener instanceof SensorEventCallback) {
+ // Indicate if the discontinuity count changed
+ if (t.sensor.getType() == Sensor.TYPE_HEAD_TRACKER) {
final int lastCount = mSensorDiscontinuityCounts.get(handle);
final int curCount = Float.floatToIntBits(values[6]);
if (lastCount >= 0 && lastCount != curCount) {
- ((SensorEventCallback) mListener).onSensorDiscontinuity(t.sensor);
+ mSensorDiscontinuityCounts.put(handle, curCount);
+ t.firstEventAfterDiscontinuity = true;
}
}
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 971b61b..c053c92 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -356,7 +356,6 @@
* @see #VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS
* @hide
*/
- @TestApi
@SystemApi
public static final int VIRTUAL_DISPLAY_FLAG_TRUSTED = 1 << 10;
diff --git a/core/java/android/hardware/usb/UsbPort.java b/core/java/android/hardware/usb/UsbPort.java
index a979725..7b695e7 100644
--- a/core/java/android/hardware/usb/UsbPort.java
+++ b/core/java/android/hardware/usb/UsbPort.java
@@ -39,13 +39,13 @@
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_NONE;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SOURCE;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_UNKNOWN;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_ENABLED;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_OVERHEAT;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_CONTAMINANT;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_DOCK;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_FORCE;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_DEBUG;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_UNKNOWN;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_ENABLED;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_OVERHEAT;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_CONTAMINANT;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_DOCK;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_FORCE;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_DEBUG;
import android.Manifest;
import android.annotation.CheckResult;
@@ -400,7 +400,7 @@
}
/**
- * Enables Usb data when disabled due to {@link UsbPort#USB_DATA_STATUS_DISABLED_DOCK}
+ * Enables Usb data when disabled due to {@link UsbPort#DATA_STATUS_DISABLED_DOCK}
*
* @return {@link #ENABLE_USB_DATA_WHILE_DOCKED_SUCCESS} when request completes successfully or
* {@link #ENABLE_USB_DATA_WHILE_DOCKED_ERROR_INTERNAL} when request fails due to
@@ -421,7 +421,8 @@
+ " callingUid:" + Binder.getCallingUid());
UsbPortStatus portStatus = getStatus();
if (portStatus != null &&
- !usbDataStatusToString(portStatus.getUsbDataStatus()).contains("disabled-dock")) {
+ (portStatus.getUsbDataStatus() & DATA_STATUS_DISABLED_DOCK) !=
+ DATA_STATUS_DISABLED_DOCK) {
return ENABLE_USB_DATA_WHILE_DOCKED_ERROR_DATA_ENABLED;
}
@@ -584,44 +585,43 @@
/** @hide */
public static String usbDataStatusToString(int usbDataStatus) {
- switch (usbDataStatus) {
- case USB_DATA_STATUS_UNKNOWN:
- return "unknown";
- case USB_DATA_STATUS_ENABLED:
- return "enabled";
- case USB_DATA_STATUS_DISABLED_OVERHEAT:
- return "disabled-overheat";
- case USB_DATA_STATUS_DISABLED_CONTAMINANT:
- return "disabled-contaminant";
- case USB_DATA_STATUS_DISABLED_DOCK:
- return "disabled-dock";
- case USB_DATA_STATUS_DISABLED_FORCE:
- return "disabled-force";
- case USB_DATA_STATUS_DISABLED_DEBUG:
- return "disabled-debug";
- default:
- return Integer.toString(usbDataStatus);
- }
- }
+ StringBuilder statusString = new StringBuilder();
- /** @hide */
- public static String usbDataStatusToString(int[] usbDataStatus) {
- StringBuilder modeString = new StringBuilder();
- if (usbDataStatus == null) {
+ if (usbDataStatus == DATA_STATUS_UNKNOWN) {
return "unknown";
}
- for (int i = 0; i < usbDataStatus.length; i++) {
- modeString.append(usbDataStatusToString(usbDataStatus[i]));
- if (i < usbDataStatus.length - 1) {
- modeString.append(", ");
- }
+
+ if ((usbDataStatus & DATA_STATUS_ENABLED) == DATA_STATUS_ENABLED) {
+ return "enabled";
}
- return modeString.toString();
+
+ if ((usbDataStatus & DATA_STATUS_DISABLED_OVERHEAT) == DATA_STATUS_DISABLED_OVERHEAT) {
+ statusString.append("disabled-overheat, ");
+ }
+
+ if ((usbDataStatus & DATA_STATUS_DISABLED_CONTAMINANT)
+ == DATA_STATUS_DISABLED_CONTAMINANT) {
+ statusString.append("disabled-contaminant, ");
+ }
+
+ if ((usbDataStatus & DATA_STATUS_DISABLED_DOCK) == DATA_STATUS_DISABLED_DOCK) {
+ statusString.append("disabled-dock, ");
+ }
+
+ if ((usbDataStatus & DATA_STATUS_DISABLED_FORCE) == DATA_STATUS_DISABLED_FORCE) {
+ statusString.append("disabled-force, ");
+ }
+
+ if ((usbDataStatus & DATA_STATUS_DISABLED_DEBUG) == DATA_STATUS_DISABLED_DEBUG) {
+ statusString.append("disabled-debug, ");
+ }
+
+ return statusString.toString().replaceAll(", $", "");
}
/** @hide */
- public static String powerBrickStatusToString(int powerBrickStatus) {
- switch (powerBrickStatus) {
+ public static String powerBrickConnectionStatusToString(int powerBrickConnectionStatus) {
+ switch (powerBrickConnectionStatus) {
case POWER_BRICK_STATUS_UNKNOWN:
return "unknown";
case POWER_BRICK_STATUS_CONNECTED:
@@ -629,7 +629,7 @@
case POWER_BRICK_STATUS_DISCONNECTED:
return "disconnected";
default:
- return Integer.toString(powerBrickStatus);
+ return Integer.toString(powerBrickConnectionStatus);
}
}
diff --git a/core/java/android/hardware/usb/UsbPortStatus.java b/core/java/android/hardware/usb/UsbPortStatus.java
index d1f4246..3221ec8 100644
--- a/core/java/android/hardware/usb/UsbPortStatus.java
+++ b/core/java/android/hardware/usb/UsbPortStatus.java
@@ -44,8 +44,8 @@
private final @ContaminantProtectionStatus int mContaminantProtectionStatus;
private final @ContaminantDetectionStatus int mContaminantDetectionStatus;
private final boolean mPowerTransferLimited;
- private final @UsbDataStatus int[] mUsbDataStatus;
- private final @PowerBrickStatus int mPowerBrickStatus;
+ private final @UsbDataStatus int mUsbDataStatus;
+ private final @PowerBrickConnectionStatus int mPowerBrickConnectionStatus;
/**
* Power role: This USB port does not have a power role.
@@ -198,38 +198,38 @@
/**
* USB data status is not known.
*/
- public static final int USB_DATA_STATUS_UNKNOWN = 0;
+ public static final int DATA_STATUS_UNKNOWN = 0;
/**
* USB data is enabled.
*/
- public static final int USB_DATA_STATUS_ENABLED = 1;
+ public static final int DATA_STATUS_ENABLED = 1 << 0;
/**
* USB data is disabled as the port is too hot.
*/
- public static final int USB_DATA_STATUS_DISABLED_OVERHEAT = 2;
+ public static final int DATA_STATUS_DISABLED_OVERHEAT = 1 << 1;
/**
* USB data is disabled due to contaminated port.
*/
- public static final int USB_DATA_STATUS_DISABLED_CONTAMINANT = 3;
+ public static final int DATA_STATUS_DISABLED_CONTAMINANT = 1 << 2;
/**
* USB data is disabled due to docking event.
*/
- public static final int USB_DATA_STATUS_DISABLED_DOCK = 4;
+ public static final int DATA_STATUS_DISABLED_DOCK = 1 << 3;
/**
* USB data is disabled by
* {@link UsbPort#enableUsbData UsbPort.enableUsbData}.
*/
- public static final int USB_DATA_STATUS_DISABLED_FORCE = 5;
+ public static final int DATA_STATUS_DISABLED_FORCE = 1 << 4;
/**
* USB data is disabled for debug.
*/
- public static final int USB_DATA_STATUS_DISABLED_DEBUG = 6;
+ public static final int DATA_STATUS_DISABLED_DEBUG = 1 << 5;
/**
* Unknown whether a power brick is connected.
@@ -276,14 +276,14 @@
@interface UsbPortMode{}
/** @hide */
- @IntDef(prefix = { "USB_DATA_STATUS_" }, value = {
- USB_DATA_STATUS_UNKNOWN,
- USB_DATA_STATUS_ENABLED,
- USB_DATA_STATUS_DISABLED_OVERHEAT,
- USB_DATA_STATUS_DISABLED_CONTAMINANT,
- USB_DATA_STATUS_DISABLED_DOCK,
- USB_DATA_STATUS_DISABLED_FORCE,
- USB_DATA_STATUS_DISABLED_DEBUG
+ @IntDef(prefix = { "DATA_STATUS_" }, flag = true, value = {
+ DATA_STATUS_UNKNOWN,
+ DATA_STATUS_ENABLED,
+ DATA_STATUS_DISABLED_OVERHEAT,
+ DATA_STATUS_DISABLED_CONTAMINANT,
+ DATA_STATUS_DISABLED_DOCK,
+ DATA_STATUS_DISABLED_FORCE,
+ DATA_STATUS_DISABLED_DEBUG
})
@Retention(RetentionPolicy.SOURCE)
@interface UsbDataStatus{}
@@ -295,13 +295,14 @@
POWER_BRICK_STATUS_CONNECTED,
})
@Retention(RetentionPolicy.SOURCE)
- @interface PowerBrickStatus{}
+ @interface PowerBrickConnectionStatus{}
/** @hide */
public UsbPortStatus(int currentMode, int currentPowerRole, int currentDataRole,
int supportedRoleCombinations, int contaminantProtectionStatus,
- int contaminantDetectionStatus, @UsbDataStatus int[] usbDataStatus,
- boolean powerTransferLimited, @PowerBrickStatus int powerBrickStatus) {
+ int contaminantDetectionStatus, @UsbDataStatus int usbDataStatus,
+ boolean powerTransferLimited,
+ @PowerBrickConnectionStatus int powerBrickConnectionStatus) {
mCurrentMode = currentMode;
mCurrentPowerRole = currentPowerRole;
mCurrentDataRole = currentDataRole;
@@ -310,7 +311,7 @@
mContaminantDetectionStatus = contaminantDetectionStatus;
mUsbDataStatus = usbDataStatus;
mPowerTransferLimited = powerTransferLimited;
- mPowerBrickStatus = powerBrickStatus;
+ mPowerBrickConnectionStatus = powerBrickConnectionStatus;
}
/** @hide */
@@ -323,8 +324,8 @@
mSupportedRoleCombinations = supportedRoleCombinations;
mContaminantProtectionStatus = contaminantProtectionStatus;
mContaminantDetectionStatus = contaminantDetectionStatus;
- mUsbDataStatus = new int[]{USB_DATA_STATUS_UNKNOWN};
- mPowerBrickStatus = POWER_BRICK_STATUS_UNKNOWN;
+ mUsbDataStatus = DATA_STATUS_UNKNOWN;
+ mPowerBrickConnectionStatus = POWER_BRICK_STATUS_UNKNOWN;
mPowerTransferLimited = false;
}
@@ -411,13 +412,13 @@
/**
* Returns UsbData status.
*
- * @return Current USB data status of the port: {@link #USB_DATA_STATUS_UNKNOWN}
- * or {@link #USB_DATA_STATUS_ENABLED} or {@link #USB_DATA_STATUS_DIASBLED_OVERHEAT}
- * or {@link #USB_DATA_STATUS_DISABLED_CONTAMINANT}
- * or {@link #USB_DATA_STATUS_DISABLED_DOCK} or {@link #USB_DATA_STATUS_DISABLED_FORCE}
- * or {@link #USB_DATA_STATUS_DISABLED_DEBUG}
+ * @return Current USB data status of the port with one or more of the following values
+ * {@link #DATA_STATUS_UNKNOWN}, {@link #DATA_STATUS_ENABLED},
+ * {@link #DATA_STATUS_DISABLED_OVERHEAT}, {@link #DATA_STATUS_DISABLED_CONTAMINANT},
+ * {@link #DATA_STATUS_DISABLED_DOCK}, {@link #DATA_STATUS_DISABLED_FORCE},
+ * {@link #DATA_STATUS_DISABLED_DEBUG}
*/
- public @UsbDataStatus @Nullable int[] getUsbDataStatus() {
+ public @UsbDataStatus int getUsbDataStatus() {
return mUsbDataStatus;
}
@@ -432,14 +433,14 @@
}
/**
- * Let's the caller know if a power brick is connected to the USB port.
+ * Returns the connection status of the power brick.
*
* @return {@link #POWER_BRICK_STATUS_UNKNOWN}
* or {@link #POWER_BRICK_STATUS_CONNECTED}
* or {@link #POWER_BRICK_STATUS_DISCONNECTED}
*/
- public @PowerBrickStatus int getPowerBrickStatus() {
- return mPowerBrickStatus;
+ public @PowerBrickConnectionStatus int getPowerBrickConnectionStatus() {
+ return mPowerBrickConnectionStatus;
}
@NonNull
@@ -459,8 +460,9 @@
+ UsbPort.usbDataStatusToString(getUsbDataStatus())
+ ", isPowerTransferLimited="
+ isPowerTransferLimited()
- +", powerBrickStatus="
- + UsbPort.powerBrickStatusToString(getPowerBrickStatus())
+ +", powerBrickConnectionStatus="
+ + UsbPort
+ .powerBrickConnectionStatusToString(getPowerBrickConnectionStatus())
+ "}";
}
@@ -477,10 +479,9 @@
dest.writeInt(mSupportedRoleCombinations);
dest.writeInt(mContaminantProtectionStatus);
dest.writeInt(mContaminantDetectionStatus);
- dest.writeInt(mUsbDataStatus.length);
- dest.writeIntArray(mUsbDataStatus);
+ dest.writeInt(mUsbDataStatus);
dest.writeBoolean(mPowerTransferLimited);
- dest.writeInt(mPowerBrickStatus);
+ dest.writeInt(mPowerBrickConnectionStatus);
}
public static final @NonNull Parcelable.Creator<UsbPortStatus> CREATOR =
@@ -493,14 +494,13 @@
int supportedRoleCombinations = in.readInt();
int contaminantProtectionStatus = in.readInt();
int contaminantDetectionStatus = in.readInt();
- int[] usbDataStatus = new int[in.readInt()];
- in.readIntArray(usbDataStatus);
+ int usbDataStatus = in.readInt();
boolean powerTransferLimited = in.readBoolean();
- int powerBrickStatus = in.readInt();
+ int powerBrickConnectionStatus = in.readInt();
return new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus, powerTransferLimited,
- powerBrickStatus);
+ powerBrickConnectionStatus);
}
@Override
@@ -508,4 +508,126 @@
return new UsbPortStatus[size];
}
};
+
+ /**
+ * Builder is used to create {@link UsbPortStatus} objects.
+ *
+ * @hide
+ */
+ public static final class Builder {
+ private @UsbPortMode int mCurrentMode;
+ private @UsbPowerRole int mCurrentPowerRole;
+ private @UsbDataRole int mCurrentDataRole;
+ private int mSupportedRoleCombinations;
+ private @ContaminantProtectionStatus int mContaminantProtectionStatus;
+ private @ContaminantDetectionStatus int mContaminantDetectionStatus;
+ private boolean mPowerTransferLimited;
+ private @UsbDataStatus int mUsbDataStatus;
+ private @PowerBrickConnectionStatus int mPowerBrickConnectionStatus;
+
+ public Builder() {
+ mCurrentMode = MODE_NONE;
+ mCurrentPowerRole = POWER_ROLE_NONE;
+ mCurrentDataRole = DATA_ROLE_NONE;
+ mContaminantProtectionStatus = CONTAMINANT_PROTECTION_NONE;
+ mContaminantDetectionStatus = CONTAMINANT_DETECTION_NOT_SUPPORTED;
+ mUsbDataStatus = DATA_STATUS_UNKNOWN;
+ mPowerBrickConnectionStatus = POWER_BRICK_STATUS_UNKNOWN;
+ }
+
+ /**
+ * Sets the current mode of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setCurrentMode(@UsbPortMode int currentMode) {
+ mCurrentMode = currentMode;
+ return this;
+ }
+
+ /**
+ * Sets the current power role and data role of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setCurrentRoles(@UsbPowerRole int currentPowerRole,
+ @UsbDataRole int currentDataRole) {
+ mCurrentPowerRole = currentPowerRole;
+ mCurrentDataRole = currentDataRole;
+ return this;
+ }
+
+ /**
+ * Sets supported role combinations of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setSupportedRoleCombinations(int supportedRoleCombinations) {
+ mSupportedRoleCombinations = supportedRoleCombinations;
+ return this;
+ }
+
+ /**
+ * Sets current contaminant status of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setContaminantStatus(
+ @ContaminantProtectionStatus int contaminantProtectionStatus,
+ @ContaminantDetectionStatus int contaminantDetectionStatus) {
+ mContaminantProtectionStatus = contaminantProtectionStatus;
+ mContaminantDetectionStatus = contaminantDetectionStatus;
+ return this;
+ }
+
+ /**
+ * Sets power limit power transfer of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setPowerTransferLimited(boolean powerTransferLimited) {
+ mPowerTransferLimited = powerTransferLimited;
+ return this;
+ }
+
+ /**
+ * Sets the USB data status of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setUsbDataStatus(@UsbDataStatus int usbDataStatus) {
+ mUsbDataStatus = usbDataStatus;
+ return this;
+ }
+
+ /**
+ * Sets the power brick connection status of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setPowerBrickConnectionStatus(
+ @PowerBrickConnectionStatus int powerBrickConnectionStatus) {
+ mPowerBrickConnectionStatus = powerBrickConnectionStatus;
+ return this;
+ }
+
+ /**
+ * Creates the {@link UsbPortStatus} object.
+ */
+ @NonNull
+ public UsbPortStatus build() {
+ UsbPortStatus status = new UsbPortStatus(mCurrentMode, mCurrentPowerRole,
+ mCurrentDataRole, mSupportedRoleCombinations, mContaminantProtectionStatus,
+ mContaminantDetectionStatus, mUsbDataStatus, mPowerTransferLimited,
+ mPowerBrickConnectionStatus);
+ return status;
+ }
+ };
}
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index adf2759..c3e3180 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -346,7 +346,7 @@
*/
@AnyThread
public static boolean canImeRenderGesturalNavButtons() {
- return SystemProperties.getBoolean(PROP_CAN_RENDER_GESTURAL_NAV_BUTTONS, true);
+ return SystemProperties.getBoolean(PROP_CAN_RENDER_GESTURAL_NAV_BUTTONS, false);
}
/**
@@ -989,24 +989,6 @@
public void changeInputMethodSubtype(InputMethodSubtype subtype) {
dispatchOnCurrentInputMethodSubtypeChanged(subtype);
}
-
- /**
- * {@inheritDoc}
- * @hide
- */
- @Override
- public void setCurrentShowInputToken(IBinder showInputToken) {
- mCurShowInputToken = showInputToken;
- }
-
- /**
- * {@inheritDoc}
- * @hide
- */
- @Override
- public void setCurrentHideInputToken(IBinder hideInputToken) {
- mCurHideInputToken = hideInputToken;
- }
}
/**
diff --git a/core/java/android/inputmethodservice/NavigationBarController.java b/core/java/android/inputmethodservice/NavigationBarController.java
index 6f4fd76..19fa01d 100644
--- a/core/java/android/inputmethodservice/NavigationBarController.java
+++ b/core/java/android/inputmethodservice/NavigationBarController.java
@@ -45,7 +45,6 @@
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController.Appearance;
-import android.view.WindowManagerPolicyConstants;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
import android.widget.FrameLayout;
@@ -138,7 +137,7 @@
private boolean mDestroyed = false;
- private boolean mRenderGesturalNavButtons;
+ private boolean mImeDrawsImeNavBar;
@Nullable
private NavigationBarFrame mNavigationBarFrame;
@@ -185,7 +184,7 @@
}
private void installNavigationBarFrameIfNecessary() {
- if (!mRenderGesturalNavButtons) {
+ if (!mImeDrawsImeNavBar) {
return;
}
if (mNavigationBarFrame != null) {
@@ -253,7 +252,7 @@
@Override
public void updateTouchableInsets(@NonNull InputMethodService.Insets originalInsets,
@NonNull ViewTreeObserver.InternalInsetsInfo dest) {
- if (!mRenderGesturalNavButtons || mNavigationBarFrame == null
+ if (!mImeDrawsImeNavBar || mNavigationBarFrame == null
|| mService.isExtractViewShown()) {
return;
}
@@ -360,13 +359,12 @@
});
}
- private boolean isGesturalNavigationEnabled() {
+ private boolean imeDrawsImeNavBar() {
final Resources resources = mService.getResources();
if (resources == null) {
return false;
}
- return resources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)
- == WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
+ return resources.getBoolean(com.android.internal.R.bool.config_imeDrawsImeNavBar);
}
@Override
@@ -381,7 +379,7 @@
if (mDestroyed) {
return;
}
- mRenderGesturalNavButtons = isGesturalNavigationEnabled();
+ mImeDrawsImeNavBar = imeDrawsImeNavBar();
if (mSystemOverlayChangedReceiver == null) {
final IntentFilter intentFilter = new IntentFilter(ACTION_OVERLAY_CHANGED);
intentFilter.addDataScheme(IntentFilter.SCHEME_PACKAGE);
@@ -392,8 +390,8 @@
if (mDestroyed) {
return;
}
- mRenderGesturalNavButtons = isGesturalNavigationEnabled();
- if (mRenderGesturalNavButtons) {
+ mImeDrawsImeNavBar = imeDrawsImeNavBar();
+ if (mImeDrawsImeNavBar) {
installNavigationBarFrameIfNecessary();
} else {
uninstallNavigationBarFrameIfNecessary();
@@ -423,7 +421,7 @@
@Override
public void onWindowShown() {
- if (mDestroyed || !mRenderGesturalNavButtons || mNavigationBarFrame == null) {
+ if (mDestroyed || !mImeDrawsImeNavBar || mNavigationBarFrame == null) {
return;
}
final Insets systemInsets = getSystemInsets();
@@ -546,7 +544,7 @@
@Override
public String toDebugString() {
- return "{mRenderGesturalNavButtons=" + mRenderGesturalNavButtons
+ return "{mImeDrawsImeNavBar=" + mImeDrawsImeNavBar
+ " mNavigationBarFrame=" + mNavigationBarFrame
+ " mShouldShowImeSwitcherWhenImeIsShown="
+ mShouldShowImeSwitcherWhenImeIsShown
diff --git a/core/java/android/media/NearbyMediaDevicesProvider.java b/core/java/android/media/NearbyMediaDevicesProvider.java
new file mode 100644
index 0000000..7cc799b
--- /dev/null
+++ b/core/java/android/media/NearbyMediaDevicesProvider.java
@@ -0,0 +1,55 @@
+/*
+ * 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 android.media;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.app.StatusBarManager;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * An interface that provides information about nearby devices that are able to play media.
+ * <p>
+ * External clients can implement this interface and pass it to the system via
+ * {@link StatusBarManager#registerNearbyMediaDevicesProvider} to inform the system of nearby media
+ * devices.
+ * <p>
+ * @hide
+ */
+@SystemApi
+public interface NearbyMediaDevicesProvider {
+ /**
+ * Registers a callback that should be notified each time nearby media device(s) change.
+ * <p>
+ * When a callback is newly registered, it should be immediately notified of the current nearby
+ * media devices. Afterwards, the list of devices passed to the callback should always contain
+ * the full set of nearby media devices any time you get an update. If a device is no longer
+ * valid (went offline, e.g.) then it should be omitted from the list in the next update.
+ * <p>
+ * @param callback the callback that will consume updates to the nearby media devices.
+ */
+ void registerNearbyDevicesCallback(@NonNull Consumer<List<NearbyDevice>> callback);
+
+ /**
+ * Unregisters a callback. @see #registerNearbyDevicesCallback.
+ * <p>
+ * @param callback the callback to unregister.
+ */
+ void unregisterNearbyDevicesCallback(@NonNull Consumer<List<NearbyDevice>> callback);
+}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 1d39089..1d1f17d 100755
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -412,7 +412,7 @@
*/
@SystemApi
@NonNull public static final Set<String> KNOWN_CODENAMES =
- new ArraySet<>(new String[]{"Q", "R", "S", "Sv2", "Tiramisu"});
+ new ArraySet<>(getStringList("ro.build.version.known_codenames", ","));
private static final String[] ALL_CODENAMES
= getStringList("ro.build.version.all_codenames", ",");
diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java
index b9252d6..7379443 100644
--- a/core/java/android/os/SystemClock.java
+++ b/core/java/android/os/SystemClock.java
@@ -104,6 +104,8 @@
public final class SystemClock {
private static final String TAG = "SystemClock";
+ private static volatile IAlarmManager sIAlarmManager;
+
/**
* This class is uninstantiable.
*/
@@ -151,8 +153,7 @@
* @return if the clock was successfully set to the specified time.
*/
public static boolean setCurrentTimeMillis(long millis) {
- final IAlarmManager mgr = IAlarmManager.Stub
- .asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
+ final IAlarmManager mgr = getIAlarmManager();
if (mgr == null) {
Slog.e(TAG, "Unable to set RTC: mgr == null");
return false;
@@ -280,8 +281,7 @@
* @hide
*/
public static long currentNetworkTimeMillis() {
- final IAlarmManager mgr = IAlarmManager.Stub
- .asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
+ final IAlarmManager mgr = getIAlarmManager();
if (mgr != null) {
try {
return mgr.currentNetworkTimeMillis();
@@ -296,6 +296,14 @@
}
}
+ private static IAlarmManager getIAlarmManager() {
+ if (sIAlarmManager == null) {
+ sIAlarmManager = IAlarmManager.Stub
+ .asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
+ }
+ return sIAlarmManager;
+ }
+
/**
* Returns a {@link Clock} that starts at January 1, 1970 00:00:00.0 UTC,
* synchronized using a remote network source outside the device.
diff --git a/core/java/android/os/VibrationAttributes.java b/core/java/android/os/VibrationAttributes.java
index d223a19..642c618 100644
--- a/core/java/android/os/VibrationAttributes.java
+++ b/core/java/android/os/VibrationAttributes.java
@@ -27,7 +27,7 @@
import java.util.Objects;
/**
- * A class to encapsulate a collection of attributes describing information about a vibration
+ * Encapsulates a collection of attributes describing information about a vibration.
*/
public final class VibrationAttributes implements Parcelable {
private static final String TAG = "VibrationAttributes";
@@ -174,7 +174,7 @@
FLAG_BYPASS_INTERRUPTION_POLICY | FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF;
/** Creates a new {@link VibrationAttributes} instance with given usage. */
- public static @NonNull VibrationAttributes createForUsage(int usage) {
+ public static @NonNull VibrationAttributes createForUsage(@Usage int usage) {
return new VibrationAttributes.Builder().setUsage(usage).build();
}
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index 21c6487..237f6ed 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -48,7 +48,7 @@
/**
* A VibrationEffect describes a haptic effect to be performed by a {@link Vibrator}.
*
- * These effects may be any number of things, from single shot vibrations to complex waveforms.
+ * <p>These effects may be any number of things, from single shot vibrations to complex waveforms.
*/
public abstract class VibrationEffect implements Parcelable {
// Stevens' coefficient to scale the perceived vibration intensity.
@@ -110,7 +110,7 @@
/**
* A texture effect meant to replicate soft ticks.
*
- * Unlike normal effects, texture effects are meant to be called repeatedly, generally in
+ * <p>Unlike normal effects, texture effects are meant to be called repeatedly, generally in
* response to some motion, in order to replicate the feeling of some texture underneath the
* user's fingers.
*
@@ -175,7 +175,7 @@
/**
* Create a one shot vibration.
*
- * One shot vibrations will vibrate constantly for the specified period of time at the
+ * <p>One shot vibrations will vibrate constantly for the specified period of time at the
* specified amplitude, and then stop.
*
* @param milliseconds The number of milliseconds to vibrate. This must be a positive number.
@@ -269,13 +269,13 @@
/**
* Create a predefined vibration effect.
*
- * Predefined effects are a set of common vibration effects that should be identical, regardless
- * of the app they come from, in order to provide a cohesive experience for users across
- * the entire device. They also may be custom tailored to the device hardware in order to
+ * <p>Predefined effects are a set of common vibration effects that should be identical,
+ * regardless of the app they come from, in order to provide a cohesive experience for users
+ * across the entire device. They also may be custom tailored to the device hardware in order to
* provide a better experience than you could otherwise build using the generic building
* blocks.
*
- * This will fallback to a generic pattern if one exists and there does not exist a
+ * <p>This will fallback to a generic pattern if one exists and there does not exist a
* hardware-specific implementation of the effect.
*
* @param effectId The ID of the effect to perform:
@@ -291,13 +291,13 @@
/**
* Get a predefined vibration effect.
*
- * Predefined effects are a set of common vibration effects that should be identical, regardless
- * of the app they come from, in order to provide a cohesive experience for users across
- * the entire device. They also may be custom tailored to the device hardware in order to
+ * <p>Predefined effects are a set of common vibration effects that should be identical,
+ * regardless of the app they come from, in order to provide a cohesive experience for users
+ * across the entire device. They also may be custom tailored to the device hardware in order to
* provide a better experience than you could otherwise build using the generic building
* blocks.
*
- * This will fallback to a generic pattern if one exists and there does not exist a
+ * <p>This will fallback to a generic pattern if one exists and there does not exist a
* hardware-specific implementation of the effect.
*
* @param effectId The ID of the effect to perform:
@@ -314,16 +314,16 @@
/**
* Get a predefined vibration effect.
*
- * Predefined effects are a set of common vibration effects that should be identical, regardless
- * of the app they come from, in order to provide a cohesive experience for users across
- * the entire device. They also may be custom tailored to the device hardware in order to
+ * <p>Predefined effects are a set of common vibration effects that should be identical,
+ * regardless of the app they come from, in order to provide a cohesive experience for users
+ * across the entire device. They also may be custom tailored to the device hardware in order to
* provide a better experience than you could otherwise build using the generic building
* blocks.
*
- * Some effects you may only want to play if there's a hardware specific implementation because
- * they may, for example, be too disruptive to the user without tuning. The {@code fallback}
- * parameter allows you to decide whether you want to fallback to the generic implementation or
- * only play if there's a tuned, hardware specific one available.
+ * <p>Some effects you may only want to play if there's a hardware specific implementation
+ * because they may, for example, be too disruptive to the user without tuning. The
+ * {@code fallback} parameter allows you to decide whether you want to fallback to the generic
+ * implementation or only play if there's a tuned, hardware specific one available.
*
* @param effectId The ID of the effect to perform:
* {@link #EFFECT_CLICK}, {@link #EFFECT_DOUBLE_CLICK}, {@link #EFFECT_TICK}
@@ -344,9 +344,9 @@
/**
* Get a predefined vibration effect associated with a given URI.
*
- * Predefined effects are a set of common vibration effects that should be identical, regardless
- * of the app they come from, in order to provide a cohesive experience for users across
- * the entire device. They also may be custom tailored to the device hardware in order to
+ * <p>Predefined effects are a set of common vibration effects that should be identical,
+ * regardless of the app they come from, in order to provide a cohesive experience for users
+ * across the entire device. They also may be custom tailored to the device hardware in order to
* provide a better experience than you could otherwise build using the generic building
* blocks.
*
@@ -474,7 +474,7 @@
/**
* Gets the estimated duration of the vibration in milliseconds.
*
- * For effects without a defined end (e.g. a Waveform with a non-negative repeat index), this
+ * <p>For effects without a defined end (e.g. a Waveform with a non-negative repeat index), this
* returns Long.MAX_VALUE. For effects with an unknown duration (e.g. Prebaked effects where
* the length is device and potentially run-time dependent), this returns -1.
*
@@ -817,28 +817,26 @@
* effect that grows in intensity and then dies off, with a longer rising portion for emphasis
* and an extra tick 100ms after:
*
- * <code>
- * VibrationEffect effect = VibrationEffect.startComposition()
+ * <pre>
+ * {@code VibrationEffect effect = VibrationEffect.startComposition()
* .addPrimitive(VibrationEffect.Composition.PRIMITIVE_SLOW_RISE, 0.5f)
* .addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_FALL, 0.5f)
* .addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 1.0f, 100)
- * .compose();
- * </code>
+ * .compose();}</pre>
*
* <p>Composition elements can also be {@link VibrationEffect} instances, including other
* compositions, and off durations, which are periods of time when the vibrator will be
* turned off. Here is an example of a composition that "warms up" with a light tap,
* a stronger double tap, then repeats a vibration pattern indefinitely:
*
- * <code>
- * VibrationEffect repeatingEffect = VibrationEffect.startComposition()
+ * <pre>
+ * {@code VibrationEffect repeatingEffect = VibrationEffect.startComposition()
* .addPrimitive(VibrationEffect.Composition.PRIMITIVE_LOW_TICK)
* .addOffDuration(Duration.ofMillis(10))
* .addEffect(VibrationEffect.createPredefined(VibrationEffect.EFFECT_DOUBLE_CLICK))
* .addOffDuration(Duration.ofMillis(50))
* .addEffect(VibrationEffect.createWaveform(pattern, repeatIndex))
- * .compose();
- * </code>
+ * .compose();}</pre>
*
* <p>When choosing to play a composed effect, you should check that individual components are
* supported by the device by using the appropriate vibrator method:
@@ -932,7 +930,7 @@
/**
* Adds a time duration to the current composition, during which the vibrator will be
- * turned off
+ * turned off.
*
* @param duration The length of time the vibrator should be off. Value must be non-negative
* and will be truncated to milliseconds.
@@ -1004,7 +1002,7 @@
/**
* Add a haptic primitive to the end of the current composition.
*
- * Similar to {@link #addPrimitive(int, float, int)}, but with no delay and a
+ * <p>Similar to {@link #addPrimitive(int, float, int)}, but with no delay and a
* default scale applied.
*
* @param primitiveId The primitive to add
@@ -1021,7 +1019,7 @@
/**
* Add a haptic primitive to the end of the current composition.
*
- * Similar to {@link #addPrimitive(int, float, int)}, but with no delay.
+ * <p>Similar to {@link #addPrimitive(int, float, int)}, but with no delay.
*
* @param primitiveId The primitive to add
* @param scale The scale to apply to the intensity of the primitive.
@@ -1081,9 +1079,9 @@
/**
* Compose all of the added primitives together into a single {@link VibrationEffect}.
*
- * The {@link Composition} object is still valid after this call, so you can continue adding
- * more primitives to it and generating more {@link VibrationEffect}s by calling this method
- * again.
+ * <p>The {@link Composition} object is still valid after this call, so you can continue
+ * adding more primitives to it and generating more {@link VibrationEffect}s by calling this
+ * method again.
*
* @return The {@link VibrationEffect} resulting from the composition of the primitives.
*/
@@ -1099,7 +1097,7 @@
}
/**
- * Convert the primitive ID to a human readable string for debugging
+ * Convert the primitive ID to a human readable string for debugging.
* @param id The ID to convert
* @return The ID in a human readable format.
* @hide
@@ -1139,16 +1137,15 @@
* <p>The following example ramps a vibrator turned off to full amplitude at 120Hz, over 100ms
* starting at 60Hz, then holds that state for 200ms and ramps back down again over 100ms:
*
- * <code>
- * import static android.os.VibrationEffect.VibrationParameter.targetAmplitude;
+ * <pre>
+ * {@code import static android.os.VibrationEffect.VibrationParameter.targetAmplitude;
* import static android.os.VibrationEffect.VibrationParameter.targetFrequency;
*
* VibrationEffect effect = VibrationEffect.startWaveform(targetFrequency(60))
* .addTransition(Duration.ofMillis(100), targetAmplitude(1), targetFrequency(120))
* .addSustain(Duration.ofMillis(200))
* .addTransition(Duration.ofMillis(100), targetAmplitude(0), targetFrequency(60))
- * .build();
- * </code>
+ * .build();}</pre>
*
* <p>The initial state of the waveform can be set via
* {@link VibrationEffect#startWaveform(VibrationParameter)} or
@@ -1169,8 +1166,8 @@
* a {@link VibrationEffect.Composition}. The resulting effect will have a tick followed by a
* repeated beating effect with a rise that stretches out and a sharp finish.
*
- * <code>
- * VibrationEffect patternToBeRepeated = VibrationEffect.startWaveform(targetAmplitude(0.2f))
+ * <pre>
+ * {@code VibrationEffect patternToRepeat = VibrationEffect.startWaveform(targetAmplitude(0.2f))
* .addSustain(Duration.ofMillis(10))
* .addTransition(Duration.ofMillis(20), targetAmplitude(0.4f))
* .addSustain(Duration.ofMillis(30))
@@ -1182,16 +1179,15 @@
* VibrationEffect effect = VibrationEffect.startComposition()
* .addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK)
* .addOffDuration(Duration.ofMillis(20))
- * .repeatEffectIndefinitely(patternToBeRepeated)
- * .compose();
- * </code>
+ * .repeatEffectIndefinitely(patternToRepeat)
+ * .compose();}</pre>
*
* <p>The amplitude step waveforms that can be created via
* {@link VibrationEffect#createWaveform(long[], int[], int)} can also be created with
* {@link WaveformBuilder} by adding zero duration transitions:
*
- * <code>
- * // These two effects are the same
+ * <pre>
+ * {@code // These two effects are the same
* VibrationEffect waveform = VibrationEffect.createWaveform(
* new long[] { 10, 20, 30 }, // timings in milliseconds
* new int[] { 51, 102, 204 }, // amplitudes in [0,255]
@@ -1203,8 +1199,7 @@
* .addSustain(Duration.ofMillis(20))
* .addTransition(Duration.ZERO, targetAmplitude(0.8f))
* .addSustain(Duration.ofMillis(30))
- * .build();
- * </code>
+ * .build();}</pre>
*
* @see VibrationEffect#startWaveform
*/
@@ -1307,7 +1302,7 @@
/**
* Build the waveform as a single {@link VibrationEffect}.
*
- * The {@link WaveformBuilder} object is still valid after this call, so you can
+ * <p>The {@link WaveformBuilder} object is still valid after this call, so you can
* continue adding more primitives to it and generating more {@link VibrationEffect}s by
* calling this method again.
*
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 78f1cb1..7f0d634 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -83,7 +83,7 @@
/**
* Vibration effect support: unknown
*
- * The hardware doesn't report it's supported effects, so we can't determine whether the
+ * <p>The hardware doesn't report its supported effects, so we can't determine whether the
* effect is supported or not.
*/
public static final int VIBRATION_EFFECT_SUPPORT_UNKNOWN = 0;
@@ -91,14 +91,14 @@
/**
* Vibration effect support: supported
*
- * This effect is supported by the underlying hardware.
+ * <p>This effect is supported by the underlying hardware.
*/
public static final int VIBRATION_EFFECT_SUPPORT_YES = 1;
/**
* Vibration effect support: unsupported
*
- * This effect is <b>not</b> natively supported by the underlying hardware, although
+ * <p>This effect is <b>not</b> natively supported by the underlying hardware, although
* the system may still play a fallback vibration.
*/
public static final int VIBRATION_EFFECT_SUPPORT_NO = 2;
@@ -317,7 +317,7 @@
/**
* Vibrate constantly for the specified period of time.
*
- * <p>The app should be in foreground for the vibration to happen.</p>
+ * <p>The app should be in the foreground for the vibration to happen.</p>
*
* @param milliseconds The number of milliseconds to vibrate.
* @deprecated Use {@link #vibrate(VibrationEffect)} instead.
@@ -331,7 +331,7 @@
/**
* Vibrate constantly for the specified period of time.
*
- * <p>The app should be in foreground for the vibration to happen. Background apps should
+ * <p>The app should be in the foreground for the vibration to happen. Background apps should
* specify a ringtone, notification or alarm usage in order to vibrate.</p>
*
* @param milliseconds The number of milliseconds to vibrate.
@@ -368,7 +368,7 @@
* to start the repeat, or -1 to disable repeating.
* </p>
*
- * <p>The app should be in foreground for the vibration to happen.</p>
+ * <p>The app should be in the foreground for the vibration to happen.</p>
*
* @param pattern an array of longs of times for which to turn the vibrator on or off.
* @param repeat the index into pattern at which to repeat, or -1 if
@@ -395,7 +395,7 @@
* to start the repeat, or -1 to disable repeating.
* </p>
*
- * <p>The app should be in foreground for the vibration to happen. Background apps should
+ * <p>The app should be in the foreground for the vibration to happen. Background apps should
* specify a ringtone, notification or alarm usage in order to vibrate.</p>
*
* @param pattern an array of longs of times for which to turn the vibrator on or off.
@@ -428,7 +428,7 @@
/**
* Vibrate with a given effect.
*
- * <p>The app should be in foreground for the vibration to happen.</p>
+ * <p>The app should be in the foreground for the vibration to happen.</p>
*
* @param vibe {@link VibrationEffect} describing the vibration to be performed.
*/
@@ -440,7 +440,7 @@
/**
* Vibrate with a given effect.
*
- * <p>The app should be in foreground for the vibration to happen. Background apps should
+ * <p>The app should be in the foreground for the vibration to happen. Background apps should
* specify a ringtone, notification or alarm usage in order to vibrate.</p>
*
* @param vibe {@link VibrationEffect} describing the vibration to be performed.
@@ -461,7 +461,7 @@
/**
* Vibrate with a given effect.
*
- * <p>The app should be in foreground for the vibration to happen. Background apps should
+ * <p>The app should be in the foreground for the vibration to happen. Background apps should
* specify a ringtone, notification or alarm usage in order to vibrate.</p>
*
* @param vibe {@link VibrationEffect} describing the vibration to be performed.
@@ -477,7 +477,7 @@
/**
* Like {@link #vibrate(VibrationEffect, VibrationAttributes)}, but allows the
- * caller to specify the vibration is owned by someone else and set reason for vibration.
+ * caller to specify the vibration is owned by someone else and set a reason for vibration.
*
* @hide
*/
@@ -519,7 +519,7 @@
}
/**
- * Query whether the vibrator supports all of the given effects.
+ * Query whether the vibrator supports all the given effects.
*
* <p>If an effect is not supported, the system may still automatically fall back to a simpler
* vibration instead, which is not optimised for the specific device, however vibration isn't
@@ -533,7 +533,7 @@
* vibration.
*
* <p>If the result is {@link #VIBRATION_EFFECT_SUPPORT_UNKNOWN}, the system doesn't know
- * whether all of the effects are supported. It may support any or all of the queried effects,
+ * whether all the effects are supported. It may support any or all of the queried effects,
* but there's no way to programmatically know whether a {@link #vibrate} call will successfully
* cause a vibration. It's guaranteed, however, that none of the queried effects are
* definitively unsupported by the hardware.
@@ -541,7 +541,7 @@
* <p>Use {@link #areEffectsSupported(int...)} to get individual results for each effect.
*
* @param effectIds Which effects to query for.
- * @return Whether all of the effects are natively supported by the device.
+ * @return Whether all the effects are natively supported by the device.
*/
@VibrationEffectSupport
public final int areAllEffectsSupported(
diff --git a/core/java/android/os/VibratorInfo.java b/core/java/android/os/VibratorInfo.java
index 00ce14f..71ec096 100644
--- a/core/java/android/os/VibratorInfo.java
+++ b/core/java/android/os/VibratorInfo.java
@@ -35,7 +35,8 @@
/**
* A VibratorInfo describes the capabilities of a {@link Vibrator}.
*
- * This description includes its capabilities, list of supported effects and composition primitives.
+ * <p>This description includes its capabilities, list of supported effects and composition
+ * primitives.
*
* @hide
*/
diff --git a/core/java/android/os/VibratorManager.java b/core/java/android/os/VibratorManager.java
index c82a516..f506ef8 100644
--- a/core/java/android/os/VibratorManager.java
+++ b/core/java/android/os/VibratorManager.java
@@ -25,7 +25,7 @@
import android.util.Log;
/**
- * Class that provides access to all vibrators from the device, as well as the ability to run them
+ * Provides access to all vibrators from the device, as well as the ability to run them
* in a synchronized fashion.
* <p>
* If your process exits, any vibration you started will stop.
diff --git a/core/java/android/os/logcat/ILogcatManagerService.aidl b/core/java/android/os/logcat/ILogcatManagerService.aidl
index 02db274..29b4570 100644
--- a/core/java/android/os/logcat/ILogcatManagerService.aidl
+++ b/core/java/android/os/logcat/ILogcatManagerService.aidl
@@ -19,10 +19,54 @@
/**
* @hide
*/
-interface ILogcatManagerService {
+oneway interface ILogcatManagerService {
+ /**
+ * The function is called by logd to notify LogcatManagerService
+ * that a client makes privileged log data access request.
+ *
+ * @param uid The UID of client who makes the request.
+ * @param gid The GID of client who makes the request.
+ * @param pid The PID of client who makes the request.
+ * @param fd The FD (Socket) of client who makes the request.
+ */
void startThread(in int uid, in int gid, in int pid, in int fd);
+
+
+ /**
+ * The function is called by logd to notify LogcatManagerService
+ * that a client finished the privileged log data access.
+ *
+ * @param uid The UID of client who makes the request.
+ * @param gid The GID of client who makes the request.
+ * @param pid The PID of client who makes the request.
+ * @param fd The FD (Socket) of client who makes the request.
+ */
void finishThread(in int uid, in int gid, in int pid, in int fd);
+
+
+ /**
+ * The function is called by UX component to notify
+ * LogcatManagerService that the user approved
+ * the privileged log data access.
+ *
+ * @param uid The UID of client who makes the request.
+ * @param gid The GID of client who makes the request.
+ * @param pid The PID of client who makes the request.
+ * @param fd The FD (Socket) of client who makes the request.
+ */
void approve(in int uid, in int gid, in int pid, in int fd);
+
+
+ /**
+ * The function is called by UX component to notify
+ * LogcatManagerService that the user declined
+ * the privileged log data access.
+ *
+ * @param uid The UID of client who makes the request.
+ * @param gid The GID of client who makes the request.
+ * @param pid The PID of client who makes the request.
+ * @param fd The FD (Socket) of client who makes the request.
+ */
void decline(in int uid, in int gid, in int pid, in int fd);
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 4e1337f..cc98339 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1538,6 +1538,8 @@
* be reserved for cached data depending on the device state which is then passed on
* to getStorageCacheBytes.
*
+ * Input File path must point to a storage volume.
+ *
* @hide
*/
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
diff --git a/core/java/android/os/vibrator/VibratorFrequencyProfile.java b/core/java/android/os/vibrator/VibratorFrequencyProfile.java
index 23b45ae..0f2aa15 100644
--- a/core/java/android/os/vibrator/VibratorFrequencyProfile.java
+++ b/core/java/android/os/vibrator/VibratorFrequencyProfile.java
@@ -61,8 +61,7 @@
* <p>The returned list will not be empty, and will have entries representing frequencies from
* {@link #getMinFrequency()} to {@link #getMaxFrequency()}, inclusive.
*
- * @return Array of maximum relative amplitude measurements, each value is between 0 and 1,
- * inclusive.
+ * @return Array of maximum relative amplitude measurements.
*/
@NonNull
@FloatRange(from = 0, to = 1)
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ea20ed4..23e02e9 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -11720,8 +11720,8 @@
"night_display_forced_auto_mode_available";
/**
- * If UTC time between two NITZ signals is greater than this value then the second signal
- * cannot be ignored.
+ * If Unix epoch time between two NITZ signals is greater than this value then the second
+ * signal cannot be ignored.
*
* <p>This value is in milliseconds. It is used for telephony-based time and time zone
* detection.
@@ -16865,6 +16865,14 @@
"system_server_watchdog_timeout_ms";
/**
+ * Whether to enable managed device provisioning via the role holder.
+ *
+ * @hide
+ */
+ public static final String MANAGED_PROVISIONING_DEFER_PROVISIONING_TO_ROLE_HOLDER =
+ "managed_provisioning_defer_provisioning_to_role_holder";
+
+ /**
* Settings migrated from Wear OS settings provider.
* @hide
*/
diff --git a/core/java/android/service/attention/AttentionService.java b/core/java/android/service/attention/AttentionService.java
index f5c59b5..462ac14 100644
--- a/core/java/android/service/attention/AttentionService.java
+++ b/core/java/android/service/attention/AttentionService.java
@@ -128,9 +128,9 @@
/** {@inheritDoc} */
@Override
- public void onStartProximityUpdates(IProximityCallback callback) {
+ public void onStartProximityUpdates(IProximityUpdateCallback callback) {
Objects.requireNonNull(callback);
- AttentionService.this.onStartProximityUpdates(new ProximityCallback(callback));
+ AttentionService.this.onStartProximityUpdates(new ProximityUpdateCallback(callback));
}
@@ -166,11 +166,11 @@
/**
* Requests the continuous updates of proximity signal via the provided callback,
- * until the given callback is unregistered.
+ * until {@link #onStopProximityUpdates} is called.
*
* @param callback the callback to return the result to
*/
- public void onStartProximityUpdates(@NonNull ProximityCallback callback) {
+ public void onStartProximityUpdates(@NonNull ProximityUpdateCallback callback) {
Slog.w(LOG_TAG, "Override this method.");
}
@@ -213,22 +213,24 @@
}
}
- /** Callbacks for ProximityCallback results. */
- public static final class ProximityCallback {
- @NonNull private final WeakReference<IProximityCallback> mCallback;
+ /** Callbacks for ProximityUpdateCallback results. */
+ public static final class ProximityUpdateCallback {
+ @NonNull private final WeakReference<IProximityUpdateCallback> mCallback;
- private ProximityCallback(@NonNull IProximityCallback callback) {
+ private ProximityUpdateCallback(@NonNull IProximityUpdateCallback callback) {
mCallback = new WeakReference<>(callback);
}
/**
* @param distance the estimated distance of the user (in meter)
- * The distance will be PROXIMITY_UNKNOWN if the proximity sensing was inconclusive.
- *
+ * The distance will be {@link #PROXIMITY_UNKNOWN} if the proximity sensing
+ * was inconclusive.
*/
public void onProximityUpdate(double distance) {
try {
- mCallback.get().onProximityUpdate(distance);
+ if (mCallback.get() != null) {
+ mCallback.get().onProximityUpdate(distance);
+ }
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/core/java/android/service/attention/IAttentionService.aidl b/core/java/android/service/attention/IAttentionService.aidl
index 8bb881b..e3ce114 100644
--- a/core/java/android/service/attention/IAttentionService.aidl
+++ b/core/java/android/service/attention/IAttentionService.aidl
@@ -17,7 +17,7 @@
package android.service.attention;
import android.service.attention.IAttentionCallback;
-import android.service.attention.IProximityCallback;
+import android.service.attention.IProximityUpdateCallback;
/**
* Interface for a concrete implementation to provide to the AttentionManagerService.
@@ -27,6 +27,6 @@
oneway interface IAttentionService {
void checkAttention(IAttentionCallback callback);
void cancelAttentionCheck(IAttentionCallback callback);
- void onStartProximityUpdates(IProximityCallback callback);
+ void onStartProximityUpdates(IProximityUpdateCallback callback);
void onStopProximityUpdates();
}
\ No newline at end of file
diff --git a/core/java/android/service/attention/IProximityCallback.aidl b/core/java/android/service/attention/IProximityUpdateCallback.aidl
similarity index 77%
rename from core/java/android/service/attention/IProximityCallback.aidl
rename to core/java/android/service/attention/IProximityUpdateCallback.aidl
index 9ecf9bc..26daa5c 100644
--- a/core/java/android/service/attention/IProximityCallback.aidl
+++ b/core/java/android/service/attention/IProximityUpdateCallback.aidl
@@ -5,6 +5,6 @@
*
* @hide
*/
-oneway interface IProximityCallback {
+oneway interface IProximityUpdateCallback {
void onProximityUpdate(double distance);
}
diff --git a/core/java/android/service/autofill/OWNERS b/core/java/android/service/autofill/OWNERS
index a088632..9a30e82 100644
--- a/core/java/android/service/autofill/OWNERS
+++ b/core/java/android/service/autofill/OWNERS
@@ -1,9 +1,3 @@
# Bug component: 351486
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
-augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+include /core/java/android/view/autofill/OWNERS
diff --git a/core/java/android/service/contentcapture/OWNERS b/core/java/android/service/contentcapture/OWNERS
index 6337327..24561c5 100644
--- a/core/java/android/service/contentcapture/OWNERS
+++ b/core/java/android/service/contentcapture/OWNERS
@@ -1,9 +1,3 @@
# Bug component: 544200
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
-augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+include /core/java/android/view/contentcapture/OWNERS
diff --git a/core/java/android/service/contentsuggestions/OWNERS b/core/java/android/service/contentsuggestions/OWNERS
index 46b5ea0..72fe0b1 100644
--- a/core/java/android/service/contentsuggestions/OWNERS
+++ b/core/java/android/service/contentsuggestions/OWNERS
@@ -1,7 +1,2 @@
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
-augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+
+include /core/java/android/app/contentsuggestions/OWNERS
diff --git a/core/java/android/service/resumeonreboot/OWNERS b/core/java/android/service/resumeonreboot/OWNERS
index 3a127d5..721fbaf 100644
--- a/core/java/android/service/resumeonreboot/OWNERS
+++ b/core/java/android/service/resumeonreboot/OWNERS
@@ -1,2 +1 @@
-xunchang@google.com
-zhaojiac@google.com
+ejyzhang@google.com
\ No newline at end of file
diff --git a/core/java/android/service/selectiontoolbar/RemoteSelectionToolbar.java b/core/java/android/service/selectiontoolbar/RemoteSelectionToolbar.java
index 179d39d..9a11923 100644
--- a/core/java/android/service/selectiontoolbar/RemoteSelectionToolbar.java
+++ b/core/java/android/service/selectiontoolbar/RemoteSelectionToolbar.java
@@ -1318,6 +1318,7 @@
contentContainer.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
contentContainer.setTag(FloatingToolbar.FLOATING_TOOLBAR_TAG);
+ contentContainer.setContentDescription(FloatingToolbar.FLOATING_TOOLBAR_TAG);
contentContainer.setClipToOutline(true);
return contentContainer;
}
diff --git a/core/java/android/service/textclassifier/OWNERS b/core/java/android/service/textclassifier/OWNERS
index a535f52..c85c69e 100644
--- a/core/java/android/service/textclassifier/OWNERS
+++ b/core/java/android/service/textclassifier/OWNERS
@@ -1,9 +1,3 @@
# Bug component: 709498
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
-augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+include /core/java/android/view/textclassifier/OWNERS
diff --git a/core/java/android/service/translation/OWNERS b/core/java/android/service/translation/OWNERS
index a1e663a..440f9a8 100644
--- a/core/java/android/service/translation/OWNERS
+++ b/core/java/android/service/translation/OWNERS
@@ -1,8 +1,3 @@
# Bug component: 994311
-adamhe@google.com
-augale@google.com
-joannechung@google.com
-lpeter@google.com
-svetoslavganov@google.com
-tymtsai@google.com
+include /core/java/android/view/translation/OWNERS
diff --git a/core/java/android/service/voice/OWNERS b/core/java/android/service/voice/OWNERS
index 46b5ea0..59a0c2e 100644
--- a/core/java/android/service/voice/OWNERS
+++ b/core/java/android/service/voice/OWNERS
@@ -1,7 +1,3 @@
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
-augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+# Bug component: 533220
+
+include /core/java/android/app/assist/OWNERS
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index 22cffc1..6a65efb 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -199,7 +199,7 @@
}
private void dispatchTriggerModelDownload(Intent intent) {
- RecognitionService.this.triggerModelDownload(intent);
+ RecognitionService.this.onTriggerModelDownload(intent);
}
private class StartListeningArgs {
@@ -283,7 +283,7 @@
/**
* Requests the download of the recognizer support for {@code recognizerIntent}.
*/
- public void triggerModelDownload(@NonNull Intent recognizerIntent) {
+ public void onTriggerModelDownload(@NonNull Intent recognizerIntent) {
if (DBG) {
Log.i(TAG, String.format("#downloadModel [%s]", recognizerIntent));
}
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index e075c05..832db91 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -17,6 +17,7 @@
package android.speech;
import android.Manifest;
+import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.MainThread;
import android.annotation.NonNull;
@@ -38,7 +39,6 @@
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
-import android.util.Pair;
import android.util.Slog;
import com.android.internal.R;
@@ -49,6 +49,7 @@
import java.util.List;
import java.util.Objects;
import java.util.Queue;
+import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
/**
@@ -206,10 +207,9 @@
handleSetTemporaryComponent((ComponentName) msg.obj);
break;
case MSG_CHECK_RECOGNITION_SUPPORT:
- Pair<Intent, RecognitionSupportCallback> intentAndListener =
- (Pair<Intent, RecognitionSupportCallback>) msg.obj;
+ CheckRecognitionSupportArgs args = (CheckRecognitionSupportArgs) msg.obj;
handleCheckRecognitionSupport(
- intentAndListener.first, intentAndListener.second);
+ args.mIntent, args.mCallbackExecutor, args.mCallback);
break;
case MSG_TRIGGER_MODEL_DOWNLOAD:
handleTriggerModelDownload((Intent) msg.obj);
@@ -492,6 +492,7 @@
*/
public void checkRecognitionSupport(
@NonNull Intent recognizerIntent,
+ @NonNull @CallbackExecutor Executor executor,
@NonNull RecognitionSupportCallback supportListener) {
Objects.requireNonNull(recognizerIntent, "intent must not be null");
Objects.requireNonNull(supportListener, "listener must not be null");
@@ -508,13 +509,13 @@
connectToSystemService();
}
putMessage(Message.obtain(mHandler, MSG_CHECK_RECOGNITION_SUPPORT,
- Pair.create(recognizerIntent, supportListener)));
+ new CheckRecognitionSupportArgs(recognizerIntent, executor, supportListener)));
}
/**
* Attempts to download the support for the given {@code recognizerIntent}. This might trigger
* user interaction to approve the download. Callers can verify the status of the request via
- * {@link #checkRecognitionSupport(Intent, RecognitionSupportCallback)}.
+ * {@link #checkRecognitionSupport(Intent, Executor, RecognitionSupportCallback)}.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
* may also contain optional extras, see {@link RecognizerIntent}.
@@ -625,18 +626,20 @@
}
private void handleCheckRecognitionSupport(
- Intent recognizerIntent, RecognitionSupportCallback recognitionSupportCallback) {
+ Intent recognizerIntent,
+ Executor callbackExecutor,
+ RecognitionSupportCallback recognitionSupportCallback) {
if (!maybeInitializeManagerService()) {
return;
}
try {
mService.checkRecognitionSupport(
recognizerIntent,
- new InternalSupportCallback(recognitionSupportCallback));
+ new InternalSupportCallback(callbackExecutor, recognitionSupportCallback));
if (DBG) Log.d(TAG, "service support command succeeded");
} catch (final RemoteException e) {
Log.e(TAG, "checkRecognitionSupport() failed", e);
- mListener.onError(ERROR_CLIENT);
+ callbackExecutor.execute(() -> recognitionSupportCallback.onError(ERROR_CLIENT));
}
}
@@ -780,6 +783,21 @@
return ComponentName.unflattenFromString(serviceComponent);
}
+ private static class CheckRecognitionSupportArgs {
+ final Intent mIntent;
+ final Executor mCallbackExecutor;
+ final RecognitionSupportCallback mCallback;
+
+ private CheckRecognitionSupportArgs(
+ Intent intent,
+ Executor callbackExecutor,
+ RecognitionSupportCallback callback) {
+ mIntent = intent;
+ mCallbackExecutor = callbackExecutor;
+ mCallback = callback;
+ }
+ }
+
/**
* Internal wrapper of IRecognitionListener which will propagate the results to
* RecognitionListener
@@ -890,40 +908,22 @@
}
private static class InternalSupportCallback extends IRecognitionSupportCallback.Stub {
+ private final Executor mExecutor;
private final RecognitionSupportCallback mCallback;
- private static final int MSG_SUPPORT_RESULT = 1;
- private static final int MSG_ERROR = 2;
-
- private final Handler mInternalHandler = new Handler(Looper.getMainLooper()) {
- @Override
- public void handleMessage(Message msg) {
- if (mCallback == null) {
- return;
- }
- switch (msg.what) {
- case MSG_SUPPORT_RESULT:
- mCallback.onSupportResult((RecognitionSupport) msg.obj);
- break;
- case MSG_ERROR:
- mCallback.onError((Integer) msg.obj);
- break;
- }
- }
- };
-
- private InternalSupportCallback(RecognitionSupportCallback callback) {
+ private InternalSupportCallback(Executor executor, RecognitionSupportCallback callback) {
+ this.mExecutor = executor;
this.mCallback = callback;
}
@Override
public void onSupportResult(RecognitionSupport recognitionSupport) throws RemoteException {
- Message.obtain(mInternalHandler, MSG_SUPPORT_RESULT, recognitionSupport).sendToTarget();
+ mExecutor.execute(() -> mCallback.onSupportResult(recognitionSupport));
}
@Override
public void onError(int errorCode) throws RemoteException {
- Message.obtain(mInternalHandler, MSG_ERROR, errorCode).sendToTarget();
+ mExecutor.execute(() -> mCallback.onError(errorCode));
}
}
}
diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java
index 748d551..bedd409 100644
--- a/core/java/android/text/MeasuredParagraph.java
+++ b/core/java/android/text/MeasuredParagraph.java
@@ -287,6 +287,16 @@
}
/**
+ * Retrieves the font metrics for the given range.
+ *
+ * This is available only if the MeasuredParagraph is computed with buildForStaticLayout.
+ */
+ public void getFontMetricsInt(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
+ @NonNull Paint.FontMetricsInt fmi) {
+ mMeasuredText.getFontMetricsInt(start, end, fmi);
+ }
+
+ /**
* Returns a width of the character at the offset.
*
* This is available only if the MeasuredParagraph is computed with buildForStaticLayout.
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
index be66db2..9307e56 100644
--- a/core/java/android/text/PrecomputedText.java
+++ b/core/java/android/text/PrecomputedText.java
@@ -21,6 +21,7 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.text.LineBreakConfig;
import android.graphics.text.MeasuredText;
@@ -697,6 +698,38 @@
}
/**
+ * Retrieves the text font metrics for the given range.
+ * Both {@code start} and {@code end} offset need to be in the same paragraph, otherwise
+ * IllegalArgumentException will be thrown.
+ *
+ * @param start the inclusive start offset in the text
+ * @param end the exclusive end offset in the text
+ * @param outMetrics the output font metrics
+ * @throws IllegalArgumentException if start and end offset are in the different paragraph.
+ */
+ public void getFontMetricsInt(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
+ @NonNull Paint.FontMetricsInt outMetrics) {
+ Preconditions.checkArgument(0 <= start && start <= mText.length(), "invalid start offset");
+ Preconditions.checkArgument(0 <= end && end <= mText.length(), "invalid end offset");
+ Preconditions.checkArgument(start <= end, "start offset can not be larger than end offset");
+ Objects.requireNonNull(outMetrics);
+ if (start == end) {
+ mParams.getTextPaint().getFontMetricsInt(outMetrics);
+ return;
+ }
+ final int paraIndex = findParaIndex(start);
+ final int paraStart = getParagraphStart(paraIndex);
+ final int paraEnd = getParagraphEnd(paraIndex);
+ if (start < paraStart || paraEnd < end) {
+ throw new IllegalArgumentException("Cannot measured across the paragraph:"
+ + "para: (" + paraStart + ", " + paraEnd + "), "
+ + "request: (" + start + ", " + end + ")");
+ }
+ getMeasuredParagraph(paraIndex).getFontMetricsInt(start - paraStart,
+ end - paraStart, outMetrics);
+ }
+
+ /**
* Returns a width of a character at offset
*
* @param offset an offset of the text.
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 49e2111..e39231c 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -866,8 +866,12 @@
wp.getFontMetricsInt(mChars, start, count, contextStart, contextCount, runIsRtl,
fmi);
} else {
- wp.getFontMetricsInt(mText, mStart + start, count, mStart + contextStart, contextCount,
- runIsRtl, fmi);
+ if (mComputed == null) {
+ wp.getFontMetricsInt(mText, mStart + start, count, mStart + contextStart,
+ contextCount, runIsRtl, fmi);
+ } else {
+ mComputed.getFontMetricsInt(mStart + start, mStart + end, fmi);
+ }
}
updateMetrics(fmi, previousTop, previousAscent, previousDescent, previousBottom,
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index fa61de5..188bc3f 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -67,6 +67,13 @@
public static final String SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME =
"settings_app_allow_dark_theme_activation_at_bedtime";
+ /**
+ * Hide back key in the Settings two pane design.
+ * @hide
+ */
+ public static final String SETTINGS_HIDE_SECONDARY_PAGE_BACK_BUTTON_IN_TWO_PANE =
+ "settings_hide_secondary_page_back_button_in_two_pane";
+
private static final Map<String, String> DEFAULT_FLAGS;
static {
@@ -89,9 +96,10 @@
DEFAULT_FLAGS.put(SETTINGS_ENABLE_SECURITY_HUB, "true");
DEFAULT_FLAGS.put(SETTINGS_SUPPORT_LARGE_SCREEN, "true");
DEFAULT_FLAGS.put("settings_search_always_expand", "false");
- DEFAULT_FLAGS.put(SETTINGS_APP_LANGUAGE_SELECTION, "false");
+ DEFAULT_FLAGS.put(SETTINGS_APP_LANGUAGE_SELECTION, "true");
DEFAULT_FLAGS.put(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS, "true");
DEFAULT_FLAGS.put(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME, "false");
+ DEFAULT_FLAGS.put(SETTINGS_HIDE_SECONDARY_PAGE_BACK_BUTTON_IN_TWO_PANE, "true");
}
private static final Set<String> PERSISTENT_FLAGS;
@@ -101,6 +109,7 @@
PERSISTENT_FLAGS.add(SETTINGS_SUPPORT_LARGE_SCREEN);
PERSISTENT_FLAGS.add(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS);
PERSISTENT_FLAGS.add(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME);
+ PERSISTENT_FLAGS.add(SETTINGS_HIDE_SECONDARY_PAGE_BACK_BUTTON_IN_TWO_PANE);
}
/**
diff --git a/core/java/android/util/OWNERS b/core/java/android/util/OWNERS
index 28c078e..d4cf6e6 100644
--- a/core/java/android/util/OWNERS
+++ b/core/java/android/util/OWNERS
@@ -6,3 +6,7 @@
per-file TypedValue.java = file:/core/java/android/content/res/OWNERS
per-file PackageUtils.java = file:/core/java/android/content/pm/OWNERS
+
+per-file NtpTrustedTime.java = file:/services/core/java/com/android/server/timezonedetector/OWNERS
+per-file TimeUtils.java = file:/services/core/java/com/android/server/timezonedetector/OWNERS
+per-file TrustedTime.java = file:/services/core/java/com/android/server/timezonedetector/OWNERS
diff --git a/core/java/android/util/PackageUtils.java b/core/java/android/util/PackageUtils.java
index ff04825..c5ab82d 100644
--- a/core/java/android/util/PackageUtils.java
+++ b/core/java/android/util/PackageUtils.java
@@ -18,13 +18,17 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.content.pm.Signature;
import android.text.TextUtils;
import libcore.util.HexEncoding;
import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
@@ -35,6 +39,9 @@
*/
public final class PackageUtils {
+ private static final int LOW_RAM_BUFFER_SIZE_BYTES = 1 * 1000; // 1 kB
+ private static final int HIGH_RAM_BUFFER_SIZE_BYTES = 1 * 1000 * 1000; // 1 MB
+
private PackageUtils() {
/* hide constructor */
}
@@ -162,4 +169,55 @@
return TextUtils.join(separator, pieces);
}
+
+ /**
+ * @see #computeSha256DigestForLargeFile(String, String)
+ */
+ public static @Nullable String computeSha256DigestForLargeFile(@NonNull String filePath) {
+ return computeSha256DigestForLargeFile(filePath, null);
+ }
+
+ /**
+ * Computes the SHA256 digest of large files.
+ * @param filePath The path to which the file's content is to be hashed.
+ * @param separator Separator between each pair of characters, such as colon, or null to omit.
+ * @return The digest or null if an error occurs.
+ */
+ public static @Nullable String computeSha256DigestForLargeFile(@NonNull String filePath,
+ @Nullable String separator) {
+ MessageDigest messageDigest;
+ try {
+ messageDigest = MessageDigest.getInstance("SHA256");
+ messageDigest.reset();
+ } catch (NoSuchAlgorithmException e) {
+ // this shouldn't happen!
+ return null;
+ }
+
+ boolean isLowRamDevice = ActivityManager.isLowRamDeviceStatic();
+ int bufferSize = isLowRamDevice ? LOW_RAM_BUFFER_SIZE_BYTES : HIGH_RAM_BUFFER_SIZE_BYTES;
+
+ File f = new File(filePath);
+ try {
+ DigestInputStream digestStream = new DigestInputStream(new FileInputStream(f),
+ messageDigest);
+ byte[] buffer = new byte[bufferSize];
+ while (digestStream.read(buffer) != -1);
+ } catch (IOException e) {
+ return null;
+ }
+
+ byte[] resultBytes = messageDigest.digest();
+
+ if (separator == null) {
+ return HexEncoding.encodeToString(resultBytes, true);
+ }
+
+ int length = resultBytes.length;
+ String[] pieces = new String[length];
+ for (int index = 0; index < length; index++) {
+ pieces[index] = HexEncoding.encodeToString(resultBytes[index], true);
+ }
+ return TextUtils.join(separator, pieces);
+ }
}
diff --git a/core/java/android/util/TimeUtils.java b/core/java/android/util/TimeUtils.java
index 5fd0c33..9a93e1b 100644
--- a/core/java/android/util/TimeUtils.java
+++ b/core/java/android/util/TimeUtils.java
@@ -153,8 +153,8 @@
*
* <p>Time zone database updates should be expected to occur periodically due to
* political and legal changes that cannot be anticipated in advance. Therefore,
- * when computing the UTC time for a future event, applications should be aware that
- * the results may differ following a time zone database update. This method allows
+ * when computing the time for a future event, applications should be aware that the
+ * results may differ following a time zone database update. This method allows
* applications to detect that a database change has occurred, and to recalculate any
* cached times accordingly.
*
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index b8eb602..8e3cc34 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -499,9 +499,9 @@
*
* @param callback The extended frame callback to run during the next frame.
*
- * @see #removeExtendedFrameCallback
+ * @see #removeVsyncCallback
*/
- public void postExtendedFrameCallback(@NonNull ExtendedFrameCallback callback) {
+ public void postVsyncCallback(@NonNull VsyncCallback callback) {
if (callback == null) {
throw new IllegalArgumentException("callback must not be null");
}
@@ -603,9 +603,9 @@
*
* @param callback The extended frame callback to remove.
*
- * @see #postExtendedFrameCallback
+ * @see #postVsyncCallback
*/
- public void removeExtendedFrameCallback(@Nullable ExtendedFrameCallback callback) {
+ public void removeVsyncCallback(@Nullable VsyncCallback callback) {
if (callback == null) {
throw new IllegalArgumentException("callback must not be null");
}
@@ -1021,7 +1021,7 @@
* The time in {@link System#nanoTime()} timebase which this frame is expected to be
* presented.
*/
- public long getExpectedPresentTimeNanos() {
+ public long getExpectedPresentationTimeNanos() {
return mExpectedPresentTimeNanos;
}
@@ -1034,7 +1034,7 @@
}
/**
- * The payload for {@link ExtendedFrameCallback} which includes frame information such as when
+ * The payload for {@link VsyncCallback} which includes frame information such as when
* the frame started being rendered, and multiple possible frame timelines and their
* information including deadline and expected present time.
*/
@@ -1101,7 +1101,7 @@
*
* @see FrameCallback
*/
- public interface ExtendedFrameCallback {
+ public interface VsyncCallback {
/**
* Called when a new display frame is being rendered.
*
@@ -1214,7 +1214,7 @@
void run(FrameData frameData) {
if (token == EXTENDED_FRAME_CALLBACK_TOKEN) {
- ((ExtendedFrameCallback) action).onVsync(frameData);
+ ((VsyncCallback) action).onVsync(frameData);
} else {
run(frameData.getFrameTimeNanos());
}
diff --git a/core/java/android/view/IPinnedTaskListener.aidl b/core/java/android/view/IPinnedTaskListener.aidl
index c31e67e..7d39ffe 100644
--- a/core/java/android/view/IPinnedTaskListener.aidl
+++ b/core/java/android/view/IPinnedTaskListener.aidl
@@ -61,4 +61,9 @@
* Called by the window manager when the aspect ratio is reset.
*/
void onAspectRatioChanged(float aspectRatio);
+
+ /**
+ * Called by the window manager when the expanded aspect ratio is reset.
+ */
+ void onExpandedAspectRatioChanged(float aspectRatio);
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 36baa04..ce21086 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -65,7 +65,7 @@
import android.view.SurfaceControl;
import android.view.displayhash.DisplayHash;
import android.view.displayhash.VerifiedDisplayHash;
-import android.window.IOnFpsCallbackListener;
+import android.window.ITaskFpsCallback;
/**
* System private interface to the window manager.
@@ -926,21 +926,21 @@
* registered, the registered callback will not be unregistered until
* {@link unregisterTaskFpsCallback()} is called
* @param taskId task id of the task.
- * @param listener listener to be registered.
+ * @param callback callback to be registered.
*
* @hide
*/
- void registerTaskFpsCallback(in int taskId, in IOnFpsCallbackListener listener);
+ void registerTaskFpsCallback(in int taskId, in ITaskFpsCallback callback);
/**
* Unregisters the frame rate per second count callback which was registered with
* {@link #registerTaskFpsCallback(int,TaskFpsCallback)}.
*
- * @param listener listener to be unregistered.
+ * @param callback callback to be unregistered.
*
* @hide
*/
- void unregisterTaskFpsCallback(in IOnFpsCallbackListener listener);
+ void unregisterTaskFpsCallback(in ITaskFpsCallback listener);
/**
* Take a snapshot using the same path that's used for Recents. This is used for Testing only.
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index 1ed35f7..a266a28 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -337,8 +337,10 @@
*
* @param window The token for the window to set the callback to.
* @param callback The {@link IOnBackInvokedCallback} to set.
+ * @param priority The priority of the callback.
*/
- oneway void setOnBackInvokedCallback(IWindow window, IOnBackInvokedCallback callback);
+ oneway void setOnBackInvokedCallback(
+ IWindow window, IOnBackInvokedCallback callback, int priority);
/**
* Clears a touchable region set by {@link #setInsets}.
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index ce54968..98cef958 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -46,10 +46,13 @@
import android.gui.DropInputMode;
import android.hardware.DataSpace;
import android.hardware.HardwareBuffer;
+import android.hardware.SyncFence;
import android.hardware.display.DeviceProductInfo;
import android.hardware.display.DisplayedContentSample;
import android.hardware.display.DisplayedContentSamplingAttributes;
import android.hardware.graphics.common.DisplayDecorationSupport;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLSync;
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
@@ -209,7 +212,7 @@
private static native void nativeReparent(long transactionObj, long nativeObject,
long newParentNativeObject);
private static native void nativeSetBuffer(long transactionObj, long nativeObject,
- HardwareBuffer buffer);
+ HardwareBuffer buffer, long fencePtr);
private static native void nativeSetBufferTransform(long transactionObj, long nativeObject,
int transform);
private static native void nativeSetDataSpace(long transactionObj, long nativeObject,
@@ -386,9 +389,7 @@
public static final int JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED = 0x4;
// Either App or GPU took too long on the frame
public static final int JANK_APP_DEADLINE_MISSED = 0x8;
- // Predictions live for 120ms, if prediction is expired for a frame, there is definitely a
- // jank
- // associated with the App if this is for a SurfaceFrame, and SF for a DisplayFrame.
+ // Vsync predictions have drifted beyond the threshold from the actual HWVsync
public static final int PREDICTION_ERROR = 0x10;
// Latching a buffer early might cause an early present of the frame
public static final int SURFACE_FLINGER_SCHEDULING = 0x20;
@@ -3692,8 +3693,44 @@
*/
public @NonNull Transaction setBuffer(@NonNull SurfaceControl sc,
@Nullable HardwareBuffer buffer) {
+ return setBuffer(sc, buffer, null);
+ }
+
+ /**
+ * Updates the HardwareBuffer displayed for the SurfaceControl.
+ *
+ * Note that the buffer must be allocated with {@link HardwareBuffer#USAGE_COMPOSER_OVERLAY}
+ * as well as {@link HardwareBuffer#USAGE_GPU_SAMPLED_IMAGE} as the surface control might
+ * be composited using either an overlay or using the GPU.
+ *
+ * A presentation fence may be passed to improve performance by allowing the buffer
+ * to complete rendering while it is waiting for the transaction to be applied.
+ * For example, if the buffer is being produced by rendering with OpenGL ES then
+ * a fence created with
+ * {@link android.opengl.EGLExt#eglDupNativeFenceFDANDROID(EGLDisplay, EGLSync)} can be
+ * used to allow the GPU rendering to be concurrent with the transaction. The compositor
+ * will wait for the fence to be signaled before the buffer is displayed. If multiple
+ * buffers are set as part of the same transaction, the presentation fences of all of them
+ * must signal before any buffer is displayed. That is, the entire transaction is delayed
+ * until all presentation fences have signaled, ensuring the transaction remains consistent.
+ *
+ * @param sc The SurfaceControl to update
+ * @param buffer The buffer to be displayed
+ * @param fence The presentation fence. If null or invalid, this is equivalent to
+ * {@link #setBuffer(SurfaceControl, HardwareBuffer)}
+ * @return this
+ */
+ public @NonNull Transaction setBuffer(@NonNull SurfaceControl sc,
+ @Nullable HardwareBuffer buffer, @Nullable SyncFence fence) {
checkPreconditions(sc);
- nativeSetBuffer(mNativeObject, sc.mNativeObject, buffer);
+ if (fence != null) {
+ synchronized (fence.getLock()) {
+ nativeSetBuffer(mNativeObject, sc.mNativeObject, buffer,
+ fence.getNativeFence());
+ }
+ } else {
+ nativeSetBuffer(mNativeObject, sc.mNativeObject, buffer, 0);
+ }
return this;
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 179f6ee..4dc1fca 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -11785,7 +11785,10 @@
* user and that ideally it should not be covered. Setting this is only appropriate for UI
* where the user would likely take action to uncover it.
* <p>
- * The system will try to respect this, but when not possible will ignore it.
+ * The system will try to respect this preference, but when not possible will ignore it.
+ * <p>
+ * Note: while this is set to {@code true}, the system will ignore the {@code Rect}s provided
+ * through {@link #setPreferKeepClearRects} (but not clear them).
* <p>
* @see #setPreferKeepClearRects
* @see #isPreferKeepClear
@@ -11817,11 +11820,11 @@
* user and that ideally they should not be covered. Setting this is only appropriate for UI
* where the user would likely take action to uncover it.
* <p>
- * If the whole view is preferred to be clear ({@link #isPreferKeepClear}), the rects set here
- * will be ignored.
- * <p>
* The system will try to respect this preference, but when not possible will ignore it.
* <p>
+ * Note: While {@link #isPreferKeepClear} is {@code true}, the {@code Rect}s set here are
+ * ignored.
+ * <p>
* @see #setPreferKeepClear
* @see #getPreferKeepClearRects
*/
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 8236fbb..8444032 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1201,7 +1201,7 @@
mTmpFrames.displayFrame, mTempRect2, mTmpFrames.frame);
setFrame(mTmpFrames.frame);
registerBackCallbackOnWindow();
- if (WindowOnBackInvokedDispatcher.shouldUseLegacyBack()) {
+ if (!WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(mContext)) {
// For apps requesting legacy back behavior, we add a compat callback that
// dispatches {@link KeyEvent#KEYCODE_BACK} to their root views.
// This way from system point of view, these apps are providing custom
@@ -6507,7 +6507,7 @@
if (isBack(event)
&& mContext != null
- && !WindowOnBackInvokedDispatcher.shouldUseLegacyBack()) {
+ && WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(mContext)) {
// Invoke the appropriate {@link OnBackInvokedCallback} if the new back
// navigation should be used, and the key event is not handled by anything else.
OnBackInvokedCallback topCallback =
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 771d40b..1c27046 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -4865,21 +4865,24 @@
* Registers the frame rate per second count callback for one given task ID.
* Each callback can only register for receiving FPS callback for one task id until unregister
* is called. If there's no task associated with the given task id,
- * {@link IllegalArgumentException} will be thrown. If a task id destroyed after a callback is
- * registered, the registered callback will not be unregistered until
- * {@link #unregisterTaskFpsCallback(TaskFpsCallback))} is called
+ * {@link IllegalArgumentException} will be thrown. Registered callbacks should always be
+ * unregistered via {@link #unregisterTaskFpsCallback(TaskFpsCallback)}
+ * even when the task id has been destroyed.
+ *
* @param taskId task id of the task.
+ * @param executor Executor to execute the callback.
* @param callback callback to be registered.
*
* @hide
*/
@SystemApi
default void registerTaskFpsCallback(@IntRange(from = 0) int taskId,
+ @NonNull Executor executor,
@NonNull TaskFpsCallback callback) {}
/**
* Unregisters the frame rate per second count callback which was registered with
- * {@link #registerTaskFpsCallback(int,TaskFpsCallback)}.
+ * {@link #registerTaskFpsCallback(Executor, int, TaskFpsCallback)}.
*
* @param callback callback to be unregistered.
*
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index f4353eb..20cdad4 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -39,14 +39,18 @@
import android.os.IBinder;
import android.os.RemoteException;
import android.os.StrictMode;
+import android.window.ITaskFpsCallback;
import android.window.TaskFpsCallback;
import android.window.WindowContext;
import android.window.WindowProvider;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.IResultReceiver;
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;
@@ -99,6 +103,10 @@
@Nullable
private final IBinder mWindowContextToken;
+ @GuardedBy("mOnFpsCallbackListenerProxies")
+ private final ArrayList<OnFpsCallbackListenerProxy> mOnFpsCallbackListenerProxies =
+ new ArrayList<>();
+
public WindowManagerImpl(Context context) {
this(context, null /* parentWindow */, null /* clientToken */);
}
@@ -424,20 +432,56 @@
}
@Override
- public void registerTaskFpsCallback(@IntRange(from = 0) int taskId, TaskFpsCallback callback) {
+ public void registerTaskFpsCallback(@IntRange(from = 0) int taskId, @NonNull Executor executor,
+ TaskFpsCallback callback) {
+ final OnFpsCallbackListenerProxy onFpsCallbackListenerProxy =
+ new OnFpsCallbackListenerProxy(executor, callback);
try {
WindowManagerGlobal.getWindowManagerService().registerTaskFpsCallback(
- taskId, callback.getListener());
+ taskId, onFpsCallbackListenerProxy);
} catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ synchronized (mOnFpsCallbackListenerProxies) {
+ mOnFpsCallbackListenerProxies.add(onFpsCallbackListenerProxy);
}
}
@Override
public void unregisterTaskFpsCallback(TaskFpsCallback callback) {
- try {
- WindowManagerGlobal.getWindowManagerService().unregisterTaskFpsCallback(
- callback.getListener());
- } catch (RemoteException e) {
+ synchronized (mOnFpsCallbackListenerProxies) {
+ final Iterator<OnFpsCallbackListenerProxy> iterator =
+ mOnFpsCallbackListenerProxies.iterator();
+ while (iterator.hasNext()) {
+ final OnFpsCallbackListenerProxy proxy = iterator.next();
+ if (proxy.mCallback == callback) {
+ try {
+ WindowManagerGlobal.getWindowManagerService()
+ .unregisterTaskFpsCallback(proxy);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ iterator.remove();
+ }
+ }
+ }
+ }
+
+ private static class OnFpsCallbackListenerProxy
+ extends ITaskFpsCallback.Stub {
+ private final Executor mExecutor;
+ private final TaskFpsCallback mCallback;
+
+ private OnFpsCallbackListenerProxy(Executor executor, TaskFpsCallback callback) {
+ mExecutor = executor;
+ mCallback = callback;
+ }
+
+ @Override
+ public void onFpsReported(float fps) {
+ mExecutor.execute(() -> {
+ mCallback.onFpsReported(fps);
+ });
}
}
diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java
index 2122152..c81b8cc 100644
--- a/core/java/android/view/WindowlessWindowManager.java
+++ b/core/java/android/view/WindowlessWindowManager.java
@@ -27,8 +27,6 @@
import android.os.RemoteException;
import android.util.Log;
import android.util.MergedConfiguration;
-import android.view.InsetsState;
-import android.view.IWindow;
import android.window.ClientWindowFrames;
import android.window.IOnBackInvokedCallback;
@@ -511,7 +509,7 @@
@Override
public void setOnBackInvokedCallback(IWindow iWindow,
- IOnBackInvokedCallback iOnBackInvokedCallback) throws RemoteException { }
+ IOnBackInvokedCallback iOnBackInvokedCallback, int priority) throws RemoteException { }
@Override
public boolean dropForAccessibility(IWindow window, int x, int y) {
diff --git a/core/java/android/view/animation/Transformation.java b/core/java/android/view/animation/Transformation.java
index bd62308..de31667 100644
--- a/core/java/android/view/animation/Transformation.java
+++ b/core/java/android/view/animation/Transformation.java
@@ -158,7 +158,7 @@
}
/**
- * @return The 3x3 Matrix representing the trnasformation to apply to the
+ * @return The 3x3 Matrix representing the transformation to apply to the
* coordinates of the object being animated
*/
public Matrix getMatrix() {
@@ -167,7 +167,7 @@
/**
* Sets the degree of transparency
- * @param alpha 1.0 means fully opaqe and 0.0 means fully transparent
+ * @param alpha 1.0 means fully opaque and 0.0 means fully transparent
*/
public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {
mAlpha = alpha;
diff --git a/core/java/android/view/autofill/AutofillClientController.java b/core/java/android/view/autofill/AutofillClientController.java
index 0f0fa4a..93d98ac 100644
--- a/core/java/android/view/autofill/AutofillClientController.java
+++ b/core/java/android/view/autofill/AutofillClientController.java
@@ -76,7 +76,6 @@
*/
public AutofillClientController(Activity activity) {
mActivity = activity;
- activity.addDumpable(this);
}
private AutofillManager getAutofillManager() {
diff --git a/core/java/android/view/autofill/OWNERS b/core/java/android/view/autofill/OWNERS
index a088632..108c42c 100644
--- a/core/java/android/view/autofill/OWNERS
+++ b/core/java/android/view/autofill/OWNERS
@@ -1,9 +1,7 @@
# Bug component: 351486
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+joannechung@google.com
+markpun@google.com
+lpeter@google.com
+tymtsai@google.com
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index 54bd9e7..48d2970 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -218,6 +218,7 @@
public static final boolean DEBUG = false;
/** @hide */
+ @TestApi
public static final String DUMPABLE_NAME = "ContentCaptureManager";
/** Error happened during the data sharing session. */
@@ -391,6 +392,9 @@
@GuardedBy("mLock")
private MainContentCaptureSession mMainSession;
+ @Nullable // set on-demand by addDumpable()
+ private Dumper mDumpable;
+
/** @hide */
public interface ContentCaptureClient {
/**
@@ -407,9 +411,6 @@
mService = Objects.requireNonNull(service, "service cannot be null");
mOptions = Objects.requireNonNull(options, "options cannot be null");
- if (context instanceof Activity) {
- ((Activity) context).addDumpable(new Dumper());
- }
ContentCaptureHelper.setLoggingLevel(mOptions.loggingLevel);
if (sVerbose) Log.v(TAG, "Constructor for " + context.getPackageName());
@@ -748,6 +749,14 @@
return resultReceiver;
}
+ /** @hide */
+ public void addDumpable(Activity activity) {
+ if (mDumpable == null) {
+ mDumpable = new Dumper();
+ }
+ activity.addDumpable(mDumpable);
+ }
+
// NOTE: ContentCaptureManager cannot implement it directly as it would be exposed as public API
private final class Dumper implements Dumpable {
@Override
diff --git a/core/java/android/view/contentcapture/OWNERS b/core/java/android/view/contentcapture/OWNERS
index 6337327..1a5cb1e4 100644
--- a/core/java/android/view/contentcapture/OWNERS
+++ b/core/java/android/view/contentcapture/OWNERS
@@ -1,9 +1,7 @@
# Bug component: 544200
-joannechung@google.com
-adamhe@google.com
-tymtsai@google.com
-lpeter@google.com
augale@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
+joannechung@google.com
+markpun@google.com
+lpeter@google.com
+tymtsai@google.com
diff --git a/core/java/android/view/inputmethod/InputMethod.java b/core/java/android/view/inputmethod/InputMethod.java
index 08cc31c..69ad739 100644
--- a/core/java/android/view/inputmethod/InputMethod.java
+++ b/core/java/android/view/inputmethod/InputMethod.java
@@ -391,22 +391,6 @@
public void changeInputMethodSubtype(InputMethodSubtype subtype);
/**
- * Update token of the client window requesting {@link #showSoftInput(int, ResultReceiver)}
- * @param showInputToken placeholder app window token for window requesting
- * {@link InputMethodManager#showSoftInput(View, int)}
- * @hide
- */
- public void setCurrentShowInputToken(IBinder showInputToken);
-
- /**
- * Update token of the client window requesting {@link #hideSoftInput(int, ResultReceiver)}
- * @param hideInputToken placeholder app window token for window requesting
- * {@link InputMethodManager#hideSoftInputFromWindow(IBinder, int)}
- * @hide
- */
- public void setCurrentHideInputToken(IBinder hideInputToken);
-
- /**
* Checks if IME is ready to start stylus handwriting session.
* If yes, {@link #startStylusHandwriting(InputChannel, List)} is called.
* @param requestId
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index 9a70667..d7c1846 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -64,6 +64,7 @@
* @attr ref android.R.styleable#InputMethod_isDefault
* @attr ref android.R.styleable#InputMethod_supportsSwitchingToNextInputMethod
* @attr ref android.R.styleable#InputMethod_supportsInlineSuggestions
+ * @attr ref android.R.styleable#InputMethod_supportsInlineSuggestionsWithTouchExploration
* @attr ref android.R.styleable#InputMethod_suppressesSpellChecker
* @attr ref android.R.styleable#InputMethod_showInInputMethodPicker
* @attr ref android.R.styleable#InputMethod_configChanges
@@ -125,6 +126,11 @@
private final boolean mInlineSuggestionsEnabled;
/**
+ * The flag whether this IME supports inline suggestions when touch exploration is enabled.
+ */
+ private final boolean mSupportsInlineSuggestionsWithTouchExploration;
+
+ /**
* The flag whether this IME suppresses spell checker.
*/
private final boolean mSuppressesSpellChecker;
@@ -189,6 +195,7 @@
boolean isAuxIme = true;
boolean supportsSwitchingToNextInputMethod = false; // false as default
boolean inlineSuggestionsEnabled = false; // false as default
+ boolean supportsInlineSuggestionsWithTouchExploration = false; // false as default
boolean suppressesSpellChecker = false; // false as default
boolean showInInputMethodPicker = true; // true as default
mForceDefault = false;
@@ -234,6 +241,9 @@
false);
inlineSuggestionsEnabled = sa.getBoolean(
com.android.internal.R.styleable.InputMethod_supportsInlineSuggestions, false);
+ supportsInlineSuggestionsWithTouchExploration = sa.getBoolean(
+ com.android.internal.R.styleable
+ .InputMethod_supportsInlineSuggestionsWithTouchExploration, false);
suppressesSpellChecker = sa.getBoolean(
com.android.internal.R.styleable.InputMethod_suppressesSpellChecker, false);
showInInputMethodPicker = sa.getBoolean(
@@ -314,6 +324,8 @@
mIsAuxIme = isAuxIme;
mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod;
mInlineSuggestionsEnabled = inlineSuggestionsEnabled;
+ mSupportsInlineSuggestionsWithTouchExploration =
+ supportsInlineSuggestionsWithTouchExploration;
mSuppressesSpellChecker = suppressesSpellChecker;
mShowInInputMethodPicker = showInInputMethodPicker;
mIsVrOnly = isVrOnly;
@@ -326,6 +338,7 @@
mIsAuxIme = source.readInt() == 1;
mSupportsSwitchingToNextInputMethod = source.readInt() == 1;
mInlineSuggestionsEnabled = source.readInt() == 1;
+ mSupportsInlineSuggestionsWithTouchExploration = source.readInt() == 1;
mSuppressesSpellChecker = source.readBoolean();
mShowInInputMethodPicker = source.readBoolean();
mIsVrOnly = source.readBoolean();
@@ -345,7 +358,8 @@
settingsActivity, null /* subtypes */, 0 /* isDefaultResId */,
false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
false /* inlineSuggestionsEnabled */, false /* isVrOnly */,
- 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */);
+ 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */,
+ false /* inlineSuggestionsEnabled */);
}
/**
@@ -360,7 +374,8 @@
settingsActivity, null /* subtypes */, 0 /* isDefaultResId */,
false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
false /* inlineSuggestionsEnabled */, false /* isVrOnly */, handledConfigChanges,
- false /* supportsStylusHandwriting */);
+ false /* supportsStylusHandwriting */,
+ false /* inlineSuggestionsEnabled */);
}
/**
@@ -373,7 +388,8 @@
this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault,
true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */,
false /* isVrOnly */, 0 /* handledconfigChanges */,
- false /* supportsStylusHandwriting */);
+ false /* supportsStylusHandwriting */,
+ false /* inlineSuggestionsEnabled */);
}
/**
@@ -385,7 +401,8 @@
boolean supportsSwitchingToNextInputMethod, boolean isVrOnly) {
this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault,
supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly,
- 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */);
+ 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */,
+ false /* inlineSuggestionsEnabled */);
}
/**
@@ -395,7 +412,8 @@
public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity,
List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault,
boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled,
- boolean isVrOnly, int handledConfigChanges, boolean supportsStylusHandwriting) {
+ boolean isVrOnly, int handledConfigChanges, boolean supportsStylusHandwriting,
+ boolean supportsInlineSuggestionsWithTouchExploration) {
final ServiceInfo si = ri.serviceInfo;
mService = ri;
mId = new ComponentName(si.packageName, si.name).flattenToShortString();
@@ -406,6 +424,8 @@
mForceDefault = forceDefault;
mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod;
mInlineSuggestionsEnabled = inlineSuggestionsEnabled;
+ mSupportsInlineSuggestionsWithTouchExploration =
+ supportsInlineSuggestionsWithTouchExploration;
mSuppressesSpellChecker = false;
mShowInInputMethodPicker = true;
mIsVrOnly = isVrOnly;
@@ -583,6 +603,8 @@
+ " mIsVrOnly=" + mIsVrOnly
+ " mSupportsSwitchingToNextInputMethod=" + mSupportsSwitchingToNextInputMethod
+ " mInlineSuggestionsEnabled=" + mInlineSuggestionsEnabled
+ + " mSupportsInlineSuggestionsWithTouchExploration="
+ + mSupportsInlineSuggestionsWithTouchExploration
+ " mSuppressesSpellChecker=" + mSuppressesSpellChecker
+ " mShowInInputMethodPicker=" + mShowInInputMethodPicker
+ " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting);
@@ -654,6 +676,15 @@
}
/**
+ * Returns {@code true} if this input method supports inline suggestions when touch exploration
+ * is enabled.
+ * @hide
+ */
+ public boolean supportsInlineSuggestionsWithTouchExploration() {
+ return mSupportsInlineSuggestionsWithTouchExploration;
+ }
+
+ /**
* Return {@code true} if this input method suppresses spell checker.
*/
public boolean suppressesSpellChecker() {
@@ -683,6 +714,7 @@
dest.writeInt(mIsAuxIme ? 1 : 0);
dest.writeInt(mSupportsSwitchingToNextInputMethod ? 1 : 0);
dest.writeInt(mInlineSuggestionsEnabled ? 1 : 0);
+ dest.writeInt(mSupportsInlineSuggestionsWithTouchExploration ? 1 : 0);
dest.writeBoolean(mSuppressesSpellChecker);
dest.writeBoolean(mShowInInputMethodPicker);
dest.writeBoolean(mIsVrOnly);
diff --git a/core/java/android/view/inputmethod/OWNERS b/core/java/android/view/inputmethod/OWNERS
index d7db7c7..9fa7e8f 100644
--- a/core/java/android/view/inputmethod/OWNERS
+++ b/core/java/android/view/inputmethod/OWNERS
@@ -3,4 +3,4 @@
include /services/core/java/com/android/server/inputmethod/OWNERS
-per-file *InlineSuggestion* = file:/core/java/android/service/autofill/OWNERS
+per-file *InlineSuggestion* = file:/core/java/android/view/autofill/OWNERS
diff --git a/core/java/android/view/selectiontoolbar/SelectionToolbarManager.java b/core/java/android/view/selectiontoolbar/SelectionToolbarManager.java
index 6de0316..ef04b2c 100644
--- a/core/java/android/view/selectiontoolbar/SelectionToolbarManager.java
+++ b/core/java/android/view/selectiontoolbar/SelectionToolbarManager.java
@@ -105,7 +105,7 @@
private boolean isRemoteSelectionToolbarEnabled() {
return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SELECTION_TOOLBAR,
- REMOTE_SELECTION_TOOLBAR_ENABLED, false);
+ REMOTE_SELECTION_TOOLBAR_ENABLED, true);
}
/**
diff --git a/core/java/android/view/textclassifier/OWNERS b/core/java/android/view/textclassifier/OWNERS
index 4bcdeea..a205be2 100644
--- a/core/java/android/view/textclassifier/OWNERS
+++ b/core/java/android/view/textclassifier/OWNERS
@@ -2,8 +2,6 @@
mns@google.com
toki@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
augale@google.com
joannechung@google.com
tonymak@google.com
diff --git a/core/java/android/view/textclassifier/logging/OWNERS b/core/java/android/view/textclassifier/logging/OWNERS
deleted file mode 100644
index ac80d9f..0000000
--- a/core/java/android/view/textclassifier/logging/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-# Bug component: 709498
-
-mns@google.com
-toki@google.com
-svetoslavganov@android.com
-svetoslavganov@google.com
-augale@google.com
-joannechung@google.com
diff --git a/core/java/android/view/translation/OWNERS b/core/java/android/view/translation/OWNERS
index a1e663a..b772ad3 100644
--- a/core/java/android/view/translation/OWNERS
+++ b/core/java/android/view/translation/OWNERS
@@ -1,8 +1,7 @@
# Bug component: 994311
-adamhe@google.com
augale@google.com
joannechung@google.com
+markpun@google.com
lpeter@google.com
-svetoslavganov@google.com
tymtsai@google.com
diff --git a/core/java/android/widget/inline/OWNERS b/core/java/android/widget/inline/OWNERS
new file mode 100644
index 0000000..9a30e82
--- /dev/null
+++ b/core/java/android/widget/inline/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 351486
+
+include /core/java/android/view/autofill/OWNERS
diff --git a/core/java/android/window/BackNavigationInfo.java b/core/java/android/window/BackNavigationInfo.java
index 18c20e2..1e922d9 100644
--- a/core/java/android/window/BackNavigationInfo.java
+++ b/core/java/android/window/BackNavigationInfo.java
@@ -21,9 +21,11 @@
import android.annotation.Nullable;
import android.app.WindowConfiguration;
import android.hardware.HardwareBuffer;
+import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteCallback;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
/**
@@ -65,6 +67,12 @@
public static final int TYPE_CALLBACK = 4;
/**
+ * Key to access the boolean value passed in {#mOnBackNavigationDone} result bundle
+ * that represents if back navigation has been triggered.
+ */
+ public static final String KEY_TRIGGER_BACK = "TriggerBack";
+
+ /**
* Defines the type of back destinations a back even can lead to. This is used to define the
* type of animation that need to be run on SystemUI.
*/
@@ -79,13 +87,13 @@
private final int mType;
@Nullable
- private final SurfaceControl mDepartingWindowContainer;
+ private final RemoteAnimationTarget mDepartingAnimationTarget;
@Nullable
private final SurfaceControl mScreenshotSurface;
@Nullable
private final HardwareBuffer mScreenshotBuffer;
@Nullable
- private final RemoteCallback mRemoteCallback;
+ private final RemoteCallback mOnBackNavigationDone;
@Nullable
private final WindowConfiguration mTaskWindowConfiguration;
@Nullable
@@ -96,8 +104,9 @@
*
* @param type The {@link BackTargetType} of the destination (what will be
* displayed after the back action).
- * @param topWindowLeash The leash to animate away the current topWindow. The consumer
- * of the leash is responsible for removing it.
+ * @param departingAnimationTarget The remote animation target, containing a leash to animate
+ * away the departing window. The consumer of the leash is
+ * responsible for removing it.
* @param screenshotSurface The screenshot of the previous activity to be displayed.
* @param screenshotBuffer A buffer containing a screenshot used to display the activity.
* See {@link #getScreenshotHardwareBuffer()} for information
@@ -108,39 +117,39 @@
* @param onBackInvokedCallback The back callback registered by the current top level window.
*/
public BackNavigationInfo(@BackTargetType int type,
- @Nullable SurfaceControl topWindowLeash,
+ @Nullable RemoteAnimationTarget departingAnimationTarget,
@Nullable SurfaceControl screenshotSurface,
@Nullable HardwareBuffer screenshotBuffer,
@Nullable WindowConfiguration taskWindowConfiguration,
- @Nullable RemoteCallback onBackNavigationDone,
- @Nullable IOnBackInvokedCallback onBackInvokedCallback) {
+ @NonNull RemoteCallback onBackNavigationDone,
+ @NonNull IOnBackInvokedCallback onBackInvokedCallback) {
mType = type;
- mDepartingWindowContainer = topWindowLeash;
+ mDepartingAnimationTarget = departingAnimationTarget;
mScreenshotSurface = screenshotSurface;
mScreenshotBuffer = screenshotBuffer;
mTaskWindowConfiguration = taskWindowConfiguration;
- mRemoteCallback = onBackNavigationDone;
+ mOnBackNavigationDone = onBackNavigationDone;
mOnBackInvokedCallback = onBackInvokedCallback;
}
private BackNavigationInfo(@NonNull Parcel in) {
mType = in.readInt();
- mDepartingWindowContainer = in.readTypedObject(SurfaceControl.CREATOR);
+ mDepartingAnimationTarget = in.readTypedObject(RemoteAnimationTarget.CREATOR);
mScreenshotSurface = in.readTypedObject(SurfaceControl.CREATOR);
mScreenshotBuffer = in.readTypedObject(HardwareBuffer.CREATOR);
mTaskWindowConfiguration = in.readTypedObject(WindowConfiguration.CREATOR);
- mRemoteCallback = in.readTypedObject(RemoteCallback.CREATOR);
+ mOnBackNavigationDone = in.readTypedObject(RemoteCallback.CREATOR);
mOnBackInvokedCallback = IOnBackInvokedCallback.Stub.asInterface(in.readStrongBinder());
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mType);
- dest.writeTypedObject(mDepartingWindowContainer, flags);
+ dest.writeTypedObject(mDepartingAnimationTarget, flags);
dest.writeTypedObject(mScreenshotSurface, flags);
dest.writeTypedObject(mScreenshotBuffer, flags);
dest.writeTypedObject(mTaskWindowConfiguration, flags);
- dest.writeTypedObject(mRemoteCallback, flags);
+ dest.writeTypedObject(mOnBackNavigationDone, flags);
dest.writeStrongInterface(mOnBackInvokedCallback);
}
@@ -154,12 +163,13 @@
}
/**
- * Returns a leash to the top window container that needs to be animated. This can be null if
- * the back animation is controlled by the application.
+ * Returns a {@link RemoteAnimationTarget}, containing a leash to the top window container
+ * that needs to be animated. This can be null if the back animation is controlled by
+ * the application.
*/
@Nullable
- public SurfaceControl getDepartingWindowContainer() {
- return mDepartingWindowContainer;
+ public RemoteAnimationTarget getDepartingAnimationTarget() {
+ return mDepartingAnimationTarget;
}
/**
@@ -212,10 +222,14 @@
/**
* Callback to be called when the back preview is finished in order to notify the server that
* it can clean up the resources created for the animation.
+ *
+ * @param triggerBack Boolean indicating if back navigation has been triggered.
*/
- public void onBackNavigationFinished() {
- if (mRemoteCallback != null) {
- mRemoteCallback.sendResult(null);
+ public void onBackNavigationFinished(boolean triggerBack) {
+ if (mOnBackNavigationDone != null) {
+ Bundle result = new Bundle();
+ result.putBoolean(KEY_TRIGGER_BACK, triggerBack);
+ mOnBackNavigationDone.sendResult(result);
}
}
@@ -240,11 +254,11 @@
public String toString() {
return "BackNavigationInfo{"
+ "mType=" + typeToString(mType) + " (" + mType + ")"
- + ", mDepartingWindowContainer=" + mDepartingWindowContainer
+ + ", mDepartingAnimationTarget=" + mDepartingAnimationTarget
+ ", mScreenshotSurface=" + mScreenshotSurface
+ ", mTaskWindowConfiguration= " + mTaskWindowConfiguration
+ ", mScreenshotBuffer=" + mScreenshotBuffer
- + ", mRemoteCallback=" + mRemoteCallback
+ + ", mOnBackNavigationDone=" + mOnBackNavigationDone
+ ", mOnBackInvokedCallback=" + mOnBackInvokedCallback
+ '}';
}
diff --git a/core/java/android/window/IOnFpsCallbackListener.aidl b/core/java/android/window/ITaskFpsCallback.aidl
similarity index 95%
rename from core/java/android/window/IOnFpsCallbackListener.aidl
rename to core/java/android/window/ITaskFpsCallback.aidl
index 3091df3..aee403e9 100644
--- a/core/java/android/window/IOnFpsCallbackListener.aidl
+++ b/core/java/android/window/ITaskFpsCallback.aidl
@@ -19,7 +19,7 @@
/**
* @hide
*/
-oneway interface IOnFpsCallbackListener {
+oneway interface ITaskFpsCallback {
/**
* Reports the fps from the registered task
diff --git a/core/java/android/window/TaskFpsCallback.java b/core/java/android/window/TaskFpsCallback.java
index a8e01b6..19b9f28 100644
--- a/core/java/android/window/TaskFpsCallback.java
+++ b/core/java/android/window/TaskFpsCallback.java
@@ -21,8 +21,6 @@
import android.annotation.SystemApi;
import android.os.RemoteException;
-import java.util.concurrent.Executor;
-
/**
* Callback for sampling the frames per second for a task and its children.
* This should only be used by a system component that needs to listen to a task's
@@ -30,44 +28,19 @@
* Otherwise, ASurfaceTransaction_OnComplete callbacks should be used.
*
* Each callback can only register for receiving FPS report for one task id until
- * {@link WindowManager#unregister()} is called.
+ * {@link WindowManager#unregisterTaskFpsCallback()} is called.
*
* @hide
*/
@SystemApi
-public final class TaskFpsCallback {
+public abstract class TaskFpsCallback {
/**
- * Listener interface to receive frame per second of a task.
+ * Reports the fps from the registered task
+ * @param fps The frame per second of the task that has the registered task id
+ * and its children.
*/
- public interface OnFpsCallbackListener {
- /**
- * Reports the fps from the registered task
- * @param fps The frame per second of the task that has the registered task id
- * and its children.
- */
- void onFpsReported(float fps);
- }
-
- private final IOnFpsCallbackListener mListener;
-
- public TaskFpsCallback(@NonNull Executor executor, @NonNull OnFpsCallbackListener listener) {
- mListener = new IOnFpsCallbackListener.Stub() {
- @Override
- public void onFpsReported(float fps) {
- executor.execute(() -> {
- listener.onFpsReported(fps);
- });
- }
- };
- }
-
- /**
- * @hide
- */
- public IOnFpsCallbackListener getListener() {
- return mListener;
- }
+ public abstract void onFpsReported(float fps);
/**
* Dispatch the collected sample.
@@ -76,7 +49,7 @@
*/
@BinderThread
private static void dispatchOnFpsReported(
- @NonNull IOnFpsCallbackListener listener, float fps) {
+ @NonNull ITaskFpsCallback listener, float fps) {
try {
listener.onFpsReported(fps);
} catch (RemoteException e) {
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 5ca29e6..7718a3b 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -364,8 +364,13 @@
private final Point mEndRelOffset = new Point();
private ActivityManager.RunningTaskInfo mTaskInfo = null;
private boolean mAllowEnterPip;
- private int mStartRotation = ROTATION_UNDEFINED;
- private int mEndRotation = ROTATION_UNDEFINED;
+ private @Surface.Rotation int mStartRotation = ROTATION_UNDEFINED;
+ private @Surface.Rotation int mEndRotation = ROTATION_UNDEFINED;
+ /**
+ * The end rotation of the top activity after fixed rotation is finished. If the top
+ * activity is not in fixed rotation, it will be {@link ROTATION_UNDEFINED}.
+ */
+ private @Surface.Rotation int mEndFixedRotation = ROTATION_UNDEFINED;
private int mRotationAnimation = ROTATION_ANIMATION_UNSPECIFIED;
private @ColorInt int mBackgroundColor;
@@ -388,6 +393,7 @@
mAllowEnterPip = in.readBoolean();
mStartRotation = in.readInt();
mEndRotation = in.readInt();
+ mEndFixedRotation = in.readInt();
mRotationAnimation = in.readInt();
mBackgroundColor = in.readInt();
}
@@ -441,6 +447,11 @@
mEndRotation = end;
}
+ /** Sets end rotation that top activity will be launched to after fixed rotation. */
+ public void setEndFixedRotation(@Surface.Rotation int endFixedRotation) {
+ mEndFixedRotation = endFixedRotation;
+ }
+
/**
* Sets the app-requested animation type for rotation. Will be one of the
* ROTATION_ANIMATION_ values in {@link android.view.WindowManager.LayoutParams};
@@ -521,14 +532,21 @@
return mAllowEnterPip;
}
+ @Surface.Rotation
public int getStartRotation() {
return mStartRotation;
}
+ @Surface.Rotation
public int getEndRotation() {
return mEndRotation;
}
+ @Surface.Rotation
+ public int getEndFixedRotation() {
+ return mEndFixedRotation;
+ }
+
/** @return the rotation animation. */
public int getRotationAnimation() {
return mRotationAnimation;
@@ -555,6 +573,7 @@
dest.writeBoolean(mAllowEnterPip);
dest.writeInt(mStartRotation);
dest.writeInt(mEndRotation);
+ dest.writeInt(mEndFixedRotation);
dest.writeInt(mRotationAnimation);
dest.writeInt(mBackgroundColor);
}
@@ -584,7 +603,8 @@
return "{" + mContainer + "(" + mParent + ") leash=" + mLeash
+ " m=" + modeToString(mMode) + " f=" + flagsToString(mFlags) + " sb="
+ mStartAbsBounds + " eb=" + mEndAbsBounds + " eo=" + mEndRelOffset + " r="
- + mStartRotation + "->" + mEndRotation + ":" + mRotationAnimation + "}";
+ + mStartRotation + "->" + mEndRotation + ":" + mRotationAnimation
+ + " endFixedRotation=" + mEndFixedRotation + "}";
}
}
@@ -650,7 +670,7 @@
return options;
}
- public static AnimationOptions makeThumnbnailAnimOptions(HardwareBuffer srcThumb,
+ public static AnimationOptions makeThumbnailAnimOptions(HardwareBuffer srcThumb,
int startX, int startY, boolean scaleUp) {
AnimationOptions options = new AnimationOptions(
scaleUp ? ANIM_THUMBNAIL_SCALE_UP : ANIM_THUMBNAIL_SCALE_DOWN);
diff --git a/core/java/android/window/WindowContextController.java b/core/java/android/window/WindowContextController.java
index 17b675f..5007df5 100644
--- a/core/java/android/window/WindowContextController.java
+++ b/core/java/android/window/WindowContextController.java
@@ -16,16 +16,22 @@
package android.window;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.os.Bundle;
import android.os.IBinder;
+import android.util.Log;
import android.view.IWindowManager;
import android.view.WindowManager.LayoutParams.WindowType;
import com.android.internal.annotations.VisibleForTesting;
+import java.lang.annotation.Retention;
+
/**
* The controller to manage {@link WindowContext}, such as attaching to a window manager node or
* detaching from the current attached node. The user must call
@@ -35,13 +41,43 @@
* @hide
*/
public class WindowContextController {
+ // TODO(220049234): Disable attach debug logging before shipping.
+ private static final boolean DEBUG_ATTACH = true;
+ private static final String TAG = "WindowContextController";
+
/**
- * {@code true} to indicate that the {@code mToken} is associated with a
+ * {@link AttachStatus.STATUS_ATTACHED} to indicate that the {@code mToken} is associated with a
* {@link com.android.server.wm.DisplayArea}. Note that {@code mToken} is able to attach a
- * WindowToken after this flag sets to {@code true}.
+ * WindowToken after this flag sets to {@link AttachStatus.STATUS_ATTACHED}.
*/
@VisibleForTesting
- public boolean mAttachedToDisplayArea;
+ public int mAttachedToDisplayArea = AttachStatus.STATUS_INITIALIZED;
+
+ /**
+ * Status to indicate that the Window Context attach to a
+ * {@link com.android.server.wm.DisplayArea}.
+ */
+ @Retention(SOURCE)
+ @IntDef({AttachStatus.STATUS_INITIALIZED, AttachStatus.STATUS_ATTACHED,
+ AttachStatus.STATUS_DETACHED, AttachStatus.STATUS_FAILED})
+ public @interface AttachStatus{
+ /**
+ * The Window Context haven't attached to a {@link com.android.server.wm.DisplayArea}.
+ */
+ int STATUS_INITIALIZED = 0;
+ /**
+ * The Window Context has already attached to a {@link com.android.server.wm.DisplayArea}.
+ */
+ int STATUS_ATTACHED = 1;
+ /**
+ * The Window Context has detached from a {@link com.android.server.wm.DisplayArea}.
+ */
+ int STATUS_DETACHED = 2;
+ /**
+ * The Window Context fails to attach to a {@link com.android.server.wm.DisplayArea}.
+ */
+ int STATUS_FAILED = 3;
+ }
@NonNull
private final WindowTokenClient mToken;
@@ -65,11 +101,19 @@
* DisplayArea.
*/
public void attachToDisplayArea(@WindowType int type, int displayId, @Nullable Bundle options) {
- if (mAttachedToDisplayArea) {
+ if (mAttachedToDisplayArea == AttachStatus.STATUS_ATTACHED) {
throw new IllegalStateException("A Window Context can be only attached to "
+ "a DisplayArea once.");
}
- mAttachedToDisplayArea = mToken.attachToDisplayArea(type, displayId, options);
+ mAttachedToDisplayArea = mToken.attachToDisplayArea(type, displayId, options)
+ ? AttachStatus.STATUS_ATTACHED : AttachStatus.STATUS_FAILED;
+ if (mAttachedToDisplayArea == AttachStatus.STATUS_FAILED) {
+ Log.w(TAG, "attachToDisplayArea fail, type:" + type + ", displayId:"
+ + displayId);
+ } else if (DEBUG_ATTACH) {
+ Log.d(TAG, "attachToDisplayArea success, type:" + type + ", displayId:"
+ + displayId);
+ }
}
/**
@@ -93,18 +137,21 @@
* @see IWindowManager#attachWindowContextToWindowToken(IBinder, IBinder)
*/
public void attachToWindowToken(IBinder windowToken) {
- if (!mAttachedToDisplayArea) {
+ if (mAttachedToDisplayArea != AttachStatus.STATUS_ATTACHED) {
throw new IllegalStateException("The Window Context should have been attached"
- + " to a DisplayArea.");
+ + " to a DisplayArea. AttachToDisplayArea:" + mAttachedToDisplayArea);
}
mToken.attachToWindowToken(windowToken);
}
/** Detaches the window context from the node it's currently associated with. */
public void detachIfNeeded() {
- if (mAttachedToDisplayArea) {
+ if (mAttachedToDisplayArea == AttachStatus.STATUS_ATTACHED) {
mToken.detachFromWindowContainerIfNeeded();
- mAttachedToDisplayArea = false;
+ mAttachedToDisplayArea = AttachStatus.STATUS_DETACHED;
+ if (DEBUG_ATTACH) {
+ Log.d(TAG, "Detach Window Context.");
+ }
}
}
}
diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java
index 03de479..0503c40 100644
--- a/core/java/android/window/WindowOnBackInvokedDispatcher.java
+++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java
@@ -19,9 +19,11 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.compat.CompatChanges;
+import android.content.Context;
import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.text.TextUtils;
import android.util.Log;
import android.view.IWindow;
import android.view.IWindowSession;
@@ -50,10 +52,9 @@
private IWindowSession mWindowSession;
private IWindow mWindow;
private static final String TAG = "WindowOnBackDispatcher";
- private static final boolean DEBUG = false;
private static final String BACK_PREDICTABILITY_PROP = "persist.debug.back_predictability";
private static final boolean IS_BACK_PREDICTABILITY_ENABLED = SystemProperties
- .getInt(BACK_PREDICTABILITY_PROP, 0) > 0;
+ .getInt(BACK_PREDICTABILITY_PROP, 1) > 0;
/** Convenience hashmap to quickly decide if a callback has been added. */
private final HashMap<OnBackInvokedCallback, Integer> mAllCallbacks = new HashMap<>();
@@ -160,11 +161,11 @@
}
try {
if (callback == null) {
- mWindowSession.setOnBackInvokedCallback(mWindow, null);
+ mWindowSession.setOnBackInvokedCallback(mWindow, null, PRIORITY_DEFAULT);
} else {
int priority = mAllCallbacks.get(callback);
mWindowSession.setOnBackInvokedCallback(
- mWindow, new OnBackInvokedCallbackWrapper(callback, priority));
+ mWindow, new OnBackInvokedCallbackWrapper(callback, priority), priority);
}
} catch (RemoteException e) {
Log.e(TAG, "Failed to set OnBackInvokedCallback to WM. Error: " + e);
@@ -227,10 +228,23 @@
*
* Legacy back behavior dispatches KEYCODE_BACK instead of invoking the application registered
* {@link android.view.OnBackInvokedCallback}.
- *
*/
- public static boolean shouldUseLegacyBack() {
- return !CompatChanges.isChangeEnabled(DISPATCH_BACK_INVOCATION_AHEAD_OF_TIME)
- || !IS_BACK_PREDICTABILITY_ENABLED;
+ public static boolean isOnBackInvokedCallbackEnabled(@Nullable Context context) {
+ // new back is enabled if the app targets T AND the feature flag is enabled AND the app
+ // does not explicitly request legacy back.
+ boolean targetsT = CompatChanges.isChangeEnabled(DISPATCH_BACK_INVOCATION_AHEAD_OF_TIME);
+ boolean featureFlagEnabled = IS_BACK_PREDICTABILITY_ENABLED;
+ // If the context is null, we assume true and fallback on the two other conditions.
+ boolean appRequestsLegacy =
+ context == null || !context.getApplicationInfo().isOnBackInvokedCallbackEnabled();
+
+ if (DEBUG) {
+ Log.d(TAG, TextUtils.formatSimple("App: %s isChangeEnabled=%s featureFlagEnabled=%s "
+ + "onBackInvokedEnabled=%s",
+ context != null ? context.getApplicationInfo().packageName : "null context",
+ targetsT, featureFlagEnabled, !appRequestsLegacy));
+ }
+
+ return targetsT && featureFlagEnabled && !appRequestsLegacy;
}
}
diff --git a/core/java/com/android/internal/infra/AndroidFuture.java b/core/java/com/android/internal/infra/AndroidFuture.java
index 0443ad0..0835824 100644
--- a/core/java/com/android/internal/infra/AndroidFuture.java
+++ b/core/java/com/android/internal/infra/AndroidFuture.java
@@ -455,7 +455,14 @@
if (mSourceU != null) {
// T done
mResultT = (T) res;
- mSourceU.whenComplete(this);
+
+ // Subscribe to the second job completion.
+ mSourceU.whenComplete((r, e) -> {
+ // Mark the first job completion by setting mSourceU to null, so that next time
+ // the execution flow goes to the else case below.
+ mSourceU = null;
+ accept(r, e);
+ });
} else {
// U done
try {
diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java
index e1a67d8..34c47ed 100644
--- a/core/java/com/android/internal/jank/FrameTracker.java
+++ b/core/java/com/android/internal/jank/FrameTracker.java
@@ -98,6 +98,7 @@
private final Handler mHandler;
private final ChoreographerWrapper mChoreographer;
private final Object mLock = InteractionJankMonitor.getInstance().getLock();
+ private final boolean mDeferMonitoring;
@VisibleForTesting
public final boolean mSurfaceOnly;
@@ -153,6 +154,7 @@
mHandler = handler;
mChoreographer = choreographer;
mSurfaceControlWrapper = surfaceControlWrapper;
+ mDeferMonitoring = config.shouldDeferMonitor();
// HWUI instrumentation init.
mRendererWrapper = mSurfaceOnly ? null : renderer;
@@ -228,12 +230,25 @@
*/
public void begin() {
synchronized (mLock) {
- mBeginVsyncId = mChoreographer.getVsyncId() + 1;
+ final long currentVsync = mChoreographer.getVsyncId();
+ // In normal case, we should begin at the next frame,
+ // the id of the next frame is not simply increased by 1,
+ // but we can exclude the current frame at least.
+ mBeginVsyncId = mDeferMonitoring ? currentVsync + 1 : currentVsync;
if (DEBUG) {
- Log.d(TAG, "begin: " + mSession.getName() + ", begin=" + mBeginVsyncId);
+ Log.d(TAG, "begin: " + mSession.getName() + ", begin=" + mBeginVsyncId
+ + ", defer=" + mDeferMonitoring);
}
if (mSurfaceControl != null) {
- postTraceStartMarker();
+ if (mDeferMonitoring) {
+ // Normal case, we begin the instrument from the very beginning,
+ // except the first frame.
+ postTraceStartMarker();
+ } else {
+ // If we don't begin the instrument from the very beginning,
+ // there is no need to skip the frame where the begin invocation happens.
+ beginInternal();
+ }
mSurfaceControlWrapper.addJankStatsListener(this, mSurfaceControl);
}
if (!mSurfaceOnly) {
@@ -247,15 +262,18 @@
*/
@VisibleForTesting
public void postTraceStartMarker() {
- mChoreographer.mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, () -> {
- synchronized (mLock) {
- if (mCancelled || mEndVsyncId != INVALID_ID) {
- return;
- }
- mTracingStarted = true;
- Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId);
+ mChoreographer.mChoreographer.postCallback(
+ Choreographer.CALLBACK_INPUT, this::beginInternal, null);
+ }
+
+ private void beginInternal() {
+ synchronized (mLock) {
+ if (mCancelled || mEndVsyncId != INVALID_ID) {
+ return;
}
- }, null);
+ mTracingStarted = true;
+ Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId);
+ }
}
/**
@@ -464,8 +482,7 @@
if (info.surfaceControlCallbackFired) {
totalFramesCount++;
boolean missedFrame = false;
- if ((info.jankType & PREDICTION_ERROR) != 0
- || ((info.jankType & JANK_APP_DEADLINE_MISSED) != 0)) {
+ if ((info.jankType & JANK_APP_DEADLINE_MISSED) != 0) {
Log.w(TAG, "Missed App frame:" + info.jankType);
missedAppFramesCount++;
missedFrame = true;
@@ -473,7 +490,8 @@
if ((info.jankType & DISPLAY_HAL) != 0
|| (info.jankType & JANK_SURFACEFLINGER_DEADLINE_MISSED) != 0
|| (info.jankType & JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED) != 0
- || (info.jankType & SURFACE_FLINGER_SCHEDULING) != 0) {
+ || (info.jankType & SURFACE_FLINGER_SCHEDULING) != 0
+ || (info.jankType & PREDICTION_ERROR) != 0) {
Log.w(TAG, "Missed SF frame:" + info.jankType);
missedSfFramesCount++;
missedFrame = true;
diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java
index 5a66e9a..3746bfd 100644
--- a/core/java/com/android/internal/jank/InteractionJankMonitor.java
+++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java
@@ -717,6 +717,7 @@
private final boolean mSurfaceOnly;
private final SurfaceControl mSurfaceControl;
private final @CujType int mCujType;
+ private final boolean mDeferMonitor;
/**
* A builder for building Configuration. {@link #setView(View)} is essential
@@ -733,6 +734,7 @@
private boolean mAttrSurfaceOnly;
private SurfaceControl mAttrSurfaceControl;
private @CujType int mAttrCujType;
+ private boolean mAttrDeferMonitor = true;
/**
* Creates a builder which instruments only surface.
@@ -823,6 +825,16 @@
}
/**
+ * Indicates if the instrument should be deferred to the next frame.
+ * @param defer true if the instrument should be deferred to the next frame.
+ * @return builder
+ */
+ public Builder setDeferMonitorForAnimationStart(boolean defer) {
+ mAttrDeferMonitor = defer;
+ return this;
+ }
+
+ /**
* Builds the {@link Configuration} instance
* @return the instance of {@link Configuration}
* @throws IllegalArgumentException if any invalid attribute is set
@@ -830,12 +842,14 @@
public Configuration build() throws IllegalArgumentException {
return new Configuration(
mAttrCujType, mAttrView, mAttrTag, mAttrTimeout,
- mAttrSurfaceOnly, mAttrContext, mAttrSurfaceControl);
+ mAttrSurfaceOnly, mAttrContext, mAttrSurfaceControl,
+ mAttrDeferMonitor);
}
}
private Configuration(@CujType int cuj, View view, String tag, long timeout,
- boolean surfaceOnly, Context context, SurfaceControl surfaceControl) {
+ boolean surfaceOnly, Context context, SurfaceControl surfaceControl,
+ boolean deferMonitor) {
mCujType = cuj;
mTag = tag;
mTimeout = timeout;
@@ -845,6 +859,7 @@
? context
: (view != null ? view.getContext().getApplicationContext() : null);
mSurfaceControl = surfaceControl;
+ mDeferMonitor = deferMonitor;
validate();
}
@@ -901,6 +916,13 @@
Context getContext() {
return mContext;
}
+
+ /**
+ * @return true if the monitoring should be deferred to the next frame, false otherwise.
+ */
+ public boolean shouldDeferMonitor() {
+ return mDeferMonitor;
+ }
}
/**
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 46f54ce..099d1fc 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -24,6 +24,7 @@
import android.hardware.biometrics.IBiometricSysuiReceiver;
import android.hardware.biometrics.PromptInfo;
import android.hardware.fingerprint.IUdfpsHbmListener;
+import android.media.INearbyMediaDevicesProvider;
import android.media.MediaRoute2Info;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
@@ -311,4 +312,10 @@
in MediaRoute2Info routeInfo,
in Icon appIcon,
in CharSequence appName);
+
+ /** Registers a nearby media devices provider. */
+ void registerNearbyMediaDevicesProvider(in INearbyMediaDevicesProvider provider);
+
+ /** Unregisters a nearby media devices provider. */
+ void unregisterNearbyMediaDevicesProvider(in INearbyMediaDevicesProvider provider);
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 6c17df1..9e70392 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -24,6 +24,7 @@
import android.hardware.biometrics.IBiometricSysuiReceiver;
import android.hardware.biometrics.PromptInfo;
import android.hardware.fingerprint.IUdfpsHbmListener;
+import android.media.INearbyMediaDevicesProvider;
import android.media.MediaRoute2Info;
import android.net.Uri;
import android.os.Bundle;
@@ -102,6 +103,9 @@
void shutdown();
void reboot(boolean safeMode);
+ /** just restarts android without rebooting device. Used for some feature flags. */
+ void restart();
+
void addTile(in ComponentName tile);
void remTile(in ComponentName tile);
void clickTile(in ComponentName tile);
@@ -211,4 +215,10 @@
in MediaRoute2Info routeInfo,
in Icon appIcon,
in CharSequence appName);
+
+ /** Registers a nearby media devices provider. */
+ void registerNearbyMediaDevicesProvider(in INearbyMediaDevicesProvider provider);
+
+ /** Unregisters a nearby media devices provider. */
+ void unregisterNearbyMediaDevicesProvider(in INearbyMediaDevicesProvider provider);
}
diff --git a/core/java/com/android/internal/usb/DumpUtils.java b/core/java/com/android/internal/usb/DumpUtils.java
index b32a6b0..1eb446e 100644
--- a/core/java/com/android/internal/usb/DumpUtils.java
+++ b/core/java/com/android/internal/usb/DumpUtils.java
@@ -249,7 +249,7 @@
dump.write("is_power_transfer_limited", UsbPortStatusProto.IS_POWER_TRANSFER_LIMITED,
status.isPowerTransferLimited());
dump.write("usb_power_brick_status", UsbPortStatusProto.USB_POWER_BRICK_STATUS,
- UsbPort.powerBrickStatusToString(status.getPowerBrickStatus()));
+ UsbPort.powerBrickConnectionStatusToString(status.getPowerBrickConnectionStatus()));
dump.end(token);
}
}
diff --git a/core/java/com/android/internal/util/PerfettoTrigger.java b/core/java/com/android/internal/util/PerfettoTrigger.java
index c758504..f3af528 100644
--- a/core/java/com/android/internal/util/PerfettoTrigger.java
+++ b/core/java/com/android/internal/util/PerfettoTrigger.java
@@ -18,6 +18,7 @@
import android.os.SystemClock;
import android.util.Log;
+import android.util.SparseLongArray;
import java.io.IOException;
@@ -28,8 +29,9 @@
public class PerfettoTrigger {
private static final String TAG = "PerfettoTrigger";
private static final String TRIGGER_COMMAND = "/system/bin/trigger_perfetto";
- private static final long THROTTLE_MILLIS = 60000;
- private static volatile long sLastTriggerTime = -THROTTLE_MILLIS;
+ private static final long THROTTLE_MILLIS = 300000;
+ private static final SparseLongArray sLastInvocationPerTrigger = new SparseLongArray(100);
+ private static final Object sLock = new Object();
/**
* @param triggerName The name of the trigger. Must match the value defined in the AOT
@@ -38,18 +40,23 @@
public static void trigger(String triggerName) {
// Trace triggering has a non-negligible cost (fork+exec).
// To mitigate potential excessive triggering by the API client we ignore calls that happen
- // too quickl after the most recent trigger.
- long sinceLastTrigger = SystemClock.elapsedRealtime() - sLastTriggerTime;
- if (sinceLastTrigger < THROTTLE_MILLIS) {
- Log.v(TAG, "Not triggering " + triggerName + " - not enough time since last trigger");
- return;
+ // too quickly after the most recent trigger.
+ synchronized (sLock) {
+ long lastTrigger = sLastInvocationPerTrigger.get(triggerName.hashCode());
+ long sinceLastTrigger = SystemClock.elapsedRealtime() - lastTrigger;
+ if (sinceLastTrigger < THROTTLE_MILLIS) {
+ Log.v(TAG, "Not triggering " + triggerName
+ + " - not enough time since last trigger");
+ return;
+ }
+
+ sLastInvocationPerTrigger.put(triggerName.hashCode(), SystemClock.elapsedRealtime());
}
try {
ProcessBuilder pb = new ProcessBuilder(TRIGGER_COMMAND, triggerName);
Log.v(TAG, "Triggering " + String.join(" ", pb.command()));
pb.start();
- sLastTriggerTime = SystemClock.elapsedRealtime();
} catch (IOException e) {
Log.w(TAG, "Failed to trigger " + triggerName, e);
}
diff --git a/core/java/com/android/internal/util/UserIcons.java b/core/java/com/android/internal/util/UserIcons.java
index 17b84ff..d9c1e57 100644
--- a/core/java/com/android/internal/util/UserIcons.java
+++ b/core/java/com/android/internal/util/UserIcons.java
@@ -46,11 +46,21 @@
* Converts a given drawable to a bitmap.
*/
public static Bitmap convertToBitmap(Drawable icon) {
+ return convertToBitmapAtSize(icon, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
+ }
+
+ /**
+ * Converts a given drawable to a bitmap, with width and height equal to the default icon size.
+ */
+ public static Bitmap convertToBitmapAtUserIconSize(Resources res, Drawable icon) {
+ int size = res.getDimensionPixelSize(R.dimen.user_icon_size);
+ return convertToBitmapAtSize(icon, size, size);
+ }
+
+ private static Bitmap convertToBitmapAtSize(Drawable icon, int width, int height) {
if (icon == null) {
return null;
}
- final int width = icon.getIntrinsicWidth();
- final int height = icon.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
icon.setBounds(0, 0, width, height);
diff --git a/core/java/com/android/internal/util/dump/DumpableContainerImpl.java b/core/java/com/android/internal/util/dump/DumpableContainerImpl.java
index 2e56ebf..ccec6c6 100644
--- a/core/java/com/android/internal/util/dump/DumpableContainerImpl.java
+++ b/core/java/com/android/internal/util/dump/DumpableContainerImpl.java
@@ -47,8 +47,10 @@
Objects.requireNonNull(name, () -> "name of" + dumpable);
if (mDumpables.containsKey(name)) {
- Log.e(TAG, "addDumpable(): ignoring " + dumpable + " as there is already a dumpable"
- + " with that name (" + name + "): " + mDumpables.get(name));
+ if (DEBUG) {
+ Log.d(TAG, "addDumpable(): ignoring " + dumpable + " as there is already a dumpable"
+ + " with that name (" + name + "): " + mDumpables.get(name));
+ }
return false;
}
diff --git a/core/java/com/android/internal/view/RotationPolicy.java b/core/java/com/android/internal/view/RotationPolicy.java
index cfb2bf9..869da1f 100644
--- a/core/java/com/android/internal/view/RotationPolicy.java
+++ b/core/java/com/android/internal/view/RotationPolicy.java
@@ -20,15 +20,14 @@
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.ContentObserver;
-import android.graphics.Point;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
+import android.util.DisplayMetrics;
import android.util.Log;
-import android.view.Display;
import android.view.IWindowManager;
import android.view.Surface;
import android.view.WindowManagerGlobal;
@@ -73,19 +72,16 @@
* otherwise Configuration.ORIENTATION_UNDEFINED if any orientation is lockable.
*/
public static int getRotationLockOrientation(Context context) {
- if (!areAllRotationsAllowed(context)) {
- final Point size = new Point();
- final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
- try {
- final int displayId = context.getDisplayId();
- wm.getInitialDisplaySize(displayId, size);
- return size.x < size.y ?
- Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
- } catch (RemoteException e) {
- Log.w(TAG, "Unable to get the display size");
- }
+ if (areAllRotationsAllowed(context)) {
+ return Configuration.ORIENTATION_UNDEFINED;
}
- return Configuration.ORIENTATION_UNDEFINED;
+ final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
+ final int rotation =
+ context.getResources().getConfiguration().windowConfiguration.getRotation();
+ final boolean rotated = rotation % 2 != 0;
+ final int w = rotated ? metrics.heightPixels : metrics.widthPixels;
+ final int h = rotated ? metrics.widthPixels : metrics.heightPixels;
+ return w < h ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
/**
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java
index 78bb53d..5fa4a65 100644
--- a/core/java/com/android/internal/widget/ConversationLayout.java
+++ b/core/java/com/android/internal/widget/ConversationLayout.java
@@ -150,6 +150,7 @@
private Icon mShortcutIcon;
private View mAppNameDivider;
private TouchDelegateComposite mTouchDelegate = new TouchDelegateComposite(this);
+ private ArrayList<MessagingGroup> mToRecycle = new ArrayList<>();
public ConversationLayout(@NonNull Context context) {
super(context);
@@ -472,6 +473,12 @@
updateTitleAndNamesDisplay();
updateConversationLayout();
+
+ // Recycle everything at the end of the update, now that we know it's no longer needed.
+ for (MessagingGroup group : mToRecycle) {
+ group.recycle();
+ }
+ mToRecycle.clear();
}
/**
@@ -745,18 +752,18 @@
MessagingGroup group = oldGroups.get(i);
if (!mGroups.contains(group)) {
List<MessagingMessage> messages = group.getMessages();
- Runnable endRunnable = () -> {
- mMessagingLinearLayout.removeTransientView(group);
- group.recycle();
- };
-
boolean wasShown = group.isShown();
mMessagingLinearLayout.removeView(group);
if (wasShown && !MessagingLinearLayout.isGone(group)) {
mMessagingLinearLayout.addTransientView(group, 0);
- group.removeGroupAnimated(endRunnable);
+ group.removeGroupAnimated(() -> {
+ mMessagingLinearLayout.removeTransientView(group);
+ group.recycle();
+ });
} else {
- endRunnable.run();
+ // Defer recycling until after the update is done, since we may still need the
+ // old group around to perform other updates.
+ mToRecycle.add(group);
}
mMessages.removeAll(messages);
mHistoricMessages.removeAll(messages);
diff --git a/core/java/com/android/internal/widget/floatingtoolbar/LocalFloatingToolbarPopup.java b/core/java/com/android/internal/widget/floatingtoolbar/LocalFloatingToolbarPopup.java
index 80d8bd7..8c61a12 100644
--- a/core/java/com/android/internal/widget/floatingtoolbar/LocalFloatingToolbarPopup.java
+++ b/core/java/com/android/internal/widget/floatingtoolbar/LocalFloatingToolbarPopup.java
@@ -1475,6 +1475,7 @@
contentContainer.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
contentContainer.setTag(FloatingToolbar.FLOATING_TOOLBAR_TAG);
+ contentContainer.setContentDescription(FloatingToolbar.FLOATING_TOOLBAR_TAG);
contentContainer.setClipToOutline(true);
return contentContainer;
}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 63b704c..4aa00f6 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -64,7 +64,6 @@
"libbase",
"libcutils",
"libharfbuzz_ng",
- "libhwui",
"liblog",
"libminikin",
"libz",
@@ -188,6 +187,7 @@
"android_hardware_HardwareBuffer.cpp",
"android_hardware_SensorManager.cpp",
"android_hardware_SerialPort.cpp",
+ "android_hardware_SyncFence.cpp",
"android_hardware_UsbDevice.cpp",
"android_hardware_UsbDeviceConnection.cpp",
"android_hardware_UsbRequest.cpp",
@@ -265,6 +265,7 @@
"libui",
"libgraphicsenv",
"libgui",
+ "libhwui",
"libmediandk",
"libpermission",
"libsensor",
@@ -343,9 +344,21 @@
],
static_libs: [
"libandroidfw",
- "libcompiler_rt",
- "libutils",
+ "libbinary_parse",
+ "libdng_sdk",
+ "libft2",
"libhostgraphics",
+ "libhwui",
+ "libimage_type_recognition",
+ "libjpeg",
+ "libpiex",
+ "libpng",
+ "libtiff_directory",
+ "libui-types",
+ "libutils",
+ "libwebp-decode",
+ "libwebp-encode",
+ "libwuffs_mirror_release_c",
],
},
linux_glibc: {
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index cde71cf..eedf7fa 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -82,6 +82,7 @@
extern int register_android_hardware_HardwareBuffer(JNIEnv *env);
extern int register_android_hardware_SensorManager(JNIEnv *env);
extern int register_android_hardware_SerialPort(JNIEnv *env);
+extern int register_android_hardware_SyncFence(JNIEnv* env);
extern int register_android_hardware_UsbDevice(JNIEnv *env);
extern int register_android_hardware_UsbDeviceConnection(JNIEnv *env);
extern int register_android_hardware_UsbRequest(JNIEnv *env);
@@ -1601,6 +1602,7 @@
REG_JNI(register_android_hardware_HardwareBuffer),
REG_JNI(register_android_hardware_SensorManager),
REG_JNI(register_android_hardware_SerialPort),
+ REG_JNI(register_android_hardware_SyncFence),
REG_JNI(register_android_hardware_UsbDevice),
REG_JNI(register_android_hardware_UsbDeviceConnection),
REG_JNI(register_android_hardware_UsbRequest),
diff --git a/core/jni/LayoutlibLoader.cpp b/core/jni/LayoutlibLoader.cpp
index 3e513df..93ba23b 100644
--- a/core/jni/LayoutlibLoader.cpp
+++ b/core/jni/LayoutlibLoader.cpp
@@ -14,15 +14,31 @@
* limitations under the License.
*/
-#include "jni.h"
-#include "core_jni_helpers.h"
-
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android/graphics/jni_runtime.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/jni_macros.h>
#include <unicode/putil.h>
+#include <unicode/udata.h>
+
#include <clocale>
#include <sstream>
#include <unordered_map>
#include <vector>
+#include "core_jni_helpers.h"
+#include "jni.h"
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#endif
+
+#include <iostream>
+
using namespace std;
/*
@@ -33,6 +49,33 @@
*/
static JavaVM* javaVM;
+static jclass bridge;
+static jclass layoutLog;
+static jmethodID getLogId;
+static jmethodID logMethodId;
+
+extern int register_android_os_Binder(JNIEnv* env);
+extern int register_libcore_util_NativeAllocationRegistry_Delegate(JNIEnv* env);
+
+typedef void (*FreeFunction)(void*);
+
+static void NativeAllocationRegistry_Delegate_nativeApplyFreeFunction(JNIEnv*, jclass,
+ jlong freeFunction,
+ jlong ptr) {
+ void* nativePtr = reinterpret_cast<void*>(static_cast<uintptr_t>(ptr));
+ FreeFunction nativeFreeFunction =
+ reinterpret_cast<FreeFunction>(static_cast<uintptr_t>(freeFunction));
+ nativeFreeFunction(nativePtr);
+}
+
+static JNINativeMethod gMethods[] = {
+ NATIVE_METHOD(NativeAllocationRegistry_Delegate, nativeApplyFreeFunction, "(JJ)V"),
+};
+
+int register_libcore_util_NativeAllocationRegistry_Delegate(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "libcore/util/NativeAllocationRegistry_Delegate", gMethods,
+ NELEM(gMethods));
+}
namespace android {
@@ -47,6 +90,7 @@
extern int register_android_database_SQLiteDebug(JNIEnv* env);
extern int register_android_os_FileObserver(JNIEnv* env);
extern int register_android_os_MessageQueue(JNIEnv* env);
+extern int register_android_os_Parcel(JNIEnv* env);
extern int register_android_os_SystemClock(JNIEnv* env);
extern int register_android_os_SystemProperties(JNIEnv* env);
extern int register_android_os_Trace(JNIEnv* env);
@@ -54,6 +98,11 @@
extern int register_android_util_EventLog(JNIEnv* env);
extern int register_android_util_Log(JNIEnv* env);
extern int register_android_util_jar_StrictJarFile(JNIEnv* env);
+extern int register_android_view_KeyCharacterMap(JNIEnv* env);
+extern int register_android_view_KeyEvent(JNIEnv* env);
+extern int register_android_view_MotionEvent(JNIEnv* env);
+extern int register_android_view_ThreadedRenderer(JNIEnv* env);
+extern int register_android_view_VelocityTracker(JNIEnv* env);
extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env);
#define REG_JNI(name) { name }
@@ -78,8 +127,10 @@
{"android.content.res.StringBlock", REG_JNI(register_android_content_StringBlock)},
{"android.content.res.XmlBlock", REG_JNI(register_android_content_XmlBlock)},
#ifdef __linux__
+ {"android.os.Binder", REG_JNI(register_android_os_Binder)},
{"android.os.FileObserver", REG_JNI(register_android_os_FileObserver)},
{"android.os.MessageQueue", REG_JNI(register_android_os_MessageQueue)},
+ {"android.os.Parcel", REG_JNI(register_android_os_Parcel)},
#endif
{"android.os.SystemClock", REG_JNI(register_android_os_SystemClock)},
{"android.os.SystemProperties", REG_JNI(register_android_os_SystemProperties)},
@@ -88,11 +139,15 @@
{"android.util.EventLog", REG_JNI(register_android_util_EventLog)},
{"android.util.Log", REG_JNI(register_android_util_Log)},
{"android.util.jar.StrictJarFile", REG_JNI(register_android_util_jar_StrictJarFile)},
+ {"android.view.KeyCharacterMap", REG_JNI(register_android_view_KeyCharacterMap)},
+ {"android.view.KeyEvent", REG_JNI(register_android_view_KeyEvent)},
+ {"android.view.MotionEvent", REG_JNI(register_android_view_MotionEvent)},
+ {"android.view.VelocityTracker", REG_JNI(register_android_view_VelocityTracker)},
{"com.android.internal.util.VirtualRefBasePtr",
REG_JNI(register_com_android_internal_util_VirtualRefBasePtr)},
+ {"libcore.util.NativeAllocationRegistry_Delegate",
+ REG_JNI(register_libcore_util_NativeAllocationRegistry_Delegate)},
};
-// Vector to store the names of classes that need delegates of their native methods
-static vector<string> classesToDelegate;
static int register_jni_procs(const std::unordered_map<std::string, RegJNIRec>& jniRegMap,
const vector<string>& classesToRegister, JNIEnv* env) {
@@ -102,36 +157,17 @@
return -1;
}
}
+
+ if (register_android_graphics_classes(env) < 0) {
+ return -1;
+ }
+
return 0;
}
int AndroidRuntime::registerNativeMethods(JNIEnv* env,
const char* className, const JNINativeMethod* gMethods, int numMethods) {
- string classNameString = string(className);
- if (find(classesToDelegate.begin(), classesToDelegate.end(), classNameString)
- != classesToDelegate.end()) {
- // Register native methods to the delegate class <classNameString>_NativeDelegate
- // by adding _Original to the name of each method.
- replace(classNameString.begin(), classNameString.end(), '$', '_');
- string delegateClassName = classNameString + "_NativeDelegate";
- jclass clazz = env->FindClass(delegateClassName.c_str());
- JNINativeMethod gTypefaceDelegateMethods[numMethods];
- for (int i = 0; i < numMethods; i++) {
- JNINativeMethod gTypefaceMethod = gMethods[i];
- string newName = string(gTypefaceMethod.name) + "_Original";
- gTypefaceDelegateMethods[i].name = strdup(newName.c_str());
- gTypefaceDelegateMethods[i].signature = gTypefaceMethod.signature;
- gTypefaceDelegateMethods[i].fnPtr = gTypefaceMethod.fnPtr;
- }
- int result = env->RegisterNatives(clazz, gTypefaceDelegateMethods, numMethods);
- for (int i = 0; i < numMethods; i++) {
- free((char*)gTypefaceDelegateMethods[i].name);
- }
- return result;
- }
-
- jclass clazz = env->FindClass(className);
- return env->RegisterNatives(clazz, gMethods, numMethods);
+ return jniRegisterNativeMethods(env, className, gMethods, numMethods);
}
JNIEnv* AndroidRuntime::getJNIEnv() {
@@ -164,6 +200,125 @@
return result;
}
+void LayoutlibLogger(base::LogId, base::LogSeverity severity, const char* tag, const char* file,
+ unsigned int line, const char* message) {
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ jint logPrio = severity;
+ jstring tagString = env->NewStringUTF(tag);
+ jstring messageString = env->NewStringUTF(message);
+
+ jobject bridgeLog = env->CallStaticObjectMethod(bridge, getLogId);
+
+ env->CallVoidMethod(bridgeLog, logMethodId, logPrio, tagString, messageString);
+
+ env->DeleteLocalRef(tagString);
+ env->DeleteLocalRef(messageString);
+ env->DeleteLocalRef(bridgeLog);
+}
+
+void LayoutlibAborter(const char* abort_message) {
+ // Layoutlib should not call abort() as it would terminate Studio.
+ // Throw an exception back to Java instead.
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ jniThrowRuntimeException(env, "The Android framework has encountered a fatal error");
+}
+
+// This method has been copied/adapted from system/core/init/property_service.cpp
+// If the ro.product.cpu.abilist* properties have not been explicitly
+// set, derive them from ro.system.product.cpu.abilist* properties.
+static void property_initialize_ro_cpu_abilist() {
+ const std::string EMPTY = "";
+ const char* kAbilistProp = "ro.product.cpu.abilist";
+ const char* kAbilist32Prop = "ro.product.cpu.abilist32";
+ const char* kAbilist64Prop = "ro.product.cpu.abilist64";
+
+ // If the properties are defined explicitly, just use them.
+ if (base::GetProperty(kAbilistProp, EMPTY) != EMPTY) {
+ return;
+ }
+
+ std::string abilist32_prop_val;
+ std::string abilist64_prop_val;
+ const auto abilist32_prop = "ro.system.product.cpu.abilist32";
+ const auto abilist64_prop = "ro.system.product.cpu.abilist64";
+ abilist32_prop_val = base::GetProperty(abilist32_prop, EMPTY);
+ abilist64_prop_val = base::GetProperty(abilist64_prop, EMPTY);
+
+ // Merge ABI lists for ro.product.cpu.abilist
+ auto abilist_prop_val = abilist64_prop_val;
+ if (abilist32_prop_val != EMPTY) {
+ if (abilist_prop_val != EMPTY) {
+ abilist_prop_val += ",";
+ }
+ abilist_prop_val += abilist32_prop_val;
+ }
+
+ // Set these properties
+ const std::pair<const char*, const std::string&> set_prop_list[] = {
+ {kAbilistProp, abilist_prop_val},
+ {kAbilist32Prop, abilist32_prop_val},
+ {kAbilist64Prop, abilist64_prop_val},
+ };
+ for (const auto& [prop, prop_val] : set_prop_list) {
+ base::SetProperty(prop, prop_val);
+ }
+}
+
+static void* mmapFile(const char* dataFilePath) {
+#ifdef _WIN32
+ // Windows needs file path in wide chars to handle unicode file paths
+ int size = MultiByteToWideChar(CP_UTF8, 0, dataFilePath, -1, NULL, 0);
+ std::vector<wchar_t> wideDataFilePath(size);
+ MultiByteToWideChar(CP_UTF8, 0, dataFilePath, -1, wideDataFilePath.data(), size);
+ HANDLE file =
+ CreateFileW(wideDataFilePath.data(), GENERIC_READ, FILE_SHARE_READ, nullptr,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, nullptr);
+ if ((HANDLE)INVALID_HANDLE_VALUE == file) {
+ return nullptr;
+ }
+
+ struct CloseHandleWrapper {
+ void operator()(HANDLE h) { CloseHandle(h); }
+ };
+ std::unique_ptr<void, CloseHandleWrapper> mmapHandle(
+ CreateFileMapping(file, nullptr, PAGE_READONLY, 0, 0, nullptr));
+ if (!mmapHandle) {
+ return nullptr;
+ }
+ return MapViewOfFile(mmapHandle.get(), FILE_MAP_READ, 0, 0, 0);
+#else
+ int fd = open(dataFilePath, O_RDONLY);
+ if (fd == -1) {
+ return nullptr;
+ }
+
+ struct stat sb;
+ if (fstat(fd, &sb) == -1) {
+ close(fd);
+ return nullptr;
+ }
+
+ void* addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ if (addr == MAP_FAILED) {
+ close(fd);
+ return nullptr;
+ }
+
+ close(fd);
+ return addr;
+#endif
+}
+
+static bool init_icu(const char* dataPath) {
+ void* addr = mmapFile(dataPath);
+ UErrorCode err = U_ZERO_ERROR;
+ udata_setCommonData(addr, &err);
+ if (err != U_ZERO_ERROR) {
+ return false;
+ }
+ return true;
+}
+
} // namespace android
using namespace android;
@@ -175,37 +330,82 @@
return JNI_ERR;
}
+ init_android_graphics();
+
// Configuration is stored as java System properties.
// Get a reference to System.getProperty
jclass system = FindClassOrDie(env, "java/lang/System");
jmethodID getPropertyMethod = GetStaticMethodIDOrDie(env, system, "getProperty",
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
- // Get the names of classes that have to delegate their native methods
- auto delegateNativesToNativesString =
- (jstring) env->CallStaticObjectMethod(system,
- getPropertyMethod, env->NewStringUTF("delegate_natives_to_natives"),
- env->NewStringUTF(""));
- classesToDelegate = parseCsv(env, delegateNativesToNativesString);
-
// Get the names of classes that need to register their native methods
auto nativesClassesJString =
- (jstring) env->CallStaticObjectMethod(system,
- getPropertyMethod, env->NewStringUTF("native_classes"),
- env->NewStringUTF(""));
+ (jstring)env->CallStaticObjectMethod(system, getPropertyMethod,
+ env->NewStringUTF("core_native_classes"),
+ env->NewStringUTF(""));
vector<string> classesToRegister = parseCsv(env, nativesClassesJString);
+ jstring registerProperty =
+ (jstring)env->CallStaticObjectMethod(system, getPropertyMethod,
+ env->NewStringUTF(
+ "register_properties_during_load"),
+ env->NewStringUTF(""));
+ const char* registerPropertyString = env->GetStringUTFChars(registerProperty, 0);
+ if (strcmp(registerPropertyString, "true") == 0) {
+ // Set the system properties first as they could be used in the static initialization of
+ // other classes
+ if (register_android_os_SystemProperties(env) < 0) {
+ return JNI_ERR;
+ }
+ classesToRegister.erase(find(classesToRegister.begin(), classesToRegister.end(),
+ "android.os.SystemProperties"));
+ bridge = FindClassOrDie(env, "com/android/layoutlib/bridge/Bridge");
+ bridge = MakeGlobalRefOrDie(env, bridge);
+ jmethodID setSystemPropertiesMethod =
+ GetStaticMethodIDOrDie(env, bridge, "setSystemProperties", "()V");
+ env->CallStaticVoidMethod(bridge, setSystemPropertiesMethod);
+ property_initialize_ro_cpu_abilist();
+ }
+ env->ReleaseStringUTFChars(registerProperty, registerPropertyString);
+
if (register_jni_procs(gRegJNIMap, classesToRegister, env) < 0) {
return JNI_ERR;
}
// Set the location of ICU data
- auto stringPath = (jstring) env->CallStaticObjectMethod(system,
- getPropertyMethod, env->NewStringUTF("icu.dir"),
- env->NewStringUTF(""));
+ auto stringPath = (jstring)env->CallStaticObjectMethod(system, getPropertyMethod,
+ env->NewStringUTF("icu.data.path"),
+ env->NewStringUTF(""));
const char* path = env->GetStringUTFChars(stringPath, 0);
- u_setDataDirectory(path);
+ bool icuInitialized = init_icu(path);
env->ReleaseStringUTFChars(stringPath, path);
+ if (!icuInitialized) {
+ return JNI_ERR;
+ }
+
+ jstring useJniProperty =
+ (jstring)env->CallStaticObjectMethod(system, getPropertyMethod,
+ env->NewStringUTF("use_bridge_for_logging"),
+ env->NewStringUTF(""));
+ const char* useJniString = env->GetStringUTFChars(useJniProperty, 0);
+ if (strcmp(useJniString, "true") == 0) {
+ layoutLog = FindClassOrDie(env, "com/android/ide/common/rendering/api/ILayoutLog");
+ layoutLog = MakeGlobalRefOrDie(env, layoutLog);
+ logMethodId = GetMethodIDOrDie(env, layoutLog, "logAndroidFramework",
+ "(ILjava/lang/String;Ljava/lang/String;)V");
+ if (bridge == nullptr) {
+ bridge = FindClassOrDie(env, "com/android/layoutlib/bridge/Bridge");
+ bridge = MakeGlobalRefOrDie(env, bridge);
+ }
+ getLogId = GetStaticMethodIDOrDie(env, bridge, "getLog",
+ "()Lcom/android/ide/common/rendering/api/ILayoutLog;");
+ android::base::SetLogger(LayoutlibLogger);
+ android::base::SetAborter(LayoutlibAborter);
+ } else {
+ // initialize logging, so ANDROD_LOG_TAGS env variable is respected
+ android::base::InitLogging(nullptr, android::base::StderrLogger);
+ }
+ env->ReleaseStringUTFChars(useJniProperty, useJniString);
// Use English locale for number format to ensure correct parsing of floats when using strtof
setlocale(LC_NUMERIC, "en_US.UTF-8");
@@ -213,3 +413,9 @@
return JNI_VERSION_1_6;
}
+JNIEXPORT void JNI_OnUnload(JavaVM* vm, void*) {
+ JNIEnv* env = nullptr;
+ vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
+ env->DeleteGlobalRef(bridge);
+ env->DeleteGlobalRef(layoutLog);
+}
diff --git a/core/jni/android_hardware_SyncFence.cpp b/core/jni/android_hardware_SyncFence.cpp
new file mode 100644
index 0000000..b996653
--- /dev/null
+++ b/core/jni/android_hardware_SyncFence.cpp
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "SyncFence"
+
+#include <nativehelper/JNIHelp.h>
+#include <ui/Fence.h>
+
+#include "core_jni_helpers.h"
+#include "jni.h"
+
+using namespace android;
+
+template <typename T>
+jlong toJlong(T* ptr) {
+ return static_cast<jlong>(reinterpret_cast<uintptr_t>(ptr));
+}
+
+template <typename T>
+T* fromJlong(jlong jPtr) {
+ return reinterpret_cast<T*>(static_cast<uintptr_t>(jPtr));
+}
+
+static void destroyFence(Fence* fence) {
+ fence->decStrong(0);
+}
+
+static jlong SyncFence_getDestructor(JNIEnv*, jobject) {
+ return toJlong(&destroyFence);
+}
+
+static jlong SyncFence_create(JNIEnv*, jobject, int fd) {
+ Fence* fence = new Fence(fd);
+ fence->incStrong(0);
+ return toJlong(fence);
+}
+
+static jboolean SyncFence_isValid(JNIEnv*, jobject, jlong jPtr) {
+ return fromJlong<Fence>(jPtr)->isValid();
+}
+
+static jint SyncFence_getFd(JNIEnv*, jobject, jlong jPtr) {
+ return fromJlong<Fence>(jPtr)->get();
+}
+
+static jboolean SyncFence_wait(JNIEnv* env, jobject, jlong jPtr, jlong timeoutNanos) {
+ Fence* fence = fromJlong<Fence>(jPtr);
+ int err = fence->wait(timeoutNanos);
+ return err == OK;
+}
+
+static jlong SyncFence_getSignalTime(JNIEnv* env, jobject, jlong jPtr) {
+ return fromJlong<Fence>(jPtr)->getSignalTime();
+}
+
+// ----------------------------------------------------------------------------
+// JNI Glue
+// ----------------------------------------------------------------------------
+
+const char* const kClassPathName = "android/hardware/SyncFence";
+
+// clang-format off
+static const JNINativeMethod gMethods[] = {
+ { "nGetDestructor", "()J", (void*) SyncFence_getDestructor },
+ { "nCreate", "(I)J", (void*) SyncFence_create },
+ { "nIsValid", "(J)Z", (void*) SyncFence_isValid },
+ { "nGetFd", "(J)I", (void*) SyncFence_getFd },
+ { "nWait", "(JJ)Z", (void*) SyncFence_wait },
+ { "nGetSignalTime", "(J)J", (void*) SyncFence_getSignalTime },
+};
+// clang-format on
+
+int register_android_hardware_SyncFence(JNIEnv* env) {
+ int err = RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
+ return err;
+}
\ No newline at end of file
diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp
index d7eeb5f..93ce377 100644
--- a/core/jni/android_hardware_input_InputWindowHandle.cpp
+++ b/core/jni/android_hardware_input_InputWindowHandle.cpp
@@ -130,10 +130,6 @@
mInfo.name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>");
- mInfo.flags = Flags<WindowInfo::Flag>(
- env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags));
- mInfo.type = static_cast<WindowInfo::Type>(
- env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType));
mInfo.dispatchingTimeout = std::chrono::milliseconds(
env->GetLongField(obj, gInputWindowHandleClassInfo.dispatchingTimeoutMillis));
mInfo.frameLeft = env->GetIntField(obj,
@@ -159,14 +155,72 @@
env->DeleteLocalRef(regionObj);
}
- mInfo.visible = env->GetBooleanField(obj,
- gInputWindowHandleClassInfo.visible);
- mInfo.focusable = env->GetBooleanField(obj, gInputWindowHandleClassInfo.focusable);
- mInfo.hasWallpaper = env->GetBooleanField(obj,
- gInputWindowHandleClassInfo.hasWallpaper);
- mInfo.paused = env->GetBooleanField(obj,
- gInputWindowHandleClassInfo.paused);
- mInfo.trustedOverlay = env->GetBooleanField(obj, gInputWindowHandleClassInfo.trustedOverlay);
+ const auto flags = Flags<WindowInfo::Flag>(
+ env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags));
+ const auto type = static_cast<WindowInfo::Type>(
+ env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType));
+ mInfo.layoutParamsFlags = flags;
+ mInfo.layoutParamsType = type;
+
+ using InputConfig = gui::WindowInfo::InputConfig;
+ // Determine the value for each of the InputConfig flags. We rely on a switch statement and
+ // -Wswitch-enum to give us a build error if we forget to explicitly handle an InputConfig flag.
+ mInfo.inputConfig = InputConfig::NONE;
+ InputConfig enumerationStart = InputConfig::NONE;
+ switch (enumerationStart) {
+ case InputConfig::NONE:
+ FALLTHROUGH_INTENDED;
+ case InputConfig::NOT_VISIBLE:
+ if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.visible) == JNI_FALSE) {
+ mInfo.inputConfig |= InputConfig::NOT_VISIBLE;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::NOT_FOCUSABLE:
+ if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.focusable) == JNI_FALSE) {
+ mInfo.inputConfig |= InputConfig::NOT_FOCUSABLE;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::NOT_TOUCHABLE:
+ if (flags.test(WindowInfo::Flag::NOT_TOUCHABLE)) {
+ mInfo.inputConfig |= InputConfig::NOT_TOUCHABLE;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::PREVENT_SPLITTING:
+ if (!flags.test(WindowInfo::Flag::SPLIT_TOUCH)) {
+ mInfo.inputConfig |= InputConfig::PREVENT_SPLITTING;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::DUPLICATE_TOUCH_TO_WALLPAPER:
+ if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.hasWallpaper) == JNI_TRUE) {
+ mInfo.inputConfig |= InputConfig::DUPLICATE_TOUCH_TO_WALLPAPER;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::IS_WALLPAPER:
+ if (type == WindowInfo::Type::WALLPAPER) {
+ mInfo.inputConfig |= InputConfig::IS_WALLPAPER;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::PAUSE_DISPATCHING:
+ if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.paused) == JNI_TRUE) {
+ mInfo.inputConfig |= InputConfig::PAUSE_DISPATCHING;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::TRUSTED_OVERLAY:
+ if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.trustedOverlay) == JNI_TRUE) {
+ mInfo.inputConfig |= InputConfig::TRUSTED_OVERLAY;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::WATCH_OUTSIDE_TOUCH:
+ if (flags.test(WindowInfo::Flag::WATCH_OUTSIDE_TOUCH)) {
+ mInfo.inputConfig |= InputConfig::WATCH_OUTSIDE_TOUCH;
+ }
+ FALLTHROUGH_INTENDED;
+ case InputConfig::SLIPPERY:
+ if (flags.test(WindowInfo::Flag::SLIPPERY)) {
+ mInfo.inputConfig |= InputConfig::SLIPPERY;
+ }
+ }
+
mInfo.touchOcclusionMode = static_cast<TouchOcclusionMode>(
env->GetIntField(obj, gInputWindowHandleClassInfo.touchOcclusionMode));
mInfo.ownerPid = env->GetIntField(obj,
@@ -274,9 +328,9 @@
env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.name,
env->NewStringUTF(windowInfo.name.data()));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.layoutParamsFlags,
- static_cast<uint32_t>(windowInfo.flags.get()));
+ static_cast<uint32_t>(windowInfo.layoutParamsFlags.get()));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.layoutParamsType,
- static_cast<int32_t>(windowInfo.type));
+ static_cast<int32_t>(windowInfo.layoutParamsType));
env->SetLongField(inputWindowHandle, gInputWindowHandleClassInfo.dispatchingTimeoutMillis,
std::chrono::duration_cast<std::chrono::milliseconds>(
windowInfo.dispatchingTimeout)
@@ -305,15 +359,17 @@
env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.touchableRegion,
regionObj.get());
+ using InputConfig = gui::WindowInfo::InputConfig;
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.visible,
- windowInfo.visible);
+ !windowInfo.inputConfig.test(InputConfig::NOT_VISIBLE));
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.focusable,
- windowInfo.focusable);
+ !windowInfo.inputConfig.test(gui::WindowInfo::InputConfig::NOT_FOCUSABLE));
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.hasWallpaper,
- windowInfo.hasWallpaper);
- env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.paused, windowInfo.paused);
+ windowInfo.inputConfig.test(InputConfig::DUPLICATE_TOUCH_TO_WALLPAPER));
+ env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.paused,
+ windowInfo.inputConfig.test(InputConfig::PAUSE_DISPATCHING));
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.trustedOverlay,
- windowInfo.trustedOverlay);
+ windowInfo.inputConfig.test(InputConfig::TRUSTED_OVERLAY));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.touchOcclusionMode,
static_cast<int32_t>(windowInfo.touchOcclusionMode));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.ownerPid, windowInfo.ownerPid);
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 73d2d8d..8c33e07 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -63,12 +63,94 @@
static PlaybackParams::fields_t gPlaybackParamsFields;
static VolumeShaperHelper::fields_t gVolumeShaperFields;
-struct audiotrack_callback_cookie {
- jclass audioTrack_class;
- jobject audioTrack_ref;
- bool busy;
- Condition cond;
- bool isOffload;
+class AudioTrackCallbackImpl : public AudioTrack::IAudioTrackCallback {
+ public:
+ enum event_type {
+ // Keep in sync with java
+ EVENT_MORE_DATA = 0,
+ EVENT_UNDERRUN = 1,
+ EVENT_LOOP_END = 2,
+ EVENT_MARKER = 3,
+ EVENT_NEW_POS = 4,
+ EVENT_BUFFER_END = 5,
+ EVENT_NEW_IAUDIOTRACK = 6,
+ EVENT_STREAM_END = 7,
+ // 8 is reserved for future use
+ EVENT_CAN_WRITE_MORE_DATA = 9
+ };
+
+ AudioTrackCallbackImpl(jclass audioTrackClass, jobject audioTrackWeakRef, bool isOffload)
+ : mIsOffload(isOffload)
+ {
+ const auto env = getJNIEnv();
+ mAudioTrackClass = (jclass)env->NewGlobalRef(audioTrackClass);
+ // we use a weak reference so the AudioTrack object can be garbage collected.
+ mAudioTrackWeakRef = env->NewGlobalRef(audioTrackWeakRef);
+
+ }
+
+ AudioTrackCallbackImpl(const AudioTrackCallbackImpl&) = delete;
+ AudioTrackCallbackImpl& operator=(const AudioTrackCallbackImpl&) = delete;
+ ~AudioTrackCallbackImpl() {
+ const auto env = getJNIEnv();
+ env->DeleteGlobalRef(mAudioTrackClass);
+ env->DeleteGlobalRef(mAudioTrackWeakRef);
+ }
+
+ size_t onCanWriteMoreData(const AudioTrack::Buffer& buffer) override {
+ if (!mIsOffload) {
+ LOG_FATAL("Received canWrite callback for non-offload track");
+ return 0;
+ }
+ const size_t availableForWrite = buffer.size();
+ const int arg = availableForWrite > INT32_MAX ? INT32_MAX : (int) availableForWrite;
+ postEvent(EVENT_CAN_WRITE_MORE_DATA, arg);
+ return 0;
+ }
+
+ void onMarker([[maybe_unused]] uint32_t markerPosition) override {
+ postEvent(EVENT_MARKER);
+ }
+ void onNewPos([[maybe_unused]] uint32_t newPos) override {
+ postEvent(EVENT_NEW_POS);
+ }
+
+
+ void onNewIAudioTrack() override {
+ if (!mIsOffload) return;
+ postEvent(EVENT_NEW_IAUDIOTRACK);
+ }
+
+ void onStreamEnd() override {
+ if (!mIsOffload) return;
+ postEvent(EVENT_STREAM_END);
+ }
+
+ protected:
+ jobject mAudioTrackWeakRef;
+ private:
+ JNIEnv* getJNIEnv() {
+ auto jni = AndroidRuntime::getJNIEnv();
+ if (jni == nullptr) {
+ LOG_ALWAYS_FATAL("AudioTrackCallback thread JNI reference is null");
+ }
+ return jni;
+ }
+
+ void postEvent(int event, int arg = 0) {
+ auto env = getJNIEnv();
+ env->CallStaticVoidMethod(
+ mAudioTrackClass,
+ javaAudioTrackFields.postNativeEventInJava,
+ mAudioTrackWeakRef, event, arg, 0, NULL);
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+ }
+
+ jclass mAudioTrackClass;
+ const bool mIsOffload;
};
// keep these values in sync with AudioTrack.java
@@ -76,22 +158,21 @@
#define MODE_STREAM 1
// ----------------------------------------------------------------------------
-class AudioTrackJniStorage {
+class AudioTrackJniStorage : public virtual RefBase,
+ public AudioTrackCallbackImpl
+{
public:
- sp<MemoryHeapBase> mMemHeap;
- sp<MemoryBase> mMemBase;
- audiotrack_callback_cookie mCallbackData{};
+ // TODO do we always want to initialize the callback implementation?
+ AudioTrackJniStorage(jclass audioTrackClass, jobject audioTrackRef, bool isOffload = false)
+ : AudioTrackCallbackImpl(audioTrackClass, audioTrackRef, isOffload) {}
+
sp<JNIDeviceCallback> mDeviceCallback;
sp<JNIAudioTrackCallback> mAudioTrackCallback;
- bool allocSharedMem(int sizeInBytes) {
- mMemHeap = new MemoryHeapBase(sizeInBytes, 0, "AudioTrack Heap Base");
- if (mMemHeap->getHeapID() < 0) {
- return false;
- }
- mMemBase = new MemoryBase(mMemHeap, 0, sizeInBytes);
- return true;
+ jobject getAudioTrackWeakRef() const {
+ return mAudioTrackWeakRef;
}
+
};
class TunerConfigurationHelper {
@@ -136,7 +217,6 @@
};
static Mutex sLock;
-static SortedVector <audiotrack_callback_cookie *> sAudioTrackCallBackCookies;
// ----------------------------------------------------------------------------
#define DEFAULT_OUTPUT_SAMPLE_RATE 44100
@@ -147,102 +227,49 @@
#define AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE (-19)
#define AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED (-20)
-// ----------------------------------------------------------------------------
-static void audioCallback(int event, void* user, void *info) {
-
- audiotrack_callback_cookie *callbackInfo = (audiotrack_callback_cookie *)user;
- {
- Mutex::Autolock l(sLock);
- if (sAudioTrackCallBackCookies.indexOf(callbackInfo) < 0) {
- return;
- }
- callbackInfo->busy = true;
+namespace {
+sp<IMemory> allocSharedMem(int sizeInBytes) {
+ const auto heap = sp<MemoryHeapBase>::make(sizeInBytes, 0, "AudioTrack Heap Base");
+ if (heap->getBase() == MAP_FAILED || heap->getBase() == nullptr) {
+ return nullptr;
}
-
- // used as default argument when event callback doesn't have any, or number of
- // frames for EVENT_CAN_WRITE_MORE_DATA
- int arg = 0;
- bool postEvent = false;
- switch (event) {
- // Offload only events
- case AudioTrack::EVENT_CAN_WRITE_MORE_DATA:
- // this event will read the info return parameter of the callback:
- // for JNI offload, use the returned size to indicate:
- // 1/ no data is returned through callback, as it's all done through write()
- // 2/ do not wait as AudioTrack does when it receives 0 bytes
- if (callbackInfo->isOffload) {
- AudioTrack::Buffer* pBuffer = (AudioTrack::Buffer*) info;
- const size_t availableForWrite = pBuffer->size;
- arg = availableForWrite > INT32_MAX ? INT32_MAX : (int) availableForWrite;
- pBuffer->size = 0;
- }
- FALLTHROUGH_INTENDED;
- case AudioTrack::EVENT_STREAM_END:
- case AudioTrack::EVENT_NEW_IAUDIOTRACK: // a.k.a. tear down
- if (callbackInfo->isOffload) {
- postEvent = true;
- }
- break;
-
- // PCM and offload events
- case AudioTrack::EVENT_MARKER:
- case AudioTrack::EVENT_NEW_POS:
- postEvent = true;
- break;
- default:
- // event will not be posted
- break;
- }
-
- if (postEvent) {
- JNIEnv *env = AndroidRuntime::getJNIEnv();
- if (env != NULL) {
- env->CallStaticVoidMethod(
- callbackInfo->audioTrack_class,
- javaAudioTrackFields.postNativeEventInJava,
- callbackInfo->audioTrack_ref, event, arg, 0, NULL);
- if (env->ExceptionCheck()) {
- env->ExceptionDescribe();
- env->ExceptionClear();
- }
- }
- }
-
- {
- Mutex::Autolock l(sLock);
- callbackInfo->busy = false;
- callbackInfo->cond.broadcast();
- }
+ return sp<MemoryBase>::make(heap, 0, sizeInBytes);
+}
+// TODO(b/218351957) move somewhere?
+template<typename T>
+sp<T> getFieldSp(JNIEnv* env, jobject thiz, jfieldID id)
+{
+ // make these fields atomic longs on the java side
+ Mutex::Autolock l(sLock);
+ return sp<T>::fromExisting(reinterpret_cast<T*>(env->GetLongField(thiz, id)));
}
-
-// ----------------------------------------------------------------------------
-static sp<AudioTrack> getAudioTrack(JNIEnv* env, jobject thiz)
+// This (semantically) should only be called on AudioTrack creation and release
+template <typename T>
+sp<T> setFieldSp(JNIEnv* env, jobject thiz, const sp<T>& at, jfieldID id)
{
Mutex::Autolock l(sLock);
- AudioTrack* const at =
- (AudioTrack*)env->GetLongField(thiz, javaAudioTrackFields.nativeTrackInJavaObj);
- return sp<AudioTrack>(at);
-}
-
-static sp<AudioTrack> setAudioTrack(JNIEnv* env, jobject thiz, const sp<AudioTrack>& at)
-{
- Mutex::Autolock l(sLock);
- sp<AudioTrack> old =
- (AudioTrack*)env->GetLongField(thiz, javaAudioTrackFields.nativeTrackInJavaObj);
+ // I don't think this synchronization actually prevents a race
+ // We can still invalidate under our feet in release
+ sp<T> old = sp<T>::fromExisting(reinterpret_cast<T*>(env->GetLongField(thiz, id)));
if (at.get()) {
- at->incStrong((void*)setAudioTrack);
+ at->incStrong((void*)setFieldSp<T>);
}
if (old != 0) {
- old->decStrong((void*)setAudioTrack);
+ old->decStrong((void*)setFieldSp<T>);
}
- env->SetLongField(thiz, javaAudioTrackFields.nativeTrackInJavaObj, (jlong)at.get());
+ env->SetLongField(thiz, id, (jlong)at.get());
return old;
}
+sp<AudioTrack> getAudioTrack(JNIEnv* env, jobject thiz) {
+ return getFieldSp<AudioTrack>(env, thiz, javaAudioTrackFields.nativeTrackInJavaObj);
+}
+
+} // anonymous
// ----------------------------------------------------------------------------
sp<AudioTrack> android_media_AudioTrack_getAudioTrack(JNIEnv* env, jobject audioTrackObj) {
- return getAudioTrack(env, audioTrackObj);
+ return getFieldSp<AudioTrack>(env, audioTrackObj, javaAudioTrackFields.nativeTrackInJavaObj);
}
// ----------------------------------------------------------------------------
@@ -274,7 +301,6 @@
env->ReleasePrimitiveArrayCritical(jSession, nSession, 0);
nSession = NULL;
- AudioTrackJniStorage* lpJniStorage = NULL;
jclass clazz = env->GetObjectClass(thiz);
if (clazz == NULL) {
@@ -284,6 +310,7 @@
// if we pass in an existing *Native* AudioTrack, we don't need to create/initialize one.
sp<AudioTrack> lpTrack;
+ const auto lpJniStorage = sp<AudioTrackJniStorage>::make(clazz, weak_this, offload);
if (nativeAudioTrack == 0) {
if (jaa == 0) {
ALOGE("Error creating AudioTrack: invalid audio attributes");
@@ -332,7 +359,7 @@
AttributionSourceState attributionSource;
attributionSource.packageName = std::string(opPackageNameStr.c_str());
attributionSource.token = sp<BBinder>::make();
- lpTrack = new AudioTrack(attributionSource);
+ lpTrack = sp<AudioTrack>::make(attributionSource);
// read the AudioAttributes values
auto paa = JNIAudioAttributeHelper::makeUnique();
@@ -345,13 +372,6 @@
// initialize the callback information:
// this data will be passed with every AudioTrack callback
- lpJniStorage = new AudioTrackJniStorage();
- lpJniStorage->mCallbackData.audioTrack_class = (jclass)env->NewGlobalRef(clazz);
- // we use a weak reference so the AudioTrack object can be garbage collected.
- lpJniStorage->mCallbackData.audioTrack_ref = env->NewGlobalRef(weak_this);
- lpJniStorage->mCallbackData.isOffload = offload;
- lpJniStorage->mCallbackData.busy = false;
-
audio_offload_info_t offloadInfo;
if (offload == JNI_TRUE) {
offloadInfo = AUDIO_INFO_INITIALIZER;
@@ -385,8 +405,7 @@
nativeChannelMask, offload ? 0 : frameCount,
offload ? AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD
: AUDIO_OUTPUT_FLAG_NONE,
- audioCallback,
- &(lpJniStorage->mCallbackData), // callback, callback data (user)
+ lpJniStorage,
0, // notificationFrames == 0 since not using EVENT_MORE_DATA
// to feed the AudioTrack
0, // shared mem
@@ -400,9 +419,10 @@
break;
case MODE_STATIC:
+ {
// AudioTrack is using shared memory
-
- if (!lpJniStorage->allocSharedMem(buffSizeInBytes)) {
+ const auto iMem = allocSharedMem(buffSizeInBytes);
+ if (iMem == nullptr) {
ALOGE("Error creating AudioTrack in static mode: error creating mem heap base");
goto native_init_failure;
}
@@ -412,19 +432,18 @@
sampleRateInHertz,
format, // word length, PCM
nativeChannelMask, frameCount, AUDIO_OUTPUT_FLAG_NONE,
- audioCallback,
- &(lpJniStorage->mCallbackData), // callback, callback data (user)
+ lpJniStorage,
0, // notificationFrames == 0 since not using EVENT_MORE_DATA
// to feed the AudioTrack
- lpJniStorage->mMemBase, // shared mem
+ iMem, // shared mem
true, // thread can call Java
sessionId, // audio session ID
AudioTrack::TRANSFER_SHARED,
- NULL, // default offloadInfo
+ nullptr , // default offloadInfo
AttributionSourceState(), // default uid, pid values
paa.get());
break;
-
+ }
default:
ALOGE("Unknown mode %d", memoryMode);
goto native_init_failure;
@@ -438,7 +457,7 @@
// MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_JAVA
lpTrack->setCallerName("java");
} else { // end if (nativeAudioTrack == 0)
- lpTrack = (AudioTrack*)nativeAudioTrack;
+ lpTrack = sp<AudioTrack>::fromExisting(reinterpret_cast<AudioTrack*>(nativeAudioTrack));
// TODO: We need to find out which members of the Java AudioTrack might
// need to be initialized from the Native AudioTrack
// these are directly returned from getters:
@@ -456,15 +475,19 @@
// initialize the callback information:
// this data will be passed with every AudioTrack callback
- lpJniStorage = new AudioTrackJniStorage();
+
+ // TODO this callback information is useless, it isn't passed to the
+ // native AudioTrack object
+ /*
lpJniStorage->mCallbackData.audioTrack_class = (jclass)env->NewGlobalRef(clazz);
// we use a weak reference so the AudioTrack object can be garbage collected.
lpJniStorage->mCallbackData.audioTrack_ref = env->NewGlobalRef(weak_this);
lpJniStorage->mCallbackData.busy = false;
+ */
}
lpJniStorage->mAudioTrackCallback =
- new JNIAudioTrackCallback(env, thiz, lpJniStorage->mCallbackData.audioTrack_ref,
- javaAudioTrackFields.postNativeEventInJava);
+ sp<JNIAudioTrackCallback>::make(env, thiz, lpJniStorage->getAudioTrackWeakRef(),
+ javaAudioTrackFields.postNativeEventInJava);
lpTrack->setAudioTrackCallback(lpJniStorage->mAudioTrackCallback);
nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL);
@@ -482,17 +505,13 @@
env->SetIntArrayRegion(jSampleRate, 0, 1, elements);
}
- { // scope for the lock
- Mutex::Autolock l(sLock);
- sAudioTrackCallBackCookies.add(&lpJniStorage->mCallbackData);
- }
// save our newly created C++ AudioTrack in the "nativeTrackInJavaObj" field
// of the Java object (in mNativeTrackInJavaObj)
- setAudioTrack(env, thiz, lpTrack);
+ setFieldSp(env, thiz, lpTrack, javaAudioTrackFields.nativeTrackInJavaObj);
// save the JNI resources so we can free them later
//ALOGV("storing lpJniStorage: %x\n", (long)lpJniStorage);
- env->SetLongField(thiz, javaAudioTrackFields.jniData, (jlong)lpJniStorage);
+ setFieldSp(env, thiz, lpJniStorage, javaAudioTrackFields.jniData);
// since we had audio attributes, the stream type was derived from them during the
// creation of the native AudioTrack: push the same value to the Java object
@@ -505,9 +524,6 @@
if (nSession != NULL) {
env->ReleasePrimitiveArrayCritical(jSession, nSession, 0);
}
- env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_class);
- env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_ref);
- delete lpJniStorage;
env->SetLongField(thiz, javaAudioTrackFields.jniData, 0);
// lpTrack goes out of scope, so reference count drops to zero
@@ -607,38 +623,9 @@
// ----------------------------------------------------------------------------
-#define CALLBACK_COND_WAIT_TIMEOUT_MS 1000
static void android_media_AudioTrack_release(JNIEnv *env, jobject thiz) {
- sp<AudioTrack> lpTrack = setAudioTrack(env, thiz, 0);
- if (lpTrack == NULL) {
- return;
- }
- //ALOGV("deleting lpTrack: %x\n", (int)lpTrack);
-
- // delete the JNI data
- AudioTrackJniStorage* pJniStorage = (AudioTrackJniStorage *)env->GetLongField(
- thiz, javaAudioTrackFields.jniData);
- // reset the native resources in the Java object so any attempt to access
- // them after a call to release fails.
- env->SetLongField(thiz, javaAudioTrackFields.jniData, 0);
-
- if (pJniStorage) {
- Mutex::Autolock l(sLock);
- audiotrack_callback_cookie *lpCookie = &pJniStorage->mCallbackData;
- //ALOGV("deleting pJniStorage: %x\n", (int)pJniStorage);
- while (lpCookie->busy) {
- if (lpCookie->cond.waitRelative(sLock,
- milliseconds(CALLBACK_COND_WAIT_TIMEOUT_MS)) !=
- NO_ERROR) {
- break;
- }
- }
- sAudioTrackCallBackCookies.remove(lpCookie);
- // delete global refs created in native_setup
- env->DeleteGlobalRef(lpCookie->audioTrack_class);
- env->DeleteGlobalRef(lpCookie->audioTrack_ref);
- delete pJniStorage;
- }
+ setFieldSp(env, thiz, sp<AudioTrack>(nullptr), javaAudioTrackFields.nativeTrackInJavaObj);
+ setFieldSp(env, thiz, sp<AudioTrackJniStorage>(nullptr), javaAudioTrackFields.jniData);
}
@@ -1249,17 +1236,18 @@
JNIEnv *env, jobject thiz) {
sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
- if (lpTrack == NULL) {
+ if (lpTrack == nullptr) {
return;
}
- AudioTrackJniStorage* pJniStorage = (AudioTrackJniStorage *)env->GetLongField(
- thiz, javaAudioTrackFields.jniData);
- if (pJniStorage == NULL || pJniStorage->mDeviceCallback != 0) {
+ const auto pJniStorage =
+ getFieldSp<AudioTrackJniStorage>(env, thiz, javaAudioTrackFields.jniData);
+ if (pJniStorage == nullptr || pJniStorage->mDeviceCallback != nullptr) {
return;
}
+
pJniStorage->mDeviceCallback =
- new JNIDeviceCallback(env, thiz, pJniStorage->mCallbackData.audioTrack_ref,
- javaAudioTrackFields.postNativeEventInJava);
+ sp<JNIDeviceCallback>::make(env, thiz, pJniStorage->getAudioTrackWeakRef(),
+ javaAudioTrackFields.postNativeEventInJava);
lpTrack->addAudioDeviceCallback(pJniStorage->mDeviceCallback);
}
@@ -1267,12 +1255,13 @@
JNIEnv *env, jobject thiz) {
sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
- if (lpTrack == NULL) {
+ if (lpTrack == nullptr) {
return;
}
- AudioTrackJniStorage* pJniStorage = (AudioTrackJniStorage *)env->GetLongField(
- thiz, javaAudioTrackFields.jniData);
- if (pJniStorage == NULL || pJniStorage->mDeviceCallback == 0) {
+ const auto pJniStorage =
+ getFieldSp<AudioTrackJniStorage>(env, thiz, javaAudioTrackFields.jniData);
+
+ if (pJniStorage == nullptr || pJniStorage->mDeviceCallback == nullptr) {
return;
}
lpTrack->removeAudioDeviceCallback(pJniStorage->mDeviceCallback);
diff --git a/core/jni/android_media_AudioTrack.h b/core/jni/android_media_AudioTrack.h
index ef2aa66..d5b858c 100644
--- a/core/jni/android_media_AudioTrack.h
+++ b/core/jni/android_media_AudioTrack.h
@@ -18,15 +18,9 @@
#define ANDROID_MEDIA_AUDIOTRACK_H
#include "jni.h"
-
+#include <media/AudioTrack.h>
#include <utils/StrongPointer.h>
-namespace android {
-
-class AudioTrack;
-
-}; // namespace android
-
/* Gets the underlying AudioTrack from an AudioTrack Java object. */
extern android::sp<android::AudioTrack> android_media_AudioTrack_getAudioTrack(
JNIEnv* env, jobject audioTrackObj);
diff --git a/core/jni/android_opengl_EGLExt.cpp b/core/jni/android_opengl_EGLExt.cpp
index 1758807..cdc9852 100644
--- a/core/jni/android_opengl_EGLExt.cpp
+++ b/core/jni/android_opengl_EGLExt.cpp
@@ -37,25 +37,12 @@
#include <ui/ANativeObjectBase.h>
static jclass egldisplayClass;
-static jclass eglcontextClass;
static jclass eglsurfaceClass;
-static jclass eglconfigClass;
+static jclass eglsyncClass;
static jmethodID egldisplayGetHandleID;
-static jmethodID eglcontextGetHandleID;
static jmethodID eglsurfaceGetHandleID;
-static jmethodID eglconfigGetHandleID;
-
-static jmethodID egldisplayConstructor;
-static jmethodID eglcontextConstructor;
-static jmethodID eglsurfaceConstructor;
-static jmethodID eglconfigConstructor;
-
-static jobject eglNoContextObject;
-static jobject eglNoDisplayObject;
-static jobject eglNoSurfaceObject;
-
-
+static jmethodID eglsyncGetHandleID;
/* Cache method IDs each time the class is loaded. */
@@ -64,37 +51,14 @@
{
jclass egldisplayClassLocal = _env->FindClass("android/opengl/EGLDisplay");
egldisplayClass = (jclass) _env->NewGlobalRef(egldisplayClassLocal);
- jclass eglcontextClassLocal = _env->FindClass("android/opengl/EGLContext");
- eglcontextClass = (jclass) _env->NewGlobalRef(eglcontextClassLocal);
jclass eglsurfaceClassLocal = _env->FindClass("android/opengl/EGLSurface");
eglsurfaceClass = (jclass) _env->NewGlobalRef(eglsurfaceClassLocal);
- jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig");
- eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal);
+ jclass eglsyncClassLocal = _env->FindClass("android/opengl/EGLSync");
+ eglsyncClass = (jclass)_env->NewGlobalRef(eglsyncClassLocal);
egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getNativeHandle", "()J");
- eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getNativeHandle", "()J");
eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getNativeHandle", "()J");
- eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getNativeHandle", "()J");
-
-
- egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(J)V");
- eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(J)V");
- eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(J)V");
- eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(J)V");
-
-
- jclass eglClass = _env->FindClass("android/opengl/EGL14");
- jfieldID noContextFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_CONTEXT", "Landroid/opengl/EGLContext;");
- jobject localeglNoContextObject = _env->GetStaticObjectField(eglClass, noContextFieldID);
- eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject);
-
- jfieldID noDisplayFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_DISPLAY", "Landroid/opengl/EGLDisplay;");
- jobject localeglNoDisplayObject = _env->GetStaticObjectField(eglClass, noDisplayFieldID);
- eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject);
-
- jfieldID noSurfaceFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_SURFACE", "Landroid/opengl/EGLSurface;");
- jobject localeglNoSurfaceObject = _env->GetStaticObjectField(eglClass, noSurfaceFieldID);
- eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject);
+ eglsyncGetHandleID = _env->GetMethodID(eglsyncClassLocal, "getNativeHandle", "()J");
}
static void *
@@ -108,26 +72,6 @@
return reinterpret_cast<void*>(_env->CallLongMethod(obj, mid));
}
-static jobject
-toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) {
- if (cls == eglcontextClass &&
- (EGLContext)handle == EGL_NO_CONTEXT) {
- return eglNoContextObject;
- }
-
- if (cls == egldisplayClass &&
- (EGLDisplay)handle == EGL_NO_DISPLAY) {
- return eglNoDisplayObject;
- }
-
- if (cls == eglsurfaceClass &&
- (EGLSurface)handle == EGL_NO_SURFACE) {
- return eglNoSurfaceObject;
- }
-
- return _env->NewObject(cls, con, reinterpret_cast<jlong>(handle));
-}
-
// --------------------------------------------------------------------------
/* EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) */
static jboolean
@@ -145,11 +89,21 @@
return (jboolean)_returnValue;
}
+static jint android_eglDupNativeFenceFDANDROID(JNIEnv *env, jobject, jobject dpy, jobject sync) {
+ EGLDisplay dpy_native = (EGLDisplay)fromEGLHandle(env, egldisplayGetHandleID, dpy);
+ EGLSync sync_native = (EGLSync)fromEGLHandle(env, eglsyncGetHandleID, sync);
+
+ return eglDupNativeFenceFDANDROID(dpy_native, sync_native);
+}
+
static const char *classPathName = "android/opengl/EGLExt";
static const JNINativeMethod methods[] = {
-{"_nativeClassInit", "()V", (void*)nativeClassInit },
-{"eglPresentationTimeANDROID", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z", (void *) android_eglPresentationTimeANDROID },
+ {"_nativeClassInit", "()V", (void *)nativeClassInit},
+ {"eglPresentationTimeANDROID", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z",
+ (void *)android_eglPresentationTimeANDROID},
+ {"eglDupNativeFenceFDANDROIDImpl", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;)I",
+ (void *)android_eglDupNativeFenceFDANDROID},
};
int register_android_opengl_jni_EGLExt(JNIEnv *_env)
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index d91d526..19402f7 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -118,11 +118,11 @@
ScopedLocalRef<jobjectArray>
frameTimelineObjs(env,
- env->NewObjectArray(vsyncEventData.frameTimelines.size(),
+ env->NewObjectArray(VsyncEventData::kFrameTimelinesLength,
gDisplayEventReceiverClassInfo
.frameTimelineClassInfo.clazz,
/*initial element*/ NULL));
- for (int i = 0; i < vsyncEventData.frameTimelines.size(); i++) {
+ for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
VsyncEventData::FrameTimeline frameTimeline = vsyncEventData.frameTimelines[i];
ScopedLocalRef<jobject>
frameTimelineObj(env,
@@ -130,8 +130,8 @@
.frameTimelineClassInfo.clazz,
gDisplayEventReceiverClassInfo
.frameTimelineClassInfo.init,
- frameTimeline.id,
- frameTimeline.expectedPresentTime,
+ frameTimeline.vsyncId,
+ frameTimeline.expectedPresentationTime,
frameTimeline.deadlineTimestamp));
env->SetObjectArrayElement(frameTimelineObjs.get(), i, frameTimelineObj.get());
}
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 336161c..fb5b5ff 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -625,12 +625,16 @@
}
static void nativeSetBuffer(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
- jobject bufferObject) {
+ jobject bufferObject, jlong fencePtr) {
auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
sp<GraphicBuffer> graphicBuffer(GraphicBuffer::fromAHardwareBuffer(
android_hardware_HardwareBuffer_getNativeHardwareBuffer(env, bufferObject)));
- transaction->setBuffer(ctrl, graphicBuffer);
+ std::optional<sp<Fence>> optFence = std::nullopt;
+ if (fencePtr != 0) {
+ optFence = sp<Fence>{reinterpret_cast<Fence*>(fencePtr)};
+ }
+ transaction->setBuffer(ctrl, graphicBuffer, optFence);
}
static void nativeSetBufferTransform(JNIEnv* env, jclass clazz, jlong transactionObj,
@@ -2133,7 +2137,7 @@
(void*)nativeGetDisplayedContentSample },
{"nativeSetGeometry", "(JJLandroid/graphics/Rect;Landroid/graphics/Rect;J)V",
(void*)nativeSetGeometry },
- {"nativeSetBuffer", "(JJLandroid/hardware/HardwareBuffer;)V",
+ {"nativeSetBuffer", "(JJLandroid/hardware/HardwareBuffer;J)V",
(void*)nativeSetBuffer },
{"nativeSetBufferTransform", "(JJI)V", (void*) nativeSetBufferTransform},
{"nativeSetDataSpace", "(JJI)V",
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 5efc4db..5971670 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -1626,7 +1626,7 @@
}
// Also prefetch standalone system server jars. The reason for doing this here is the same
// as above.
- env->CallStaticObjectMethod(gZygoteInitClass, gPrefetchStandaloneSystemServerJars);
+ env->CallStaticVoidMethod(gZygoteInitClass, gPrefetchStandaloneSystemServerJars);
if (env->ExceptionCheck()) {
env->ExceptionClear();
}
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index f76b211..3c2a48a 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -574,6 +574,12 @@
optional SettingProto lte_service_forced = 71 [ (android.privacy).dest = DEST_AUTOMATIC ];
repeated SettingProto max_error_bytes = 151;
+
+ message ManagedDeviceProvisioning {
+ optional SettingProto managed_provisioning_defer_provisioning_to_role_holder = 1;
+ }
+ optional ManagedDeviceProvisioning managed_device_provisioning = 156;
+
optional SettingProto mdc_initial_max_retry = 72 [ (android.privacy).dest = DEST_AUTOMATIC ];
message Mhl {
@@ -1077,5 +1083,5 @@
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
- // Next tag = 156;
+ // Next tag = 157;
}
diff --git a/core/res/res/anim/popup_enter_material.xml b/core/res/res/anim/popup_enter_material.xml
index ef5b7c0..9f771b9 100644
--- a/core/res/res/anim/popup_enter_material.xml
+++ b/core/res/res/anim/popup_enter_material.xml
@@ -22,7 +22,7 @@
android:interpolator="@interpolator/standard"
android:duration="@android:integer/config_activityDefaultDur" />
<translate
- android:fromYDelta="20dp"
+ android:fromYDelta="@android:dimen/popup_enter_animation_from_y_delta"
android:toYDelta="0"
android:interpolator="@interpolator/standard"
android:duration="@android:integer/config_activityDefaultDur" />
diff --git a/core/res/res/anim/popup_exit_material.xml b/core/res/res/anim/popup_exit_material.xml
index 1efa702..2b79ddf 100644
--- a/core/res/res/anim/popup_exit_material.xml
+++ b/core/res/res/anim/popup_exit_material.xml
@@ -23,7 +23,7 @@
android:duration="@android:integer/config_activityShortDur" />
<translate
android:fromYDelta="0"
- android:toYDelta="-10dp"
+ android:toYDelta="@android:dimen/popup_exit_animation_to_y_delta"
android:interpolator="@interpolator/standard_accelerate"
android:duration="@android:integer/config_activityShortDur" />
</set>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index d2cf1d7..50f6a42c 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"by jou kalender in te gaan"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS-boodskappe te stuur en te bekyk"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Lêers en dokumente"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"kry toegang tot lêers en dokumente op jou toestel"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musiek en ander oudio"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"kry toegang tot oudiolêers op jou toestel"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto\'s en video\'s"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Voer jou skermslot in om voort te gaan"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Gedeeltelike vingerafdruk is bespeur"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Kon nie vingerafdruk verwerk nie. Probeer asseblief weer."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Maak die sensor skoon"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hou \'n bietjie langer"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Maak vingerafdruksensor skoon en probeer weer"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Maak sensor skoon en probeer weer"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Druk ferm op sensor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Vinger is te stadig beweer. Probeer asseblief weer."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Probeer \'n ander vingerafdruk"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Te helder"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Verander elke keer die posisie van jou vinger so effens"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Vingerafdruk word nie herken nie"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Druk ferm op sensor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Vingerafdruk is gestaaf"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Gesig is gestaaf"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Gesig is gestaaf; druk asseblief bevestig"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Slaan oor"</string>
<string name="no_matches" msgid="6472699895759164599">"Geen passings nie"</string>
<string name="find_on_page" msgid="5400537367077438198">"Vind op bladsy"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# passing }other{# van {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Klaar"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Vee tans gedeelde berging uit …"</string>
<string name="share" msgid="4157615043345227321">"Deel"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Skakel aan"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Program is nie beskikbaar nie"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is nie op die oomblik beskikbaar nie."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> is nie beskikbaar nie"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Jy kan nie nou toegang hiertoe op jou <xliff:g id="DEVICE">%1$s</xliff:g> kry nie. Probeer eerder op jou Android TV-toestel."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Jy kan nie nou toegang hiertoe op jou <xliff:g id="DEVICE">%1$s</xliff:g> kry nie. Probeer eerder op jou tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Jy kan nie nou toegang hiertoe op jou <xliff:g id="DEVICE">%1$s</xliff:g> kry nie. Probeer eerder op jou foon."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Hierdie program is vir \'n ouer weergawe van Android gebou en sal dalk nie behoorlik werk nie. Probeer kyk vir opdaterings, of kontak die ontwikkelaar."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Kyk vir opdatering"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Jy het nuwe boodskappe"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEΪNSTALLEER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"MAAK TOG OOP"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Skadelike program is bespeur"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Stelselloglêertoegangsversoek"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Net hierdie keer"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Moenie toelaat nie"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> versoek stelselloglêers vir funksionele ontfouting. Hierdie loglêers bevat dalk inligting wat programme en dienste op jou toestel geskryf het."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Moenie weer wys nie"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wil <xliff:g id="APP_2">%2$s</xliff:g>-skyfies wys"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Wysig"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Oproepe en kennisgewings sal vibreer"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kragdialoog"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Sluitskerm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skermkiekie"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kopstuk haak"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Toeganklikheidkortpad op skerm"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Toeganklikheidkortpadkieser op skerm"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Toeganklikheidkortpad"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Maak kennisgewingskerm toe"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-paneel op"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-paneel af"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-paneel links"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-paneel regs"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-paneel middel"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> se onderskrifbalk."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in die BEPERK-groep geplaas"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tik om aan te skakel"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werkprogramme nie"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlike programme nie"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Maak <xliff:g id="APP">%s</xliff:g> in jou persoonlike profiel oop?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Maak <xliff:g id="APP">%s</xliff:g> in jou werkprofiel oop?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gebruik persoonlike blaaier"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gebruik werkblaaier"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM se netwerkontsluiting-PIN"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> werk tans op die agtergrond en gebruik batterykrag. Tik om na te gaan."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> werk al vir \'n lang tyd op die agtergrond. Tik om na te gaan."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Gaan aktiewe programme na"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 240e615..2e6f3e0 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"የእርስዎን ቀን መቁጠሪያ ይድረሱበት"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"ኤስኤምኤስ"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"የኤስኤምኤስ መልዕክቶችን ይላኩና ይመልከቱ"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ፋይሎች እና ሰነዶች"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"ፋይሎች እና ሰነዶች ዘንድ በመሳሪያዎ ላይ ይድረሱ"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ሙዚቃ እና ሌላ ኦዲዮ"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"በመሳሪያዎ ላይ የድምጽ ፋይሎችን ይድረሱ"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ፎቶዎች እና ቪዲዮዎች"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ለመቀጠል የማያ ገጽ ቁልፍዎን ያስገቡ"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ከፊል የጣት አሻራ ተገኝቷል"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ጣት አሻራን መስራት አልተቻለም። እባክዎ እንደገና ይሞክሩ።"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ዳሳሹን ያጽዱ"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ትንሽ ረዘም ላለ ጊዜ ይያዙ"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"የጣት አሻራ ዳሳሽን ያጽዱ እና እንደገና ይሞክሩ"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"ዳሳሹን ያጽዱ እና እንደገና ይሞክሩ"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"ዳሳሹን ጠበቅ አድርገው ይጫኑት"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ጣት ከልክ በላይ ተንቀራፎ ተንቀሳቅሷል። እባክዎ እንደገና ይሞክሩ።"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ሌላ የጣት አሻራ ይሞክሩ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"በጣም ብርሃናማ"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"በእያንዳንዱ ጊዜ የጣትዎን ቦታ በትንሹ ይለዋውጡ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"የጣት አሻራ አልታወቀም"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"ዳሳሹን ጠበቅ አድርገው ይጫኑት"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"የጣት አሻራ ትክክለኛነት ተረጋግጧል"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ፊት ተረጋግጧል"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ፊት ተረጋግጧል፣ እባክዎ አረጋግጥን ይጫኑ"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ዝለል"</string>
<string name="no_matches" msgid="6472699895759164599">"ምንም ተመሳሳይ የለም።"</string>
<string name="find_on_page" msgid="5400537367077438198">"በገፅ ላይ አግኝ"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ተዛማጅ}one{# ከ{total}}other{# ከ{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"ተከናውኗል"</string>
<string name="progress_erasing" msgid="6891435992721028004">"የተጋራ ማከማቻን በመደምሰስ ላይ…"</string>
<string name="share" msgid="4157615043345227321">"አጋራ"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"አብራ"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"መተግበሪያ አይገኝም"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> አሁን አይገኝም።"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> አይገኝም"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ይህ በዚህ ጊዜ በእርስዎ <xliff:g id="DEVICE">%1$s</xliff:g> ላይ ሊደረስበት አይችልም። በምትኩ በAndroid TV መሣሪያዎ ላይ ይሞክሩ።"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ይህ በዚህ ጊዜ በእርስዎ <xliff:g id="DEVICE">%1$s</xliff:g> ላይ ሊደረስበት አይችልም። በምትኩ በጡባዊዎ ላይ ይሞክሩ።"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ይህ በዚህ ጊዜ በእርስዎ <xliff:g id="DEVICE">%1$s</xliff:g> ላይ ሊደረስበት አይችልም። በምትኩ በስልክዎ ላይ ይሞክሩ።"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ይህ መተግበሪያ ለቆየ የAndroid ስሪት ነው የተገነባው፣ እና በአግባቡ ላይሰራ ይችላል። ዝማኔዎች ካሉ ለመመልከት ይሞክሩ፣ ወይም ደግሞ ገንቢውን ያነጋግሩ።"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ዝማኔ ካለ አረጋግጥ"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"አዲስ መልዕክቶች አለዎት"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"አራግፍ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ለማንኛውም ክፈት"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ጎጂ መተግበሪያ ተገኝቷል"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"የስርዓት ምዝግብ ማስታወሻ መዳረሻ ጥያቄ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"አሁን ብቻ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"አትፍቀድ"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ለተግባራዊ ስህተት ማረሚያ የስርዓት ምዝግብ ማስታወሻዎችን ይጠይቃል። እነዚህ ምዝግብ ማስታወሻዎች በመሣሪያዎ ላይ ያሉ መተግበሪያዎች እና አገልግሎቶች የጻፉትን መረጃ ሊይዙ ይችላሉ።"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"ዳግም አታሳይ"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> የ<xliff:g id="APP_2">%2$s</xliff:g> ቁራጮችን ማሳየት ይፈልጋል"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"አርትዕ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ጥሪዎች እና ማሳወቂያዎች ይነዝራሉ"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"የኃይል መገናኛ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"የማያ ገጽ ቁልፍ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ቅጽበታዊ ገጽ እይታ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"የማዳመጫ መንጠቆ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ መራጭ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"የተደራሽነት አቋራጭ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"የማሳወቂያ ጥላን አሰናብት"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"ከDpad በላይ"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"ከDpad በታች"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ከDpad በስተግራ"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ከDpad በስተቀኝ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"የDpad ማዕከል"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"የ<xliff:g id="APP_NAME">%1$s</xliff:g> የሥዕል ገላጭ ጽሑፍ አሞሌ።"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ወደ የRESTRICTED ባልዲ ተከትቷል"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ለማብራት መታ ያድርጉ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ምንም የሥራ መተግበሪያዎች የሉም"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ምንም የግል መተግበሪያዎች የሉም"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> በግል መገለጫዎ ውስጥ ይከፈት?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> በስራ መገለጫዎ ውስጥ ይከፈት?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"የግል አሳሽ ተጠቀም"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"የስራ አሳሽ ተጠቀም"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"የሲም አውታረ መረብ መክፈቻ ፒን"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ከበስተጀርባ በማሄድ ላይ ነው እና ባትሪ እየጨረሰ ነው። ለመገምገም መታ ያድርጉ።"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ከበስተጀርባ ለረጅም ጊዜ በማሄድ ላይ ነው። ለመገምገም መታ ያድርጉ።"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ንቁ መተግበሪያዎችን ይፈትሹ"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 05afc30..e2234e4 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -592,8 +592,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"أدخِل قفل الشاشة للمتابعة"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"تم اكتشاف بصمة إصبع جزئية."</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"تعذرت معالجة بصمة الإصبع. يُرجى إعادة المحاولة."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"عليك تنظيف جهاز الاستشعار."</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ثبِّت إصبعك أطول من ذلك قليلاً."</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"تم تحريك الإصبع ببطء شديد. يُرجى إعادة المحاولة."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"يمكنك تجربة بصمة إصبع أخرى."</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"الصورة ساطعة للغاية."</string>
@@ -601,6 +605,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"غيِّر موضع إصبعك قليلاً في كل مرة."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"تم مصادقة بصمة الإصبع"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"تمّت مصادقة الوجه"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"تمّت مصادقة الوجه، يُرجى الضغط على \"تأكيد\"."</string>
@@ -1504,7 +1512,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"التخطي"</string>
<string name="no_matches" msgid="6472699895759164599">"ليس هناك أي مطابقات"</string>
<string name="find_on_page" msgid="5400537367077438198">"بحث في الصفحة"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{مطابقة واحدة}zero{# من إجمالي {total}}two{# من إجمالي {total}}few{# من إجمالي {total}}many{# من إجمالي {total}}other{# من إجمالي {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"تم"</string>
<string name="progress_erasing" msgid="6891435992721028004">"جارٍ محو بيانات مساحة التخزين المشتركة…"</string>
<string name="share" msgid="4157615043345227321">"مشاركة"</string>
@@ -1932,6 +1941,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"تفعيل"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"التطبيق غير متاح"</string>
<string name="app_blocked_message" msgid="542972921087873023">"تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> غير متاح الآن."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"تطبيق <xliff:g id="ACTIVITY">%1$s</xliff:g> غير متاح"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"لا يمكن الوصول إلى هذا التطبيق على <xliff:g id="DEVICE">%1$s</xliff:g> في الوقت الحالي. حاوِل الوصول إليه على جهاز Android TV بدلاً من ذلك."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"لا يمكن الوصول إلى هذا التطبيق على <xliff:g id="DEVICE">%1$s</xliff:g> في الوقت الحالي. حاوِل الوصول إليه على جهازك اللوحي بدلاً من ذلك."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"لا يمكن الوصول إلى هذا التطبيق على <xliff:g id="DEVICE">%1$s</xliff:g> في الوقت الحالي. حاوِل الوصول إليه على هاتفك بدلاً من ذلك."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"تمّ إنشاء هذا التطبيق لإصدار قديم من Android وقد لا يعمل بشكل صحيح. جرِّب البحث عن تحديثات أو الاتصال بمطوّر البرامج."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"البحث عن تحديث"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"لديك رسائل جديدة"</string>
@@ -2021,16 +2034,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"إلغاء التثبيت"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"الفتح على أي حال"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"تم العثور على تطبيق ضار"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"طلب الوصول إلى سجّل النظام"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"هذه المرَّة فقط"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"عدم السماح"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"يطلب تطبيق <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> سجّلات النظام لعملية تصحيح أخطاء وظيفية. قد تحتوي هذه السجّلات على معلومات تمت كتابتها من خلال التطبيقات والخدمات المتاحة على جهازك."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"عدم الإظهار مرة أخرى"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"يريد تطبيق <xliff:g id="APP_0">%1$s</xliff:g> عرض شرائح تطبيق <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"تعديل"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"سيهتز الهاتف عند تلقّي المكالمات والإشعارات."</string>
@@ -2093,22 +2101,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"مربّع حوار الطاقة"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"شاشة القفل"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"لقطة شاشة"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"خطّاف تعليق سمّاعة الرأس"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"اختصار أدوات تمكين الوصول على الشاشة"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"أداة اختيار اختصارات أدوات تمكين الوصول على الشاشة"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"اختصارات أدوات تمكين الوصول"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"إغلاق مركز الإشعارات"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"زرّ الاتجاه للأعلى"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"زرّ الاتجاه للأسفل"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"زرّ الاتجاه لليسار"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"زرّ الاتجاه لليمين"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"الزرّ المركزي"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"شريط الشرح لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"تم وضع <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> في الحزمة \"محظورة\"."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2129,10 +2131,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"انقر لتفعيل الميزة"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ما مِن تطبيقات عمل."</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ما مِن تطبيقات شخصية."</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"هل تريد فتح <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي؟"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"هل تريد فتح <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي للعمل؟"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"استخدام المتصفّح الشخصي"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"استخدام متصفّح العمل"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"رقم التعريف الشخصي لإلغاء قفل شبكة شريحة SIM"</string>
@@ -2267,4 +2267,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"يعمل تطبيق <xliff:g id="APP">%1$s</xliff:g> في الخلفية ويستنفد شحن البطارية. انقر لمراجعة الإعدادات."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"يعمل تطبيق <xliff:g id="APP">%1$s</xliff:g> في الخلفية لفترة طويلة. انقر لمراجعة الإعدادات."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"التحقّق من التطبيقات النشطة"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 8828ed5..90f6fca 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"আপোনাৰ কেলেণ্ডাৰ ব্যৱহাৰ কৰিব পাৰে"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"এছএমএছ"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"এছএমএছ বার্তা পঠিয়াব আৰু চাব পাৰে"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ফাইল আৰু নথি"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"আপোনাৰ ডিভাইচত থকা ফাইল আৰু নথি এক্সেছ কৰে"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"সংগীত আৰু অন্যান্য অডিঅ’"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"আপোনাৰ ডিভাইচত অডিঅ’ ফাইলসমূহ এক্সেছ কৰক"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ফট’ আৰু ভিডিঅ’"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"অব্যাহত ৰাখিবলৈ আপোনাৰ স্ক্ৰীন লক দিয়ক"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"আংশিক ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰা হৈছে"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ফিগাৰপ্ৰিণ্টৰ প্ৰক্ৰিয়া সম্পাদন কৰিবপৰা নগ\'ল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ছেন্সৰটো চাফা কৰক"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"আৰু অলপ সময় ধৰি ৰাখক"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো মচি পুনৰ চেষ্টা কৰক"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"ছেন্সৰটো মচি পুনৰ চেষ্টা কৰক"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"ছেন্সৰটোত ভালকৈ টিপক"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"আঙুলিৰ গতি অতি মন্থৰ আছিল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"অন্য এটা ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰি চাওক"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"অতি উজ্জ্বল"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"প্ৰতিবাৰতে আপোনাৰ আঙুলিটোৰ স্থান সামান্য সলনি কৰক"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰিব পৰা নাই"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"ছেন্সৰটোত ভালকৈ টিপক"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ফিংগাৰপ্ৰিণ্টৰ সত্যাপন কৰা হ’ল"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল, অনুগ্ৰহ কৰি ‘নিশ্চিত কৰক’ বুটামটো টিপক"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"এৰি যাওক"</string>
<string name="no_matches" msgid="6472699895759164599">"কোনো মিল নাই"</string>
<string name="find_on_page" msgid="5400537367077438198">"পৃষ্ঠাত বিচাৰক"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# মিল{total}ৰ }one{# {total}ৰ }other{# }} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"সম্পন্ন হ’ল"</string>
<string name="progress_erasing" msgid="6891435992721028004">"শ্বেয়াৰ কৰি থোৱা ষ্ট’ৰেজ মচি থকা হৈছে…"</string>
<string name="share" msgid="4157615043345227321">"শ্বেয়াৰ কৰক"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"অন কৰক"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"এপ্টো উপলব্ধ নহয়"</string>
<string name="app_blocked_message" msgid="542972921087873023">"এই মুহূৰ্তত <xliff:g id="APP_NAME">%1$s</xliff:g> উপলব্ধ নহয়।"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> উপলব্ধ নহয়"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"এইটো এতিয়া আপোনাৰ <xliff:g id="DEVICE">%1$s</xliff:g>ত এক্সেছ কৰিব পৰা নাযায়। তাৰ পৰিৱৰ্তে আপোনাৰ Android TVত চেষ্টা কৰি চাওক।"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"এইটো এতিয়া আপোনাৰ <xliff:g id="DEVICE">%1$s</xliff:g>ত এক্সেছ কৰিব পৰা নাযায়। তাৰ পৰিৱৰ্তে আপোনাৰ টেবলেটটোত চেষ্টা কৰি চাওক।"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"এইটো এতিয়া আপোনাৰ <xliff:g id="DEVICE">%1$s</xliff:g>ত এক্সেছ কৰিব পৰা নাযায়। তাৰ পৰিৱৰ্তে আপোনাৰ ফ’নত চেষ্টা কৰি চাওক।"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"এই এপটো Androidৰ এটা পুৰণা সংস্কৰণৰ বাবে প্ৰস্তুত কৰা হৈছিল, আৰু ই বিচৰাধৰণে কাম নকৰিবও পাৰে। ইয়াৰ আপডে’ট আছে নেকি চাওক, বা বিকাশকৰ্তাৰ সৈতে যোগাযোগ কৰক।"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"আপডে’ট আছে নেকি চাওক"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"আপুনি নতুন বার্তা লাভ কৰিছে"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"আনইনষ্টল কৰক"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"যিহ\'লেও খোলক"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ক্ষতিকাৰক এপ্ চিনাক্ত কৰা হৈছে"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"ছিষ্টেমৰ লগ এক্সেছ কৰাৰ অনুৰোধ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"কেৱল এইবাৰৰ বাবে"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"অনুমতি নিদিব"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>এ কাৰ্যক্ষম ডিবাগিঙৰ বাবে ছিষ্টেমৰ লগসমূহ অনুৰোধ কৰে। এই লগসমূহত আপোনাৰ ডিভাইচত থকা এপ্ আৰু সেৱাসমূহে লিখা তথ্য থাকিব পাৰে।"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"পুনৰ নেদেখুৱাব"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>এ <xliff:g id="APP_2">%2$s</xliff:g>ৰ অংশ দেখুওৱাব খুজিছে"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"সম্পাদনা কৰক"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"কল আৰু জাননীসমূহে কম্পন কৰিব"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাৱাৰ ডায়লগ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্ৰীন"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্ৰীণশ্বট"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"হেডছেটৰ হুক"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"স্ক্ৰীনত সাধ্য সুবিধাৰ শ্বৰ্টকাট"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"স্ক্ৰীনত সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট বাছনি কৰাৰ সুবিধা"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"সাধ্য সুবিধাৰ শ্বৰ্টকাট"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"জাননী পেনেল অগ্ৰাহ্য কৰক"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"ডিপেডৰ ওপৰফালৰ বুটাম"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"ডিপেডৰ তলফালৰ বুটাম"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপেডৰ বাওঁফালৰ বুটাম"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপেডৰ সোঁফালৰ বুটাম"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপেডৰ মাজৰ বুটাম"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ কেপশ্বন বাৰ।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"অন কৰিবলৈ টিপক"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"কোনো কৰ্মস্থানৰ এপ্ নাই"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"কোনো ব্যক্তিগত এপ্ নাই"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"আপোনাৰ ব্যক্তিগত প্ৰ’ফাইলত <xliff:g id="APP">%s</xliff:g> খুলিবনে?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"আপোনাৰ কর্মস্থানৰ প্ৰ\'ফাইলত <xliff:g id="APP">%s</xliff:g> খুলিবনে?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ব্যক্তিগত ব্ৰাউজাৰ ব্যৱহাৰ কৰক"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"কৰ্মস্থানৰ ব্ৰাউজাৰ ব্যৱহাৰ কৰক"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ছিম নেটৱৰ্ক আনলক কৰা পিন"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> নেপথ্যত চলি আছে আৰু অত্যধিক বেটাৰী খৰচ কৰিছে। পৰ্যালোচনা কৰিবলৈ টিপক।"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> নেপথ্যত দীৰ্ঘ সময় ধৰি চলি আছে। পৰ্যালোচনা কৰিবলৈ টিপক।"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"সক্ৰিয় এপ্সমূহ পৰীক্ষা কৰক"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index b6627af..8c4f0b6 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Davam etmək üçün ekran kilidinizi daxil edin"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Barmaq izinin bir hissəsi aşkarlanıb"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Barmaq izi tanınmadı. Lütfən, yenidən cəhd edin."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Sensoru silin"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Azca daha saxlayın"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Barmağınızı çox yavaş hərəkət etdirdiniz. Lütfən, yenidən cəhd edin."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Başqa bir barmaq izini sınayın"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Çox işıqlıdır"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Hər dəfə barmağınızın yerini bir az dəyişdirin"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Barmaq izi doğrulandı"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Üz doğrulandı"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Üz təsdiq edildi, təsdiq düyməsinə basın"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Keç"</string>
<string name="no_matches" msgid="6472699895759164599">"Uyğunluq yoxdur"</string>
<string name="find_on_page" msgid="5400537367077438198">"Səhifədə tap"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# uyğunluq}other{#/{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Hazırdır"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Paylaşılan yaddaş silinir…"</string>
<string name="share" msgid="4157615043345227321">"Paylaşın"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aktivləşdirin"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Tətbiq əlçatan deyil"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> hazırda əlçatan deyil."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> əlçatan deyil"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Hazırda <xliff:g id="DEVICE">%1$s</xliff:g> cihazınızda buna giriş mümkün deyil. Android TV cihazınızda sınayın."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Hazırda <xliff:g id="DEVICE">%1$s</xliff:g> cihazınızda buna giriş mümkün deyil. Planşetinizdə sınayın."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Hazırda <xliff:g id="DEVICE">%1$s</xliff:g> cihazınızda buna giriş mümkün deyil. Telefonunuzda sınayın."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Bu tətbiq köhnə Android versiyası üçün hazırlanıb və düzgün işləməyə bilər. Güncəlləməni yoxlayın və ya developer ilə əlaqə saxlayın."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Güncəllənmə olmasını yoxlayın"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Yeni mesajlarınız var"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"SİSTEMDƏN SİLİN"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"İSTƏNİLƏN HALDA AÇIN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zərərli tətbiq aşkarlandı"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Sistem qeydinə giriş sorğusu"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Yalnız bu dəfə"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"İcazə verməyin"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> funksional sazlama üçün sistem qeydlərini tələb edir. Bu qeydlərə cihazınızda tətbiqlər və xidmətlərin yazdığı məlumatlar daxil ola bilər."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Daha göstərməyin"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> tətbiqindən bölmələr göstərmək istəyir"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Redaktə edin"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Zəng və bildirişlər vibrasiya verəcək"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Yandırıb-söndürmə dialoqu"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilid Ekranı"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skrinşot"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Qulaqlıq Qarmağı"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranda Əlçatımlılıq Qısayolu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekranda Əlçatımlılıq Qısayolu Seçicisi"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Əlçatımlılıq Qısayolu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Bildiriş Göstərişini qapadın"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad Yuxarı"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad Aşağı"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sola"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağa"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Mərkəzə"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> başlıq paneli."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> MƏHDUDLAŞDIRILMIŞ səbətinə yerləşdirilib"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Aktiv etmək üçün toxunun"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş tətbiqi yoxdur"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Şəxsi tətbiq yoxdur"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Şəxsi profilinizdə <xliff:g id="APP">%s</xliff:g> tətbiqi açılsın?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"İş profilinizdə <xliff:g id="APP">%s</xliff:g> tətbiqi açılsın?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Şəxsi brauzerdən istifadə edin"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"İş brauzerindən istifadə edin"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM şəbəkəsi kilidaçma PİN\'i"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> arxa fonda işləyir və enerjini tükədir. Nəzərdən keçirmək üçün toxunun."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> uzun müddət arxa fonda işləyir. Nəzərdən keçirmək üçün toxunun."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Aktiv tətbiqləri yoxlayın"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 7831bd0..0c3b88c 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -77,7 +77,7 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"ID pozivaoca podrazumevano nije ograničen. Sledeći poziv: Nije ograničen."</string>
<string name="serviceNotProvisioned" msgid="8289333510236766193">"Usluga nije dobavljena."</string>
<string name="CLIRPermanent" msgid="166443681876381118">"Ne možete da promenite podešavanje ID-a korisnika."</string>
- <string name="RestrictedOnDataTitle" msgid="1500576417268169774">"Nema usluge prenosa podataka preko mobilnog operatera"</string>
+ <string name="RestrictedOnDataTitle" msgid="1500576417268169774">"Nema usluge mobilnih podataka"</string>
<string name="RestrictedOnEmergencyTitle" msgid="2852916906106191866">"Hitni pozivi nisu dostupni"</string>
<string name="RestrictedOnNormalTitle" msgid="7009474589746551737">"Nema glasovne usluge"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="3982069078579103087">"Nema glasovne usluge ni hitnih poziva"</string>
@@ -589,8 +589,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Upotrebite zaključavanje ekrana da biste nastavili"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Otkriven je delimičan otisak prsta"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nije uspela obrada otiska prsta. Probajte ponovo."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Obrišite senzor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Zadržite malo duže"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Previše sporo ste pomerili prst. Probajte ponovo."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Probajte sa drugim otiskom prsta"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Previše je svetlo"</string>
@@ -598,6 +602,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Svaki put lagano promenite položaj prsta"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Otisak prsta je potvrđen"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Lice je potvrđeno"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Lice je potvrđeno. Pritisnite Potvrdi"</string>
@@ -1501,7 +1509,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Nema podudaranja"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pronađi na stranici"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# podudaranje}one{# od {total}}few{# od {total}}other{# of {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Gotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Briše se deljeni memorijski prostor…"</string>
<string name="share" msgid="4157615043345227321">"Deli"</string>
@@ -1929,6 +1938,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Uključi"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno nije dostupna."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – nije dostupno"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Ovoj aplikaciji trenutno ne može da se pristupi sa uređaja <xliff:g id="DEVICE">%1$s</xliff:g>. Probajte na Android TV uređaju."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Ovoj aplikaciji trenutno ne može da se pristupi sa uređaja <xliff:g id="DEVICE">%1$s</xliff:g>. Probajte na tabletu."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Ovoj aplikaciji trenutno ne može da se pristupi sa uređaja <xliff:g id="DEVICE">%1$s</xliff:g>. Probajte na telefonu."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ova aplikacija je napravljena za stariju verziju Android-a, pa možda neće raditi ispravno. Potražite ažuriranja ili kontaktirajte programera."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Potraži ažuriranje"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Imate nove poruke"</string>
@@ -2018,16 +2031,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALIRAJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Zahtev za pristup sistemskoj evidenciji"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Samo ovaj put"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ne dozvoli"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> zahteva evidencije sistema radi otklanjanja grešaka u funkcijama. Te evidencije mogu da sadrže informacije koje su aplikacije i usluge na uređaju zapisale."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne prikazuj ponovo"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi da prikazuje isečke iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Izmeni"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibracija za pozive i obaveštenja je uključena"</string>
@@ -2090,22 +2098,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključani ekran"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kuka za slušalice"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečica za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Alatka za biranje prečica za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečica za pristupačnost"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Odbaci traku sa obaveštenjima"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"nagore na D-pad-u"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"nadole na D-pad-u"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"nalevo na D-pad-u"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"nadesno na D-pad-u"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"centar na D-pad-u"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka sa naslovima aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je dodat u segment OGRANIČENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2126,10 +2128,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da biste uključili"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Želite da na ličnom profilu otvorite: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Želite da na poslovnom profilu otvorite: <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi lični pregledač"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni pregledač"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje SIM mreže"</string>
@@ -2264,4 +2264,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta u pozadini i troši bateriju. Dodirnite da biste pregledali."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je predugo pokrenuta u pozadini. Dodirnite da biste pregledali."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Proverite aktivne aplikacije"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 6bc7a7c..cf8c2dd 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -590,8 +590,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Каб працягнуць, скарыстайце свой сродак блакіроўкі экрана"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Адбітак пальца адсканіраваны не цалкам"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Не атрымалася апрацаваць адбітак пальца. Паспрабуйце яшчэ раз."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Ачысціце сканер"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Утрымлівайце палец крыху даўжэй"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Палец рухаўся занадта павольна. Паспрабуйце яшчэ раз."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Паспрабуйце іншы адбітак пальца"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Занадта светла"</string>
@@ -599,6 +603,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Кожны раз крыху мяняйце пазіцыю пальца"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Адбітак пальца распазнаны"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Твар распазнаны"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Твар распазнаны. Націсніце, каб пацвердзіць"</string>
@@ -1502,7 +1510,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Прапусціць"</string>
<string name="no_matches" msgid="6472699895759164599">"Няма супадзенняў"</string>
<string name="find_on_page" msgid="5400537367077438198">"Знайсці на старонцы"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# супадзенне}one{# з{total}}few{# з {total}}many{# з {total}}other{# з {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Гатова"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Сціраюцца даныя абагуленага сховішча…"</string>
<string name="share" msgid="4157615043345227321">"Абагуліць"</string>
@@ -1930,6 +1939,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Уключыць"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Праграма недаступная"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" цяпер недаступная."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"Недаступна: <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Не ўдаецца атрымаць доступ з вашай прылады \"<xliff:g id="DEVICE">%1$s</xliff:g>\". Паспрабуйце скарыстаць прыладу Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Не ўдаецца атрымаць доступ з вашай прылады \"<xliff:g id="DEVICE">%1$s</xliff:g>\". Паспрабуйце скарыстаць планшэт."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Не ўдаецца атрымаць доступ з вашай прылады \"<xliff:g id="DEVICE">%1$s</xliff:g>\". Паспрабуйце скарыстаць тэлефон."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Гэта праграма была створана для больш старой версіі Android і можа не працаваць належным чынам. Праверце наяўнасць абнаўленняў або звярніцеся да распрацоўшчыка."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Праверыць на наяўнасць абнаўленняў"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"У вас ёсць новыя паведамленні"</string>
@@ -2019,16 +2032,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ВЫДАЛІЦЬ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"УСЁ РОЎНА АДКРЫЦЬ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Выяўлена шкодная праграма"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Запыт на доступ да сістэмных журналаў"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Толькі ў гэты раз"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Не дазваляць"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> запытвае доступ да сістэмных журналаў з мэтай функцыянальнай адладкі. У гэтых журналах можа ўтрымлівацца інфармацыя, запісаная праграмамі і сэрвісамі вашай прылады."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Больш не паказваць"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Праграма <xliff:g id="APP_0">%1$s</xliff:g> запытвае дазвол на паказ зрэзаў праграмы <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Рэдагаваць"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Для выклікаў і апавяшчэнняў уключаны вібрасігнал"</string>
@@ -2091,22 +2099,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дыялогавае акно сілкавання"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Экран блакіроўкі"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Здымак экрана"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Кручок для гарнітуры"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Хуткі доступ да спецыяльных магчымасцей на экране"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Налада хуткага доступу да спецыяльных магчымасцей на экране"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Хуткі доступ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Закрыць шчыток апавяшчэнняў"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Уверх на панэлі кіравання"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Уніз на панэлі кіравання"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Улева на панэлі кіравання"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Управа на панэлі кіравання"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"У цэнтр на панэлі кіравання"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Панэль субцітраў праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" дададзены ў АБМЕЖАВАНУЮ групу"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2129,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Націсніце, каб уключыць"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Няма працоўных праграм"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Няма асабістых праграм"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Адкрыць праграму \"<xliff:g id="APP">%s</xliff:g>\" з выкарыстаннем асабістага профілю?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Адкрыць праграму \"<xliff:g id="APP">%s</xliff:g>\" з выкарыстаннем працоўнага профілю?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Скарыстаць асабісты браўзер"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Скарыстаць працоўны браўзер"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код разблакіроўкі сеткі для SIM-карты"</string>
@@ -2265,4 +2265,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> працуе ў фонавым рэжыме і расходуе зарад акумулятара. Націсніце, каб праглядзець."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> працуе ў фонавым рэжыме працяглы час. Націсніце, каб праглядзець."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Праверце актыўныя праграмы"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 2428387..7183dce 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Въведете опцията си за заключване на екрана, за да продължите"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Установен е частичен отпечатък"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Отпечатъкът не бе обработен. Моля, опитайте отново."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Почистете сензора"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Задръжте пръста си малко по-дълго"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Преместихте пръста си твърде бавно. Моля, опитайте отново."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Опитайте с друг отпечатък"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Твърде светло е"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Всеки път променяйте леко позицията на пръста си"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Отпечатъкът е удостоверен"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Лицето е удостоверено"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Лицето е удостоверено. Моля, натиснете „Потвърждаване“"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Пропускане"</string>
<string name="no_matches" msgid="6472699895759164599">"Няма съответствия"</string>
<string name="find_on_page" msgid="5400537367077438198">"Намиране в страницата"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# съответствие}other{# от {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Споделеното хранилище се изтрива…"</string>
<string name="share" msgid="4157615043345227321">"Споделяне"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Включване"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Приложението не е достъпно"</string>
<string name="app_blocked_message" msgid="542972921087873023">"В момента няма достъп до <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> не е налице"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Понастоящем не може да се осъществи достъп от устройството ви <xliff:g id="DEVICE">%1$s</xliff:g>. Вместо това опитайте от устройството си с Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Понастоящем не може да се осъществи достъп от устройството ви <xliff:g id="DEVICE">%1$s</xliff:g>. Вместо това опитайте от таблета си."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Понастоящем не може да се осъществи достъп от устройството ви <xliff:g id="DEVICE">%1$s</xliff:g>. Вместо това опитайте от телефона си."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Това приложение бе създадено за по-стара версия на Android и може да не работи правилно. Опитайте да проверите за актуализации или се свържете с програмиста."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Проверка за актуализация"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Имате нови съобщения"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ДЕИНСТАЛИРАНЕ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ОТВАРЯНЕ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Открито е опасно приложение"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Заявка за достъп до сист. рег. файлове"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Само този път"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Забраняване"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> иска достъп до системните регистрационни файлове с цел отстраняване на грешки с функциите. Тези файлове трябва да съдържат информация, записана от приложенията и услугите на устройството ви."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Да не се показва пак"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> иска да показва части от <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Редактиране"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"При обаждания и известия устройството ще вибрира"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалогов прозорец за захранването"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заключен екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Екранна снимка"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Кукичка на слушалките"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Пряк път към достъпността на екрана"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Инструмент за избор на пряк път към достъпността на екрана"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Пряк път за достъпност"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Отхвърляне на падащия панел с известия"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Контролен пад – горе"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Контролен пад – долу"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Контролен пад – ляво"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Контролен пад – дясно"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Контролен пад – център"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Лента за надписи на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакетът <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е поставен в ОГРАНИЧЕНИЯ контейнер"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Докоснете за включване"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Няма подходящи служебни приложения"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Няма подходящи лични приложения"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Искате ли да отворите <xliff:g id="APP">%s</xliff:g> в личния си потребителски профил?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Искате ли да отворите <xliff:g id="APP">%s</xliff:g> в служебния си потребителски профил?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Използване на личния браузър"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Използване на служебния браузър"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ПИН за отключване на мрежата за SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> работи на заден план и изразходва батерията. Докоснете за преглед."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> работи на заден план от дълго време. Докоснете за преглед."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверете активните приложения"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index c8e800d..82932dc 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"এসএমএসগুলি পাঠাতে এবং দেখতে"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ফাইল ও ডকুমেন্ট"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"আপনার ডিভাইসে ফাইল ও ডকুমেন্ট অ্যাক্সেস করুন"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"মিউজিক ও অন্যান্য অডিও"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"আপনার ডিভাইসে অডিও ফাইল অ্যাক্সেস করুন"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ফটো ও ভিডিও"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"চালিয়ে যেতে আপনার স্ক্রিন লক ব্যবহার করুন"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"আংশিক আঙ্গুলের ছাপ শনাক্ত করা হয়েছে"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"আঙ্গুলের ছাপ প্রক্রিয়া করা যায়নি৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"সেন্সর পরিষ্কার করুন"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"একটু বেশি সময় ধরে সেন্সরে আঙ্গুল রাখুন"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"আঙ্গুলের ছাপের সেন্সর পরিষ্কার করে আবার চেষ্টা করুন"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"সেন্সর পরিষ্কার করে আবার চেষ্টা করুন"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"সেন্সর জোরে প্রেস করুন"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"আঙ্গুল খুব ধীরে সরানো হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"অন্য আঙ্গুলের ছাপ দিয়ে চেষ্টা করুন"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"অত্যন্ত উজ্জ্বল"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"প্রতিবার আঙ্গুলের ছাপ সেটআপ করার সময় আপনার আঙ্গুলের অবস্থান সামান্য পরিবর্তন করুন"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"আঙ্গুলের ছাপ শনাক্ত করা যায়নি"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"সেন্সর জোরে প্রেস করুন"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"আঙ্গুলের ছাপ যাচাই করা হয়েছে"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ফেস যাচাই করা হয়েছে"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ফেস যাচাই করা হয়েছে, \'কনফার্ম করুন\' বোতাম প্রেস করুন"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"এড়িয়ে যান"</string>
<string name="no_matches" msgid="6472699895759164599">"কোনো মিল নেই"</string>
<string name="find_on_page" msgid="5400537367077438198">"পৃষ্ঠায় খুঁজুন"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{#টি ম্যাচ}one{{total}-এর মধ্যে #টি}other{{total}-এর মধ্যে #টি}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"সম্পন্ন হয়েছে"</string>
<string name="progress_erasing" msgid="6891435992721028004">"শেয়ার করা স্টোরেজ মুছে ফেলা হচ্ছে…"</string>
<string name="share" msgid="4157615043345227321">"শেয়ার করুন"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"চালু করুন"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"অ্যাপ পাওয়া যাচ্ছে না"</string>
<string name="app_blocked_message" msgid="542972921087873023">"এই মুহূর্তে <xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপ পাওয়া যাচ্ছে না।"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> উপলভ্য নেই"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"এই সময়ে আপনার <xliff:g id="DEVICE">%1$s</xliff:g>-এ এটি অ্যাক্সেস করা যাবে না। পরিবর্তে আপনার Android TV ডিভাইস ব্যবহার করে দেখুন।"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"এই সময়ে আপনার <xliff:g id="DEVICE">%1$s</xliff:g>-এ এটি অ্যাক্সেস করা যাবে না। পরিবর্তে আপনার ট্যাবলেটে ব্যবহার করে দেখুন।"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"এই সময়ে আপনার <xliff:g id="DEVICE">%1$s</xliff:g>-এ এটি অ্যাক্সেস করা যাবে না। পরিবর্তে আপনার ফোনে ব্যবহার করে দেখুন।"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"এই অ্যাপটি Android এর একটি পুরনো ভার্সনের জন্য তৈরি করা হয়েছিল, তাই এখানে সেটি ঠিকমতো কাজ নাও করতে পারে। আপডেট পাওয়া যাচ্ছে কিনা দেখুন বা ডেভেলপারের সাথে যোগাযোগ করুন।"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"আপডেট পাওয়া যাচ্ছে কিনা দেখুন"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"আপনার নতুন মেসেজ আছে"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"আন-ইনস্টল করুন"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"যাই হোক, খুলতে চাই"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ক্ষতিকর অ্যাপ শনাক্ত করা হয়েছে"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"সিস্টেম লগ অ্যাক্সেস করার অনুরোধ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"শুধুমাত্র এখন"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"অনুমতি দেবেন না"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"ফাংশনাল ডিবাগিংয়ের জন্য <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> সিস্টেম লগ অ্যাক্সেস করার অনুরোধ জানিয়েছে। আপনার ডিভাইসে থাকা অ্যাপ এবং পরিষেবার থেকে আসা বিভিন্ন তথ্য এইসব লগে লেখা থাকতে পারে।"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"আর দেখতে চাই না"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটি <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখাতে চায়"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"এডিট করুন"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"কল এবং বিজ্ঞপ্তি আসলে ভাইব্রেট হবে"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাওয়ার ডায়লগ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্রিন"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্রিনশট নিন"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"হেডসেট হুক"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট বেছে নেওয়ার বিকল্প"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"অ্যাক্সেসিবিলিটি শর্টকাট"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"বিজ্ঞপ্তি শেড বাতিল করুন"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"ডিপ্যাড (Dpad)-এর উপরে"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"ডিপ্যাড (Dpad)-এর নিচে"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপ্যাড (Dpad)-এর বাঁদিকে"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপ্যাড (Dpad)-এর ডানদিকে"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপ্যাড (Dpad)-এর মাঝখানে"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর ক্যাপশন বার।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> সীমাবদ্ধ গ্রুপে অন্তর্ভুক্ত করা হয়েছে"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"চালু করতে ট্যাপ করুন"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"এর জন্য কোনও অফিস অ্যাপ নেই"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ব্যক্তিগত অ্যাপে দেখা যাবে না"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"আপনার ব্যক্তিগত প্রোফাইল থেকে <xliff:g id="APP">%s</xliff:g> খুলবেন?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"আপনার অফিস প্রোফাইল থেকে <xliff:g id="APP">%s</xliff:g> খুলবেন?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ব্যক্তিগত ব্রাউজার ব্যবহার করুন"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"অফিস ব্রাউজার ব্যবহার করুন"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"সিম নেটওয়ার্ক আনলক পিন"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ব্যাকগ্রাউন্ডে চলছে এবং এর ফলে ব্যাটারির চার্জ কমে যাচ্ছে। পর্যালোচনা করতে ট্যাপ করুন।"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> অনেকক্ষণ ধরে ব্যাকগ্রাউন্ডে চলছে। পর্যালোচনা করতে ট্যাপ করুন।"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"অ্যাক্টিভ অ্যাপ চেক করুন"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index c25d86f..4f4f7d6 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -305,10 +305,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"pristupa vašem kalendaru"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"šalje i pregleda SMS poruke"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Datoteke i dokumenti"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"pristup datotekama i dokumentima na vašem uređaju"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzika i drugi zvučni zapisi"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pristup audio fajlovima na vašem uređaju"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografije i videozapisi"</string>
@@ -589,8 +587,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Unesite zaključavanje ekrana da nastavite"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Otkriven je djelimični otisak prsta"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Obrada otiska prsta nije uspjela. Pokušajte ponovo."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Očistite senzor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Zadržite malo duže"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Očistite senzor za otisak prsta i pokušajte ponovo"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Očistite senzor i pokušajte ponovo"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Čvrsto pritisnite senzor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Presporo ste pomjerili prst. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Pokušajte s drugim otiskom prsta"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Presvijetlo"</string>
@@ -598,6 +597,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Svaki put blago promijenite položaj prsta"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Otisak prsta nije prepoznat"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Čvrsto pritisnite senzor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Otisak prsta je potvrđen"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Lice je provjereno"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Lice je provjereno, pritisnite dugme za potvrdu"</string>
@@ -1501,7 +1502,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Nema podudaranja"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pronađi na stranici"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# podudaranje}one{# od {total}}few{# od {total}}other{# od {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Gotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Brisanje dijeljene pohrane…"</string>
<string name="share" msgid="4157615043345227321">"Dijeli"</string>
@@ -1929,6 +1931,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Uključi"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno nije dostupna."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"Nedostupno: <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Trenutno ne možete pristupiti ovoj aplikaciji na uređaju <xliff:g id="DEVICE">%1$s</xliff:g>. Umjesto toga pokušajte na uređaju Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Trenutno ne možete pristupiti ovoj aplikaciji na uređaju <xliff:g id="DEVICE">%1$s</xliff:g>. Umjesto toga pokušajte na tabletu."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Trenutno ne možete pristupiti ovoj aplikaciji na uređaju <xliff:g id="DEVICE">%1$s</xliff:g>. Umjesto toga pokušajte na telefonu."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ova aplikacija je pravljena za stariju verziju Androida i možda neće ispravno raditi. Provjerite jesu li dostupna ažuriranja ili kontaktirajte programera."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Provjeri je li dostupno ažuriranje"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Imate nove poruke"</string>
@@ -2018,16 +2024,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALIRAJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Zahtjev za pristup sistemskom zapisniku"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Samo ovaj put"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nemoj dozvoliti"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Aplikacija <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> traži zapisnike sistema za funkcionalno otklanjanje grešaka. Ti zapisnici mogu sadržavati informacije koje su zabilježile aplikacije i usluge na vašem uređaju."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne prikazuj ponovo"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Uredi"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Pozivi i obavještenja će vibrirati"</string>
@@ -2090,22 +2091,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijaloški okvir za napajanje"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključavanje ekrana"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kuka za slušalice"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečica za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Okvir za odabir prečice za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečica za pristupačnost"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Odbacite lokaciju za obavještenja"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Upravljač gore"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Upravljač dolje"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Upravljač lijevo"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Upravljač desno"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Upravljač sredina"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka za natpis aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je stavljen u odjeljak OGRANIČENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2126,10 +2121,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da uključite"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na ličnom profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na radnom profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi lični preglednik"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni preglednik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje mreže na SIM-u"</string>
@@ -2264,4 +2257,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta u pozadini i troši bateriju. Dodirnite da pregledate."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> dugo radi u pozadini. Dodirnite da pregledate."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Provjerite aktivne aplikacije"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 35373ee..fa531ad 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Introdueix el teu bloqueig de pantalla per continuar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"S\'ha detectat una empremta digital parcial"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No s\'ha pogut processar l\'empremta digital. Torna-ho a provar."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Neteja el sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mantén premut una estona més"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"El dit s\'ha mogut massa lentament. Torna-ho a provar."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prova una altra empremta digital"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Hi ha massa llum"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Canvia lleugerament la posició del dit en cada intent"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"L\'empremta digital s\'ha autenticat"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Cara autenticada"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Cara autenticada; prem el botó per confirmar"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omet"</string>
<string name="no_matches" msgid="6472699895759164599">"No s\'ha trobat cap coincidència"</string>
<string name="find_on_page" msgid="5400537367077438198">"Troba-ho a la pàgina"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidència}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Fet"</string>
<string name="progress_erasing" msgid="6891435992721028004">"S\'està esborrant l\'emmagatzematge compartit…"</string>
<string name="share" msgid="4157615043345227321">"Comparteix"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Activa"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"L\'aplicació no està disponible"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Ara mateix, <xliff:g id="APP_NAME">%1$s</xliff:g> no està disponible."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> no està disponible"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"En aquests moments, no es pot accedir a aquesta aplicació al dispositiu <xliff:g id="DEVICE">%1$s</xliff:g>. Prova-ho al dispositiu Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"En aquests moments, no es pot accedir a aquesta aplicació al dispositiu <xliff:g id="DEVICE">%1$s</xliff:g>. Prova-ho a la tauleta."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"En aquests moments, no es pot accedir a aquesta aplicació al dispositiu <xliff:g id="DEVICE">%1$s</xliff:g>. Prova-ho al telèfon."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Aquesta aplicació es va crear per a una versió antiga d\'Android i pot ser que no funcioni correctament. Prova de cercar actualitzacions o contacta amb el desenvolupador."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Cerca actualitzacions"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Tens missatges nous"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTAL·LA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OBRE IGUALMENT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"S\'ha detectat una aplicació perjudicial"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Sol·licitud d\'accés a registre del sistema"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Només aquesta vegada"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"No permetis"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> sol·licita registres del sistema per dur a terme una depuració funcional. Aquests registres poden contenir informació escrita per les aplicacions i els serveis del teu dispositiu."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"No tornis a mostrar"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vol mostrar porcions de l\'aplicació <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edita"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Les trucades i les notificacions vibraran"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quadre de diàleg d\'engegada"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueig"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Ganxo per a auriculars amb micro"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Drecera d\'accessibilitat en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de dreceres d\'accessibilitat en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Drecera d\'accessibilitat"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignora l\'àrea de notificacions"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Creu direccional: amunt"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Creu direccional: avall"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Creu direccional: esquerra"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Creu direccional: dreta"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Creu direccional: centre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de títol de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> s\'ha transferit al segment RESTRINGIT"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toca per activar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Cap aplicació de treball"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Cap aplicació personal"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Vols obrir <xliff:g id="APP">%s</xliff:g> al teu perfil personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Vols obrir <xliff:g id="APP">%s</xliff:g> al teu perfil de treball?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilitza el navegador personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilitza el navegador de treball"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueig de la xarxa SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant en segon pla i consumeix bateria. Toca per revisar-ho."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Fa molta estona que <xliff:g id="APP">%1$s</xliff:g> s\'està executant en segon pla. Toca per revisar-ho."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Consulta les aplicacions actives"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 94e9038..ee9d7bc 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -590,8 +590,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Pokračujte zadáním zámku obrazovky"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Byla zjištěna jen část otisku prstu"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Zpracování otisku prstu se nezdařilo. Zkuste to znovu."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Očistěte senzor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Ještě vydržte"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Pohyb prstem byl příliš pomalý. Zkuste to znovu."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Zkuste jiný otisk prstu"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Je příliš světlo"</string>
@@ -599,6 +603,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Pokaždé lehce změňte polohu prstu"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Otisk byl ověřen"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Obličej byl ověřen"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Obličej byl ověřen, stiskněte tlačítko pro potvrzení"</string>
@@ -1502,7 +1510,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Přeskočit"</string>
<string name="no_matches" msgid="6472699895759164599">"Žádné shody"</string>
<string name="find_on_page" msgid="5400537367077438198">"Hledat na stránce"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# shoda}few{# ze {total}}many{# z {total}}other{# z {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Hotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Mazání sdíleného úložiště…"</string>
<string name="share" msgid="4157615043345227321">"Sdílet"</string>
@@ -1930,6 +1939,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Zapnout"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikace není k dispozici"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> v tuto chvíli není k dispozici."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> není k dispozici"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Tato položka na vašem zařízení <xliff:g id="DEVICE">%1$s</xliff:g> v tuto chvíli není k dispozici. Zkuste to na zařízení Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Tato položka na vašem zařízení <xliff:g id="DEVICE">%1$s</xliff:g> v tuto chvíli není k dispozici. Zkuste to na tabletu."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Tato položka na vašem zařízení <xliff:g id="DEVICE">%1$s</xliff:g> v tuto chvíli není k dispozici. Zkuste to na telefonu."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Tato aplikace byla vytvořena pro starší verzi systému Android a nemusí fungovat správně. Zkuste vyhledat aktualizace, případně kontaktujte vývojáře."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Zkontrolovat aktualizace"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Máte nové zprávy"</string>
@@ -2019,16 +2032,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODINSTALOVAT"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"PŘESTO OTEVŘÍT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Byla zjištěna škodlivá aplikace"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Žádost o přístup k systémovým protokolům"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Pouze tentokrát"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nepovolovat"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Aplikace <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> k funkčnímu ladění požaduje systémové protokoly. Tyto protokoly mohou zahrnovat informace zapsané do zařízení aplikacemi a službami."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Příště nezobrazovat"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikace <xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovat ukázky z aplikace <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Upravit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Volání a oznámení budou vibrovat"</string>
@@ -2091,22 +2099,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogové okno k napájení"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Obrazovka uzamčení"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímek obrazovky"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Tlačítko na náhlavní soupravě"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Zkratka přístupnosti na obrazovce"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Výběr zkratky přístupnosti na obrazovce"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Zkratka přístupnosti"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Zavřít panel oznámení"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad nahoru"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad dolů"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad doleva"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad doprava"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad střed"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popisek aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balíček <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> byl vložen do sekce OMEZENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2129,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Klepnutím ho zapnete"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Žádné pracovní aplikace"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Žádné osobní aplikace"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Otevřít aplikaci <xliff:g id="APP">%s</xliff:g> v osobním profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Otevřít aplikaci <xliff:g id="APP">%s</xliff:g> v pracovním profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Použít osobní prohlížeč"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Použít pracovní prohlížeč"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kód PIN odblokování sítě pro SIM kartu"</string>
@@ -2265,4 +2265,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikace <xliff:g id="APP">%1$s</xliff:g> je spuštěna na pozadí a vybíjí baterii. Klepnutím ji zkontrolujete."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikace <xliff:g id="APP">%1$s</xliff:g> je už dlouhou dobu spuštěna na pozadí. Klepnutím ji zkontrolujete."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Zkontrolujte aktivní aplikace"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 26557da..66a31e7 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Angiv din skærmlås for at fortsætte"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Et delvist fingeraftryk blev registreret"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Fingeraftrykket kunne ikke behandles. Prøv igen."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Rengør sensoren"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hold fingeren stille lidt længere"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Du bevægede fingeren for langsomt. Prøv igen."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prøv med et andet fingeraftryk"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Der er for lyst"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Flyt fingeren en smule hver gang"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingeraftrykket blev godkendt"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Ansigtet er godkendt"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Ansigtet er godkendt. Tryk på Bekræft."</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Spring over"</string>
<string name="no_matches" msgid="6472699895759164599">"Der er ingen matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find på siden"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}one{# ud af {total}}other{# ud af {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Udfør"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Sletter delt lagerplads…"</string>
<string name="share" msgid="4157615043345227321">"Del"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Slå til"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Appen er ikke tilgængelig"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> er ikke tilgængelig lige nu."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> er ikke understøttet"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Du har ikke adgang til denne app på din <xliff:g id="DEVICE">%1$s</xliff:g> på nuværende tidspunkt. Prøv på din Android TV-enhed i stedet."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Du har ikke adgang til denne app på din <xliff:g id="DEVICE">%1$s</xliff:g> på nuværende tidspunkt. Prøv på din tablet i stedet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Du har ikke adgang til denne app på din <xliff:g id="DEVICE">%1$s</xliff:g> på nuværende tidspunkt. Prøv på din telefon i stedet."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Denne app er lavet til en ældre version af Android og fungerer muligvis ikke korrekt. Prøv at søge efter opdateringer, eller kontakt udvikleren."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Søg efter opdatering"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Du har nye beskeder"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"AFINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ÅBN ALLIGEVEL"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Der er registreret en skadelig app"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Anmodning om adgang til systemlogs"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Kun denne gang"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Tillad ikke"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> anmoder om adgang til systemlogs med henblik på funktionel fejlretning. Disse logs indeholder muligvis oplysninger, som apps og tjenester på din enhed har genereret."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Vis ikke igen"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> anmoder om tilladelse til at vise eksempler fra <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Rediger"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Telefonen vibrerer ved opkald og notifikationer"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks om strøm"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskærm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset, hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Genvej til hjælpefunktioner på skærmen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Valg af genvej til hjælpefunktioner på skærmen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Genvej til hjælpefunktioner"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Luk notifikationspanel"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-pad, op"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-pad, ned"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad, venstre"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad, højre"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad, midten"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Titellinje for <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blevet placeret i samlingen BEGRÆNSET"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tryk for at aktivere"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Der er ingen arbejdsapps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Der er ingen personlige apps"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Vil du åbne <xliff:g id="APP">%s</xliff:g> på din personlige profil?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Vil du åbne <xliff:g id="APP">%s</xliff:g> på din arbejdsprofil?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Brug personlig browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Brug arbejdsbrowser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Pinkode til oplåsning af SIM-netværket"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> kører i baggrunden og dræner batteriet. Tryk for at gennemgå."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> har kørt i baggrunden i lang tid. Tryk for at gennemgå."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Tjek aktive apps"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 091542d..781dd99 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Displaysperre eingeben, um fortzufahren"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Fingerabdruck wurde nur teilweise erkannt"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Fingerabdruck konnte nicht verarbeitet werden. Bitte versuche es noch einmal."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Sensor reinigen"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Lass den Finger bitte etwas länger liegen"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger zu langsam bewegt. Bitte versuche es noch einmal."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Anderen Fingerabdruck verwenden"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Zu hell"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Ändere jedes Mal die Position deines Fingers"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerabdruck wurde authentifiziert"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Gesicht authentifiziert"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Gesicht authentifiziert, bitte bestätigen"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Überspringen"</string>
<string name="no_matches" msgid="6472699895759164599">"Keine Treffer"</string>
<string name="find_on_page" msgid="5400537367077438198">"Auf Seite suchen"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# Übereinstimmung}other{# von {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Fertig"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Freigegebener Speicher wird gelöscht…"</string>
<string name="share" msgid="4157615043345227321">"Teilen"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aktivieren"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App ist nicht verfügbar"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ist derzeit nicht verfügbar."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> nicht verfügbar"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Auf deinem <xliff:g id="DEVICE">%1$s</xliff:g> ist derzeit kein Zugriff möglich. Versuche es stattdessen auf deinem Android TV-Gerät."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Auf deinem <xliff:g id="DEVICE">%1$s</xliff:g> ist derzeit kein Zugriff möglich. Versuche es stattdessen auf deinem Tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Auf deinem <xliff:g id="DEVICE">%1$s</xliff:g> ist derzeit kein Zugriff möglich. Versuche es stattdessen auf deinem Smartphone."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Diese App wurde für eine ältere Android-Version entwickelt und funktioniert möglicherweise nicht mehr richtig. Prüfe, ob Updates verfügbar sind oder kontaktiere den Entwickler."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Auf Updates prüfen"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Du hast neue Nachrichten"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALLIEREN"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TROTZDEM ÖFFNEN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Schädliche App erkannt"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Zugriffsanforderung für Systemprotokolle"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Nur dieses Mal"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nicht zulassen"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> fordert Systemprotokolle für die funktionale Fehlerbehebung an. Diese Protokolle können Informationen enthalten, die von Apps und Diensten auf deinem Gerät gespeichert wurden."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Nicht mehr anzeigen"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> möchte Teile von <xliff:g id="APP_2">%2$s</xliff:g> anzeigen"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Bearbeiten"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Gerät vibriert bei Anrufen und Benachrichtigungen"</string>
@@ -2119,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Zum Aktivieren tippen"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Keine geschäftlichen Apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Keine privaten Apps"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> in deinem privaten Profil öffnen?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> in deinem Arbeitsprofil öffnen?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Privaten Browser verwenden"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Arbeitsbrowser verwenden"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Entsperr-PIN für netzgebundenes Gerät"</string>
@@ -2257,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> wird im Hintergrund ausgeführt und belastet den Akku. Zum Prüfen tippen."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> wird schon längere Zeit im Hintergrund ausgeführt. Zum Prüfen tippen."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Aktive Apps prüfen"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 76484fb..c9716d6 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Χρησιμοποιήστε το κλείδωμα οθόνης για να συνεχίσετε"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Εντοπίστηκε μέρους του δακτυλικού αποτυπώματος"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Δεν ήταν δυνατή η επεξεργασία του δακτυλικού αποτυπώματος. Δοκιμάστε ξανά."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Καθαρίστε τον αισθητήρα"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Κρατήστε για λίγο ακόμη"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Πολύ αργή κίνηση δαχτύλου. Δοκιμάστε ξανά."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Δοκιμάστε άλλο δακτυλικό αποτύπωμα"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Υπερβολικά έντονος φωτισμός"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Αλλάζετε ελαφρώς τη θέση του δακτύλου σας κάθε φορά."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Η ταυτότητα του δακτυλικού αποτυπώματος ελέγχθηκε"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Έγινε έλεγχος ταυτότητας προσώπου"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Έγινε έλεγχος ταυτότητας προσώπου, πατήστε \"Επιβεβαίωση\""</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Παράβλεψη"</string>
<string name="no_matches" msgid="6472699895759164599">"Δεν υπάρχουν αποτελέσματα"</string>
<string name="find_on_page" msgid="5400537367077438198">"Εύρεση στη σελίδα"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# αντιστοίχιση}other{# από {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Τέλος"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Διαγραφή κοινόχρηστου αποθηκευτικού χώρου…"</string>
<string name="share" msgid="4157615043345227321">"Κοινή χρ."</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Ενεργοποίηση"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Η εφαρμογή δεν είναι διαθέσιμη"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν είναι διαθέσιμη αυτήν τη στιγμή."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> δεν διατίθεται"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Δεν είναι δυνατή η πρόσβαση στη συγκεκριμένη εφαρμογή από τη συσκευή <xliff:g id="DEVICE">%1$s</xliff:g> αυτήν τη στιγμή. Δοκιμάστε στη συσκευή Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Δεν είναι δυνατή η πρόσβαση στη συγκεκριμένη εφαρμογή από τη συσκευή <xliff:g id="DEVICE">%1$s</xliff:g> αυτήν τη στιγμή. Δοκιμάστε στο tablet σας."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Δεν είναι δυνατή η πρόσβαση στη συγκεκριμένη εφαρμογή από τη συσκευή <xliff:g id="DEVICE">%1$s</xliff:g> αυτήν τη στιγμή. Δοκιμάστε στο τηλέφωνό σας."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Αυτή η εφαρμογή δημιουργήθηκε για παλαιότερη έκδοση του Android και μπορεί να μην λειτουργεί σωστά. Δοκιμάστε να ελέγξετε εάν υπάρχουν ενημερώσεις ή επικοινωνήστε με τον προγραμματιστή."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Έλεγχος για ενημέρωση"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Έχετε νέα μηνύματα"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ΑΠΕΓΚΑΤΑΣΤΑΣΗ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ΑΝΟΙΓΜΑ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Εντοπίστηκε επιβλαβής εφαρμογή"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Αίτημα πρόσβ. σε αρχ. καταγρ. συστήματος"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Μόνο αυτήν τη φορά"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Να μην επιτραπεί"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Η εφαρμογή <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ζητάει τα αρχεία καταγραφής συστήματος για τον εντοπισμό σφαλμάτων λειτουργικότητας. Αυτά τα αρχεία καταγραφής ενδέχεται να περιέχουν πληροφορίες που έχουν γράψει οι εφαρμογές και οι υπηρεσίες στη συσκευή σας."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Να μην εμφανισ. ξανά"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Η εφαρμογή <xliff:g id="APP_0">%1$s</xliff:g> θέλει να εμφανίζει τμήματα της εφαρμογής <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Επεξεργασία"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Θα υπάρχει δόνηση για κλήσεις και ειδοποιήσεις"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Παράθυρο διαλόγου λειτουργίας συσκευής"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Οθόνη κλειδώματος"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Στιγμιότυπο οθόνης"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Άγκιστρο ακουστικών"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Συντόμευση οθόνης για την προσβασιμότητα"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Επιλογέας συντόμευσης οθόνης για την προσβασιμότητα"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Συντόμευση προσβασιμότητας"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Παράβλεψη πλαισίου σκίασης ειδοποιήσεων"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad επάνω"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad κάτω"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad αριστερά"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad δεξιά"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad κέντρο"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Γραμμή υποτίτλων για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Το πακέτο <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> τοποθετήθηκε στον κάδο ΠΕΡΙΟΡΙΣΜΕΝΗΣ ΠΡΟΣΒΑΣΗΣ."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Πατήστε για ενεργοποίηση"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Δεν υπάρχουν εφαρμογές εργασιών"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Δεν υπάρχουν προσωπικές εφαρμογές"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Θέλετε να ανοίξετε την εφαρμογή <xliff:g id="APP">%s</xliff:g> στο προσωπικό σας προφίλ;"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Θέλετε να ανοίξετε την εφαρμογή <xliff:g id="APP">%s</xliff:g> στο προφίλ σας εργασίας;"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Χρήση προσωπικού προγράμματος περιήγησης"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Χρήση προγράμματος περιήγησης εργασίας"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ξεκλειδώματος δικτύου κάρτας SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται στο παρασκήνιο και καταναλώνει μπαταρία. Πατήστε για έλεγχο."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται στο παρασκήνιο για πολύ ώρα. Πατήστε για έλεγχο."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Έλεγχος ενεργών εφαρμογών"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 83c345c..79a2e38 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Files & documents"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"access files and documents on your device"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music & other audio"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos & videos"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hold a little longer"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Clean fingerprint sensor and try again"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Clean sensor and try again"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Press firmly on the sensor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Change the position of your finger slightly each time"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Fingerprint not recognised"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Press firmly on the sensor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Turn on"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App is not available"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not available right now."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> unavailable"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your Android TV device instead."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your tablet instead."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your phone instead."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Check for update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"You have new messages"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"System log access request"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Only this time"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Don’t allow"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> requests system logs for functional debugging. These logs might contain information that apps and services on your device have written."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Don’t show again"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 4128944..da99fdd 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Files & documents"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"access files and documents on your device"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music & other audio"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos & videos"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hold a little longer"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Clean fingerprint sensor and try again"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Clean sensor and try again"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Press firmly on the sensor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Change the position of your finger slightly each time"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Fingerprint not recognised"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Press firmly on the sensor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Turn on"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App is not available"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not available right now."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> unavailable"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your Android TV device instead."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your tablet instead."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your phone instead."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Check for update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"You have new messages"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"System log access request"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Only this time"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Don’t allow"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> requests system logs for functional debugging. These logs might contain information that apps and services on your device have written."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Don’t show again"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 9be3de0..f01b9af 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Files & documents"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"access files and documents on your device"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music & other audio"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos & videos"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hold a little longer"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Clean fingerprint sensor and try again"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Clean sensor and try again"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Press firmly on the sensor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Change the position of your finger slightly each time"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Fingerprint not recognised"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Press firmly on the sensor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Turn on"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App is not available"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not available right now."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> unavailable"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your Android TV device instead."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your tablet instead."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your phone instead."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Check for update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"You have new messages"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"System log access request"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Only this time"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Don’t allow"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> requests system logs for functional debugging. These logs might contain information that apps and services on your device have written."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Don’t show again"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ed72a07..e509c70 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Files & documents"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"access files and documents on your device"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music & other audio"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos & videos"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hold a little longer"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Clean fingerprint sensor and try again"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Clean sensor and try again"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Press firmly on the sensor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Change the position of your finger slightly each time"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Fingerprint not recognised"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Press firmly on the sensor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated. Please press confirm"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Turn on"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App is not available"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not available right now."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> unavailable"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your Android TV device instead."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your tablet instead."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your phone instead."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Check for update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"You have new messages"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"System log access request"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Only this time"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Don’t allow"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> requests system logs for functional debugging. These logs might contain information that apps and services on your device have written."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Don’t show again"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 7380d7d..ec6400c 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -304,18 +304,12 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
- <!-- no translation found for permgrouplab_readMediaAural (5885210465560755316) -->
- <skip />
- <!-- no translation found for permgroupdesc_readMediaAural (1170143315714662822) -->
- <skip />
- <!-- no translation found for permgrouplab_readMediaVisual (9137695801926624061) -->
- <skip />
- <!-- no translation found for permgroupdesc_readMediaVisual (173787212014117477) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Files & documents"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"access files and documents on your device"</string>
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music & other audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos & videos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"access images and video files on your device"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"record audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Physical activity"</string>
@@ -592,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Enter your screen lock to continue"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Partial fingerprint detected"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Couldn\'t process fingerprint. Please try again."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Clean the sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hold a little longer"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Clean fingerprint sensor and try again"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Clean sensor and try again"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Press firmly on the sensor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Finger moved too slow. Please try again."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Try another fingerprint"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Too bright"</string>
@@ -601,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Change the position of your finger slightly each time"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Fingerprint not recognized"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Press firmly on the sensor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingerprint authenticated"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Face authenticated"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Face authenticated, please press confirm"</string>
@@ -687,18 +684,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"read the contents of your shared storage"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Allows the app to read the contents of your shared storage."</string>
- <!-- no translation found for permlab_readMediaAudio (8723513075731763810) -->
- <skip />
- <!-- no translation found for permdesc_readMediaAudio (5299772574434619399) -->
- <skip />
- <!-- no translation found for permlab_readMediaVideo (7768003311260655007) -->
- <skip />
- <!-- no translation found for permdesc_readMediaVideo (3846400073770403528) -->
- <skip />
- <!-- no translation found for permlab_readMediaImage (1507059005825769856) -->
- <skip />
- <!-- no translation found for permdesc_readMediaImage (8328052622292457588) -->
- <skip />
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"read audio files from shared storage"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Allows the app to read audio files from your shared storage."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"read video files from shared storage"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Allows the app to read video files from your shared storage."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"read image files from shared storage"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Allows the app to read image files from your shared storage."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modify or delete the contents of your shared storage"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Allows the app to write the contents of your shared storage."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"make/receive SIP calls"</string>
@@ -1510,7 +1501,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
+ <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# match}other{# of {total}}}"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1938,6 +1929,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Turn on"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App is not available"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not available right now."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> unavailable"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your Android TV device instead."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your tablet instead."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"This can’t be accessed on your <xliff:g id="DEVICE">%1$s</xliff:g> at this time. Try on your phone instead."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"This app was built for an older version of Android and may not work properly. Try checking for updates, or contact the developer."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Check for update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"You have new messages"</string>
@@ -2260,4 +2255,5 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
+ <string name="vdm_camera_access_denied" msgid="6345652513729130490">"Cannot access camera from this device"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 5be2b28..23531ea 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Ingresa tu bloqueo de pantalla para continuar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Detección parcial de una huella dactilar"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No se pudo procesar la huella dactilar. Vuelve a intentarlo."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpia el sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mantén presionado un poco más"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Moviste el dedo muy lento. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prueba con otra huella dactilar"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Demasiada luz"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Cambia un poco la posición del dedo cada vez"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Se autenticó la huella dactilar"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Se autenticó el rostro"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Se autenticó el rostro; presiona Confirmar"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omitir"</string>
<string name="no_matches" msgid="6472699895759164599">"Sin coincidencias"</string>
<string name="find_on_page" msgid="5400537367077438198">"Buscar en la página"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidencia}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Listo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamiento compartido…"</string>
<string name="share" msgid="4157615043345227321">"Compartir"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Activar"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"La app no está disponible"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> no está disponible en este momento."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> no disponible"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Por el momento, no se puede acceder a esto en tu <xliff:g id="DEVICE">%1$s</xliff:g>. Inténtalo en tu dispositivo Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Por el momento, no se puede acceder a esto en tu <xliff:g id="DEVICE">%1$s</xliff:g>. Inténtalo en tu tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Por el momento, no se puede acceder a esto en tu <xliff:g id="DEVICE">%1$s</xliff:g>. Inténtalo en tu teléfono."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Esta app se creó para una versión anterior de Android y es posible que no funcione correctamente. Busca actualizaciones o comunícate con el programador."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Buscar actualización"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Tienes mensajes nuevos"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR DE TODOS MODOS"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Se detectó una app dañina"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Solicitud de acceso a registro de sist."</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Solo esta vez"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"No permitir"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> requiere registros del sistema para una depuración correcta. Es posible que estos registros contengan información que hayan escrito apps y servicios en tu dispositivo."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"No volver a mostrar"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibrarán las llamadas y notificaciones"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Diálogo de encendido"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear pantalla"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Gancho para auriculares"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector del acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Acceso directo de accesibilidad"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Descartar panel de notificaciones"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Pad direccional: arriba"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Pad direccional: abajo"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pad direccional: izquierda"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pad direccional: derecha"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pad direccional: centro"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Presionar para activar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"El contenido no es compatible con apps de trabajo"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"El contenido no es compatible con apps personales"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"¿Quieres abrir <xliff:g id="APP">%s</xliff:g> en tu perfil personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"¿Quieres abrir <xliff:g id="APP">%s</xliff:g> en tu perfil de trabajo?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar un navegador personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar un navegador de trabajo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo del dispositivo para la red de tarjeta SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> se está ejecutando en segundo plano y está agotando la batería. Presiona para revisar esta actividad."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Hace mucho tiempo que <xliff:g id="APP">%1$s</xliff:g> se está ejecutando en segundo plano. Presiona para revisar esta actividad."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Consulta las apps activas"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 4316d02..7c0d36b 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Introduce tu bloqueo de pantalla para continuar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Huella digital parcial detectada"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No se ha podido procesar la huella digital. Vuelve a intentarlo."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpia el sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mantén pulsado un poco más"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Has movido el dedo demasiado despacio. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prueba con otra huella digital"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Demasiada luz"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Cambia ligeramente el dedo de posición cada vez"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Se ha autenticado la huella digital"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Cara autenticada"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Se ha autenticado la cara, pulsa para confirmar"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Saltar"</string>
<string name="no_matches" msgid="6472699895759164599">"No hay coincidencias."</string>
<string name="find_on_page" msgid="5400537367077438198">"Buscar en la página"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidencia}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Hecho"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamiento compartido…"</string>
<string name="share" msgid="4157615043345227321">"Compartir"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Activar"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"La aplicación no está disponible"</string>
<string name="app_blocked_message" msgid="542972921087873023">"En estos momentos, <xliff:g id="APP_NAME">%1$s</xliff:g> no está disponible."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> no disponible"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"En estos momentos, no se puede acceder a este contenido en tu <xliff:g id="DEVICE">%1$s</xliff:g>. Prueba en tu dispositivo Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"En estos momentos, no se puede acceder a este contenido en tu <xliff:g id="DEVICE">%1$s</xliff:g>. Prueba en tu tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"En estos momentos, no se puede acceder a este contenido en tu <xliff:g id="DEVICE">%1$s</xliff:g>. Prueba en tu teléfono."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Esta aplicación se ha diseñado para una versión anterior de Android y es posible que no funcione correctamente. Busca actualizaciones o ponte en contacto con el desarrollador."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Buscar actualizaciones"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Tienes mensajes nuevos"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR IGUALMENTE"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Se ha detectado una aplicación dañina"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Solicitud de acceso a registro del sistema"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Solo esta vez"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"No permitir"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> necesita los registros del sistema para hacer depuraciones funcionales. Es posible que estos registros contengan información introducida por las aplicaciones y los servicios de tu dispositivo."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"No volver a mostrar"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Las llamadas y las notificaciones vibrarán"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Abrir cuadro de diálogo"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Gancho de los auriculares"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Menú de acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Acceso directo de accesibilidad"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Cerrar pantalla de notificaciones"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Cruceta: arriba"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Cruceta: abajo"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Cruceta: izquierda"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Cruceta: derecha"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Cruceta: centro"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> se ha incluido en el grupo de restringidos"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toca para activar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ninguna aplicación de trabajo"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ninguna aplicación personal"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"¿Abrir <xliff:g id="APP">%s</xliff:g> en tu perfil personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"¿Abrir <xliff:g id="APP">%s</xliff:g> en tu perfil de trabajo?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar navegador personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar navegador de trabajo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo de red de tarjeta SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> se está ejecutando en segundo plano y consumiendo batería. Toca para revisarlo."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> lleva mucho tiempo ejecutándose en segundo plano. Toca para revisarlo."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Consultar aplicaciones activas"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index b7e7a20..8c2e458 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Jätkamiseks sisestage oma ekraanilukk"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Tuvastati osaline sõrmejälg"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Sõrmejälge ei õnnestunud töödelda. Proovige uuesti."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Puhastage andur"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hoidke veidi kauem"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Sõrm liikus liiga aeglaselt. Proovige uuesti."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Proovige teist sõrmejälge"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Liiga ere"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Muutke iga kord pisut oma sõrme asendit"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Sõrmejälg autenditi"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Nägu on autenditud"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Nägu on autenditud, vajutage käsku Kinnita"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Jäta vahele"</string>
<string name="no_matches" msgid="6472699895759164599">"Vasted puuduvad"</string>
<string name="find_on_page" msgid="5400537367077438198">"Otsige lehelt"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# vaste}other{#/{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Valmis"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Jagatud salvestusruumi tühjendamine …"</string>
<string name="share" msgid="4157615043345227321">"Jaga"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Lülita sisse"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Rakendus ei ole saadaval"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei ole praegu saadaval."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ei ole saadaval"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Sellele ei pääse praegu teie seadmega (<xliff:g id="DEVICE">%1$s</xliff:g>) juurde. Proovige juurde pääseda oma Android TV seadmega."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Sellele ei pääse praegu teie seadmega (<xliff:g id="DEVICE">%1$s</xliff:g>) juurde. Proovige juurde pääseda oma tahvelarvutiga."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Sellele ei pääse praegu teie seadmega (<xliff:g id="DEVICE">%1$s</xliff:g>) juurde. Proovige juurde pääseda oma telefoniga."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"See rakendus on loodud Androidi vanema versiooni jaoks ega pruugi õigesti töötada. Otsige värskendusi või võtke ühendust arendajaga."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Otsi värskendust"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Teile on uusi sõnumeid"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALLI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"AVA IKKA"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Tuvastati kahjulik rakendus"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Süsteemilogi juurdepääsutaotlus"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Ainult see kord"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ära luba"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> taotleb funktsionaalseks silumiseks süsteemilogisid. Need logid võivad sisaldada teavet, mille teie seadmes olevad rakendused ja teenused on kirjutanud."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ära kuva uuesti"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Rakendus <xliff:g id="APP_0">%1$s</xliff:g> soovib näidata rakenduse <xliff:g id="APP_2">%2$s</xliff:g> lõike"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Muuda"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Kõnede ja märguannete puhul seade vibreerib"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Energiasäästja dialoog"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukustuskuva"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekraanipilt"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Peakomplekti haak"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekraanil kuvatav juurdepääsetavuse otsetee"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekraanil kuvatav juurdepääsetavuse otsetee valija"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Juurdepääsetavuse otsetee"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Loobu märguandealast"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Suunaklahvistiku ülesnool"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Suunaklahvistiku allanool"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Suunaklahvistiku vasaknool"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Suunaklahvistiku paremnool"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suunaklahvistiku keskmine nupp"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> pealkirjariba."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on lisatud salve PIIRANGUTEGA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Puudutage sisselülitamiseks"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Töörakendusi pole"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Isiklikke rakendusi pole"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Kas avada <xliff:g id="APP">%s</xliff:g> teie isiklikul profiilil?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Kas avada <xliff:g id="APP">%s</xliff:g> teie tööprofiilil?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Kasuta isiklikku brauserit"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Kasuta tööbrauserit"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM-kaardi võrgu avamise PIN-kood"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> töötab taustal ja kulutab akut. Puudutage ülevaatamiseks."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> on taustal töötanud kaua aega. Puudutage ülevaatamiseks."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Vaadake aktiivseid rakendusi"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 9d37e97..4c07e40 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Aurrera egiteko, desblokeatu pantailaren blokeoa"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Hatz-marka ez da osorik hauteman"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Ezin izan da prozesatu hatz-marka. Saiatu berriro."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Garbitu sentsorea"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Azkarregi altxatu duzu hatza"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Mantsoegi mugitu duzu hatza. Saiatu berriro."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Erabili beste hatz-marka bat"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Argi gehiegi dago"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Aldi bakoitzean, aldatu hatzaren posizioa apur bat"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Autentifikatu da hatz-marka"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Autentifikatu da aurpegia"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Autentifikatu da aurpegia; sakatu Berretsi"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Saltatu"</string>
<string name="no_matches" msgid="6472699895759164599">"Ez dago emaitzarik"</string>
<string name="find_on_page" msgid="5400537367077438198">"Aurkitu orri honetan"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# partida}other{#/{total} partida}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Eginda"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Biltegi partekatuko eduki guztia ezabatzen…"</string>
<string name="share" msgid="4157615043345227321">"Partekatu"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aktibatu"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikazioa ez dago erabilgarri"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ez dago erabilgarri une honetan."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ez dago erabilgarri"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Une honetan, aplikazioa ezin da <xliff:g id="DEVICE">%1$s</xliff:g> erabilita atzitu. Gailu horren ordez, erabili Android TV gailua."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Une honetan, aplikazioa ezin da <xliff:g id="DEVICE">%1$s</xliff:g> erabilita atzitu. Gailu horren ordez, erabili tableta."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Une honetan, aplikazioa ezin da <xliff:g id="DEVICE">%1$s</xliff:g> erabilita atzitu. Gailu horren ordez, erabili telefonoa."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Aplikazioa Android-en bertsio zaharrago baterako sortu zenez, baliteke behar bezala ez funtzionatzea. Bilatu eguneratzerik baden, edo jarri garatzailearekin harremanetan."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Bilatu eguneratzeak"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Mezu berriak dituzu"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALATU"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IREKI, HALA ERE"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplikazio kaltegarri bat hauteman da"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Sistemaren erregistroak atzitzeko eskaera"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Oraingoan soilik"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ez eman baimenik"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> aplikazioak sistemaren erregistroak atzitu behar ditu funtzioak arazteko. Litekeena da gailuko aplikazio eta zerbitzuek idatzitako informazioa agertzea erregistro horietan."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ez erakutsi berriro"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> aplikazioak <xliff:g id="APP_2">%2$s</xliff:g> aplikazioaren zatiak erakutsi nahi ditu"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editatu"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Dar-dar egingo du deiak eta jakinarazpenak jasotzean"</string>
@@ -2119,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Sakatu aktibatzeko"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ez dago laneko aplikaziorik"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ez dago aplikazio pertsonalik"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Profil pertsonalean ireki nahi duzu <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Laneko profilean ireki nahi duzu <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Erabili arakatzaile pertsonala"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Erabili laneko arakatzailea"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIMaren sarearen bidez desblokeatzeko PINa"</string>
@@ -2257,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> atzeko planoan exekutatzen eta bateria xahutzen ari da. Sakatu berrikusteko."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> aplikazioak denbora asko darama atzeko planoan exekutatzen. Sakatu berrikusteko."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Ikusi zer aplikazio dauden aktibo"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 2cba13c..9b35e07 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"برای ادامه، قفل صفحهتان را وارد کنید"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"بخشی از اثر انگشت شناسایی شد"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"اثرانگشت پردازش نشد. لطفاً دوباره امتحان کنید."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"حسگر را پاک کنید"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"کمی بیشتر نگه دارید"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"حرکت انگشت خیلی آهسته بود. لطفاً دوباره امتحان کنید."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"اثر انگشت دیگری را امتحان کنید"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"خیلی روشن است"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"هربار موقعیت انگشتتان را کمی تغییر دهید"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"اثر انگشت اصالتسنجی شد"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"چهره اصالتسنجی شد"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"چهره اصالتسنجی شد، لطفاً تأیید را فشار دهید"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"رد شدن"</string>
<string name="no_matches" msgid="6472699895759164599">"مورد منطبقی موجود نیست"</string>
<string name="find_on_page" msgid="5400537367077438198">"یافتن در صفحه"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# مورد منطبق}one{# از {total}}other{# از {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"تمام"</string>
<string name="progress_erasing" msgid="6891435992721028004">"درحال پاک کردن فضای ذخیرهسازی همرسانیشده…"</string>
<string name="share" msgid="4157615043345227321">"همرسانی"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"روشن کردن"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"برنامه در دسترس نیست"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> درحالحاضر در دسترس نیست."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> دردسترس نیست"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"درحالحاضر نمیتوان در <xliff:g id="DEVICE">%1$s</xliff:g> شما به این برنامه دسترسی داشت. دسترسی به آن را در دستگاه Android TV امتحان کنید."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"درحالحاضر نمیتوان در <xliff:g id="DEVICE">%1$s</xliff:g> شما به این برنامه دسترسی داشت. دسترسی به آن را در رایانه لوحیتان امتحان کنید."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"درحالحاضر نمیتوان در <xliff:g id="DEVICE">%1$s</xliff:g> شما به این برنامه دسترسی داشت. دسترسی به آن را در تلفنتان امتحان کنید."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"این برنامه برای نسخه قدیمیتری از Android ساخته شده است و ممکن است درست کار نکند. وجود بهروزرسانی را بررسی کنید یا با برنامهنویس تماس بگیرید."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"بررسی وجود بهروزرسانی"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"پیامهای جدیدی دارید"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"حذف نصب"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"درهرصورت باز شود"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"برنامه مضر شناسایی شد"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"درخواست دسترسی به گزارش سیستم"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"فقط این بار"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"مجاز نیست"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> گزارشهای سیستم را برای اشکالزدایی عملکردی درخواست میکند. این گزارشها ممکن است حاوی اطلاعاتی باشد که برنامهها و سرویسهای موجود در دستگاهتان نوشتهاند."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"دوباره نشان داده نشود"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> میخواهد تکههای <xliff:g id="APP_2">%2$s</xliff:g> را نشان دهد"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ویرایش"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"دستگاهتان برای تماسها و اعلانها میلرزد"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"کادر گفتگوی روشن/خاموش"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"صفحه قفل"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"نماگرفت"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"قلاب هدست"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"میانبر دسترسپذیری روی صفحه"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"انتخابگر میانبر دسترسپذیری روی صفحه"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"میانبر دسترسیپذیری"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"رد کردن کشوی اعلانات"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"پد کنترل بالا"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"پد کنترل پایین"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"پد کنترل چپ"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"پد کنترل راست"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"پد کنترل وسط"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"نوار شرح <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"برای روشن کردن، ضربه بزنید"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"برنامه کاریای وجود ندارد"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"برنامه شخصیای وجود ندارد"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> در نمایه شخصی باز شود؟"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> در نمایه کاری باز شود؟"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"استفاده از مرورگر شخصی"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"استفاده از مرورگر کاری"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"پین باز کردن قفل شبکه سیمکارت"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> در پسزمینه اجرا میشود و شارژ باتری را تخلیه میکند. برای مرور، ضربه بزنید."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> برای مدتی طولانی در پسزمینه اجرا میشود. برای مرور، ضربه بزنید."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"بررسی برنامههای فعال"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index a369352..10adae8 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Jatka lisäämällä näytön lukituksen avaustapa"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Osittainen sormenjälki havaittu"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Sormenjäljen prosessointi epäonnistui. Yritä uudelleen."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Puhdista anturi"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Jatka vielä hetki"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Liikutit sormea liian hitaasti. Yritä uudelleen."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Kokeile toista sormenjälkeä"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Liian kirkas"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Liikuta sormeasi hieman joka kerralla"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Sormenjälki tunnistettu"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Kasvot tunnistettu"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Kasvot tunnistettu, valitse Vahvista"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ohita"</string>
<string name="no_matches" msgid="6472699895759164599">"Ei tuloksia"</string>
<string name="find_on_page" msgid="5400537367077438198">"Etsi sivulta"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# osumaa}other{# / {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Valmis"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Tyhjennetään jaettua tallennustilaa…"</string>
<string name="share" msgid="4157615043345227321">"Jaa"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Ota käyttöön"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Sovellus ei ole käytettävissä"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei ole nyt käytettävissä."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ei käytettävissä"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"<xliff:g id="DEVICE">%1$s</xliff:g> ei tällä hetkellä saa pääsyä sovellukseen. Kokeile striimausta Android TV ‑laitteella."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"<xliff:g id="DEVICE">%1$s</xliff:g> ei tällä hetkellä saa pääsyä sovellukseen. Kokeile striimausta tabletilla."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"<xliff:g id="DEVICE">%1$s</xliff:g> ei tällä hetkellä saa pääsyä sovellukseen. Kokeile striimausta puhelimella."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Tämä sovellus on suunniteltu vanhemmalle Android-versiolle eikä välttämättä toimi oikein. Kokeile tarkistaa päivitykset tai ottaa yhteyttä kehittäjään."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Tarkista päivitykset"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Sinulle on uusia viestejä"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"POISTA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"AVAA SILTI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Haitallinen sovellus havaittu"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Järjestelmälokin pääsyoikeuspyyntö"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Vain tämän kerran"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Älä salli"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> pyytää järjestelmälokeja virheenkorjausta varten. Lokeissa voi olla tietoja, jotka ovat peräisin laitteellasi olevista sovelluksista ja palveluista."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Älä näytä uudelleen"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> haluaa näyttää osia sovelluksesta <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Muokkaa"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Puhelut ja ilmoitukset värisevät"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Virran valintaikkuna"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukitusnäyttö"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Kuvakaappaus"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kuulokemikrofonin koukku"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Näytöllä näkyvä esteettömyyspainike"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Näytöllä näkyvän esteettömyyspainikkeen valitsin"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Esteettömyyspainike"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Sulje ilmoitusalue"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Suuntanäppäimistö: ylös-painike"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Suuntanäppäimisto: alas-painike"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Suuntanäppäimistö: vasen painike"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Suuntanäppäimistö: oikea painike"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suuntanäppäimistö: keskipainike"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstityspalkki: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on nyt rajoitettujen ryhmässä"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Laita päälle napauttamalla"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ei työsovelluksia"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ei henkilökohtaisia sovelluksia"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Avataanko <xliff:g id="APP">%s</xliff:g> henkilökohtaisessa profiilissa?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Avataanko <xliff:g id="APP">%s</xliff:g> työprofiilissa?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Käytä henkilökohtaista selainta"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Käytä työselainta"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM-kortin verkkoversion lukituksen avaamisen PIN-koodi"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> on käynnissä taustalla ja kuluttaa akkua. Tarkista napauttamalla."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> on ollut käynnissä taustalla pitkän aikaa. Tarkista napauttamalla."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Tarkista aktiiviset sovellukset"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 6884198..43b061d 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Entrez votre verrouillage d\'écran pour continuer"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Empreinte digitale partielle détectée"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Impossible de reconnaître l\'empreinte digitale. Veuillez réessayer."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Nettoyez le capteur"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Maintenez le doigt en place un peu plus longtemps"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Vous avez déplacé votre doigt trop lentement. Veuillez réessayer."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Essayez une autre empreinte digitale"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Trop lumineux"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Modifiez légèrement la position de votre doigt chaque fois"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Empreinte digitale authentifiée"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Visage authentifié"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Visage authentifié, veuillez appuyer sur le bouton Confirmer"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ignorer"</string>
<string name="no_matches" msgid="6472699895759164599">"Aucune partie"</string>
<string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# correspondance}one{# de {total}}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Terminé"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Effacement du stockage partagé en cours…"</string>
<string name="share" msgid="4157615043345227321">"Partager"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Activer"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"L\'application n\'est pas accessible"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas accessible pour le moment."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> non accessible"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Impossible d\'accéder à ce contenu sur votre appareil <xliff:g id="DEVICE">%1$s</xliff:g> pour le moment. Essayez sur votre appareil Android TV à la place."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Impossible d\'accéder à ce contenu sur votre appareil <xliff:g id="DEVICE">%1$s</xliff:g> pour le moment. Essayez sur votre tablette à la place."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Impossible d\'accéder à ce contenu sur votre appareil <xliff:g id="DEVICE">%1$s</xliff:g> pour le moment. Essayez sur votre téléphone à la place."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Cette application a été conçue pour une ancienne version d\'Android et pourrait ne pas fonctionner correctement. Essayez de vérifier les mises à jour ou communiquez avec son développeur."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Vérifier la présence de mises à jour"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Vous avez de nouveaux messages"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DÉSINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OUVRIR QUAND MÊME"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Une application nuisible a été détectée"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Demande d\'accès aux journaux système"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Seulement cette fois"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ne pas autoriser"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> demande l\'accès aux journaux système aux fins de débogage fonctionnel. Ces journaux peuvent contenir des informations écrites par des applications et des services sur votre appareil."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne plus afficher"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> souhaite afficher <xliff:g id="APP_2">%2$s</xliff:g> tranches"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Modifier"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Les appels et les notifications vibreront"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue sur l\'alimentation"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Écran de verrouillage"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Crochet de casque d\'écoute"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Raccourci d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Sélecteur de raccourci d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Raccourci d\'accessibilité"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignorer le volet de notification"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Pavé directionnel – haut"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Pavé directionnel – bas"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel – gauche"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel – droite"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel – centre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le compartiment RESTREINT"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Touchez pour activer"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Aucune application professionnelle"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Aucune application personnelle"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil personnel?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil professionnel?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utiliser le navigateur du profil personnel"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utiliser le navigateur du profil professionnel"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"NIP de déverrouillage du réseau associé au module SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan et décharge rapidement la pile. Touchez pour examiner."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan depuis longtemps. Touchez pour examiner."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Vérifier les applications actives"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index db64970..7770aed 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -265,7 +265,7 @@
<string name="global_action_settings" msgid="4671878836947494217">"Paramètres"</string>
<string name="global_action_assist" msgid="2517047220311505805">"Assistance"</string>
<string name="global_action_voice_assist" msgid="6655788068555086695">"Assistance vocale"</string>
- <string name="global_action_lockdown" msgid="2475471405907902963">"Verrouillé"</string>
+ <string name="global_action_lockdown" msgid="2475471405907902963">"Verrouiller"</string>
<string name="status_bar_notification_info_overflow" msgid="3330152558746563475">">999"</string>
<string name="notification_hidden_text" msgid="2835519769868187223">"Nouvelle notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6465975799223304567">"Clavier virtuel"</string>
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Utilisez le verrouillage de l\'écran pour continuer"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Empreinte partielle détectée"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Impossible de reconnaître l\'empreinte digitale. Veuillez réessayer."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Nettoyez le lecteur"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Maintenez un peu plus longtemps"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Vous avez déplacé votre doigt trop lentement. Veuillez réessayer."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Essayez une autre empreinte"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Trop de lumière"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Changez légèrement de position chaque fois"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Empreinte digitale authentifiée"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Visage authentifié"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Visage authentifié, veuillez appuyer sur \"Confirmer\""</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ignorer"</string>
<string name="no_matches" msgid="6472699895759164599">"Aucune correspondance"</string>
<string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{ résultat }one{ sur {total}}other{ sur {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"OK"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Suppression de l\'espace de stockage partagé…"</string>
<string name="share" msgid="4157615043345227321">"Partager"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Activer"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Application non disponible"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas disponible pour le moment."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponible"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Actuellement, vous ne pouvez pas accéder à cette application sur votre <xliff:g id="DEVICE">%1$s</xliff:g>. Essayez plutôt d\'y accéder sur votre appareil Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Actuellement, vous ne pouvez pas accéder à cette application sur votre <xliff:g id="DEVICE">%1$s</xliff:g>. Essayez plutôt d\'y accéder sur votre tablette."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Actuellement, vous ne pouvez pas accéder à cette application sur votre <xliff:g id="DEVICE">%1$s</xliff:g>. Essayez plutôt d\'y accéder sur votre téléphone."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Cette application a été conçue pour une ancienne version d\'Android et risque de ne pas fonctionner correctement. Recherchez des mises à jour ou contactez le développeur."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Rechercher une mise à jour"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Vous avez de nouveaux messages"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DÉSINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OUVRIR QUAND MÊME"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Application dangereuse détectée"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Demande d\'accès aux journaux système"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Cette fois seulement"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ne pas autoriser"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Journaux système des demandes <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> pour le débogage fonctionnel. Ces journaux peuvent contenir des informations écrites par les applis et services de votre appareil."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne plus afficher"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> souhaite afficher des éléments de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Modifier"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibreur pour les appels et les notifications"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue Marche/Arrêt"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Verrouiller l\'écran"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Crochet du casque"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Raccourci d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Outil de sélection des raccourcis d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Raccourci d\'accessibilité"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Fermer le volet des notifications"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Pavé directionnel - Haut"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Pavé directionnel - Bas"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel - Gauche"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel - Droite"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel - Centre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Appuyez pour l\'activer"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Aucune appli professionnelle"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Aucune appli personnelle"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil personnel ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil professionnel ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utiliser le navigateur personnel"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utiliser le navigateur professionnel"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Code PIN de déblocage du réseau SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan et décharge la batterie. Appuyez ici pour en savoir plus."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan depuis longtemps. Appuyez ici pour en savoir plus."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Vérifier les applis actives"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 43454c0..6db4a32 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Desbloquea a pantalla para continuar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Detectouse unha impresión dixital parcial"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Non se puido procesar a impresión dixital. Téntao de novo."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpa o sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mantén o dedo no sensor un pouco máis"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"O dedo moveuse demasiado lento. Téntao de novo."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Proba con outra impresión dixital"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Hai demasiada luz"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Cambia lixeiramente a posición do dedo en cada intento"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Autenticouse a impresión dixital"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Autenticouse a cara"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Autenticouse a cara, preme Confirmar"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omitir"</string>
<string name="no_matches" msgid="6472699895759164599">"Non hai coincidencias"</string>
<string name="find_on_page" msgid="5400537367077438198">"Buscar na páxina"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidencia}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Feito"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamento compartido…"</string>
<string name="share" msgid="4157615043345227321">"Compartir"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Activar"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"A aplicación non está dispoñible"</string>
<string name="app_blocked_message" msgid="542972921087873023">"A aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> non está dispoñible neste momento."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> non está dispoñible"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Nestes momentos, non podes acceder a este contido desde o teu dispositivo (<xliff:g id="DEVICE">%1$s</xliff:g>). Proba a facelo desde o dispositivo con Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Nestes momentos, non podes acceder a este contido desde o teu dispositivo (<xliff:g id="DEVICE">%1$s</xliff:g>). Proba a facelo desde a tableta."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Nestes momentos, non podes acceder a este contido desde o teu dispositivo (<xliff:g id="DEVICE">%1$s</xliff:g>). Proba a facelo desde o teléfono."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Esta aplicación deseñouse para unha versión anterior de Android e quizais non funcione correctamente. Proba a buscar actualizacións ou contacta co programador."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Buscar actualización"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Tes mensaxes novas"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR IGUALMENTE"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Detectouse unha aplicación daniña"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Solicitude acceso a rexistros do sistema"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Só esta vez"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Non permitir"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> solicita rexistros do sistema para realizar unha depuración funcional. Estes rexistros poderían conter información que escribiron as aplicacións e os servizos do teu dispositivo."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Non amosar outra vez"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> quere mostrar fragmentos de aplicación de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificacións vibrarán"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Cadro de diálogo de acendido/apagado"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Gancho para auriculares"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atallo de accesibilidade en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de atallos de accesibilidade en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atallo de accesibilidade"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignorar panel despregable"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Botón direccional: arriba"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Botón direccional: abaixo"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botón direccional: esquerda"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botón direccional: dereita"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botón direccional: centro"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> incluíuse no grupo RESTRINXIDO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tocar para activar o perfil"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Non hai ningunha aplicación do traballo compatible"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Non hai ningunha aplicación persoal compatible"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Queres abrir <xliff:g id="APP">%s</xliff:g> no teu perfil persoal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Queres abrir <xliff:g id="APP">%s</xliff:g> no teu perfil de traballo?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilizar navegador persoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilizar navegador de traballo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo da rede SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> está executándose en segundo plano e consumindo batería. Toca para revisalo."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> leva moito tempo executándose en segundo plano. Toca para revisalo."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Comprobar aplicacións activas"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 1f4ca30..fe1b92b 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"આગળ વધવા માટે તમારું સ્ક્રીન લૉક દાખલ કરો"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"આંશિક ફિંગરપ્રિન્ટ મળી"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ફિંગરપ્રિન્ટ પ્રક્રિયા કરી શકાઈ નથી. કૃપા કરીને ફરી પ્રયાસ કરો."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"સેન્સર સાફ કરો"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"આંગળીને થોડો વધુ સમય સેન્સર પર રાખો"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"આંગળી બહુ જ ધીમેથી ખસેડી. કૃપા કરીને ફરી પ્રયાસ કરો."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"અન્ય ફિંગરપ્રિન્ટ અજમાવી જુઓ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"અતિશય પ્રકાશિત"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"દરેક વખતે સ્કૅનર પર તમારી આંગળીની સ્થિતિ સહેજ બદલતા રહો"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ફિંગરપ્રિન્ટ પ્રમાણિત કરી"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ચહેરા પ્રમાણિત"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ચહેરા પ્રમાણિત, કૃપા કરીને કન્ફર્મ કરો"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"છોડો"</string>
<string name="no_matches" msgid="6472699895759164599">"કોઈ મેળ નથી"</string>
<string name="find_on_page" msgid="5400537367077438198">"પૃષ્ઠ પર શોધો"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{{total}માંથી }one{# મેળ {total}માંથી }other{# મેળ}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"થઈ ગયું"</string>
<string name="progress_erasing" msgid="6891435992721028004">"શેર કરેલ સ્ટોરેજ ભૂસી રહ્યાં છીએ…"</string>
<string name="share" msgid="4157615043345227321">"શેર કરો"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ચાલુ કરો"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ઍપ ઉપલબ્ધ નથી"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> હાલમાં ઉપલબ્ધ નથી."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ઉપલબ્ધ નથી"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"અત્યારે આને તમારા <xliff:g id="DEVICE">%1$s</xliff:g> પર ઍક્સેસ કરી શકાતી નથી. તેના બદલે તમારા Android TV ડિવાઇસ પર પ્રયાસ કરો."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"અત્યારે આને તમારા <xliff:g id="DEVICE">%1$s</xliff:g> પર ઍક્સેસ કરી શકાતી નથી. તેના બદલે તમારા ટૅબ્લેટ પર પ્રયાસ કરો."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"અત્યારે આને તમારા <xliff:g id="DEVICE">%1$s</xliff:g> પર ઍક્સેસ કરી શકાતી નથી. તેના બદલે તમારા ફોન પર પ્રયાસ કરો."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"આ ઍપ Androidના જૂના વર્ઝન માટે બનાવવામાં આવ્યું હતું અને તે કદાચ તે યોગ્ય રીતે કાર્ય કરી શકશે નહીં. અપડેટ માટે તપાસવાનો પ્રયાસ કરો અથવા ડેવલપરનો સંપર્ક કરો."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"અપડેટ માટે તપાસો"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"તમારી પાસે નવા સંદેશા છે"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"અનઇન્સ્ટૉલ કરો"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"કોઈપણ રીતે ખોલો"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"નુકસાનકારક ઍપ મળી આવી છે"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"સિસ્ટમ લૉગ ઍક્સેસ કરવાની વિનંતી"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"માત્ર આ વખતે"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"મંજૂરી આપશો નહીં"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"ફંક્શનલ ડિબગીંગ માટે, <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> સિસ્ટમ લૉગની વિનંતી કરે છે. તમારા ડિવાઇસ પરની ઍપ અને સેવાઓએ લખેલી માહિતી આ લૉગમાં શામેલ હોઈ શકે છે."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"ફરીથી બતાવશો નહીં"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>એ <xliff:g id="APP_2">%2$s</xliff:g> સ્લાઇસ બતાવવા માગે છે"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ફેરફાર કરો"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"કૉલ અને નોટિફિકેશન માટે ઉપકરણ વાઇબ્રેટ થશે"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"પાવર સંવાદ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"લૉક સ્ક્રીન"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"સ્ક્રીનશૉટ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"હૅડસેટ હુક"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટના પસંદકર્તા"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ઍક્સેસિબિલિટી શૉર્ટકટ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"નોટિફિકેશન શેડ છોડી દો"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"ડી-પૅડ ઉપર"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"ડી-પૅડ નીચે"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ડી-પૅડ ડાબે"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ડી-પૅડ જમણે"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ડી-પૅડ મધ્યમાં"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>નું કૅપ્શન બાર."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ને પ્રતિબંધિત સમૂહમાં મૂકવામાં આવ્યું છે"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ચાલુ કરવા માટે ટૅપ કરો"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"કોઈ ઑફિસ માટેની ઍપ સપોર્ટ કરતી નથી"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"કોઈ વ્યક્તિગત ઍપ સપોર્ટ કરતી નથી"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"તમારી વ્યક્તિગત પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g> ખોલીએ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"તમારી ઑફિસની પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g> ખોલીએ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"વ્યક્તિગત બ્રાઉઝરનો ઉપયોગ કરો"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ઑફિસના બ્રાઉઝરના ઉપયોગ કરો"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"સિમ નેટવર્કને અનલૉક કરવાનો પિન"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> બૅકગ્રાઉન્ડમાં ચાલી રહી છે અને અતિશય બૅટરી વાપરી રહી છે. રિવ્યૂ કરવા માટે ટૅપ કરો."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> લાંબા સમયથી બૅકગ્રાઉન્ડમાં ચાલી રહી છે. રિવ્યૂ કરવા માટે ટૅપ કરો."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"સક્રિય ઍપ ચેક કરો"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 0a5585b..3cf2137 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"जारी रखने के लिए, अपने स्क्रीन लॉक की पुष्टि करें"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"पूरा फ़िंगरप्रिंट पहचाना नहीं जा सका"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"फ़िंगरप्रिंट प्रोसेस नहीं हो सका. कृपया दोबारा कोशिश करें."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"सेंसर को साफ़ करें"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"उंगली को थोड़ी देर और सेंसर पर रखें"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"उंगली बहुत धीरे चलाई गई. कृपया फिर से कोशिश करें."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"किसी दूसरे फ़िंगरप्रिंट से कोशिश करें"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"बहुत रोशनी है"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"फ़िंगरप्रिंट सेट अप करते समय, अपनी उंगली को हर बार थोड़ी अलग स्थिति में रखें"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"फ़िंगरप्रिंट की पुष्टि हो गई"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"चेहरे की पहचान की गई"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"चेहरे की पहचान की गई, कृपया पुष्टि बटन दबाएं"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"अभी नहीं"</string>
<string name="no_matches" msgid="6472699895759164599">"कोई मिलान नहीं"</string>
<string name="find_on_page" msgid="5400537367077438198">"पेज पर ढूंढें"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# नतीजा{total} में से }one{# {total} में से }other{# }} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"हो गया"</string>
<string name="progress_erasing" msgid="6891435992721028004">"शेयर की गई मेमोरी हमेशा के लिए मिटाई जा रही है…"</string>
<string name="share" msgid="4157615043345227321">"शेयर करें"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"चालू करें"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ऐप्लिकेशन उपलब्ध नहीं है"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> इस समय उपलब्ध नहीं है."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> उपलब्ध नहीं है"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"इस समय, आपके <xliff:g id="DEVICE">%1$s</xliff:g> पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने Android TV डिवाइस पर कोशिश करें."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"इस समय, आपके <xliff:g id="DEVICE">%1$s</xliff:g> पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने टैबलेट पर कोशिश करें."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"इस समय, आपके <xliff:g id="DEVICE">%1$s</xliff:g> पर इसे ऐक्सेस नहीं किया जा सकता. इसके बजाय, अपने फ़ोन पर कोशिश करें."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"यह ऐप्लिकेशन Android के पुराने वर्शन के लिए बनाया गया था, इसलिए हो सकता है कि यह सही से काम न करे. देखें कि अपडेट मौजूद हैं या नहीं, या फिर डेवलपर से संपर्क करें."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"देखें कि अपडेट मौजूद है या नहीं"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"आपके पास नए संदेश हैं"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"अनइंस्टॉल करें"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"फिर भी खोलें"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"नुकसान पहुंचाने वाले ऐप का पता चला"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"सिस्टम लॉग को ऐक्सेस करने का अनुरोध"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"सिर्फ़ इस बार"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"अनुमति न दें"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"फ़ंक्शनल डीबगिंग के लिए, <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> का सिस्टम लॉग के लिए अनुरोध. इन लॉग में आपके डिवाइस पर मौजूद ऐप्लिकेशन और सेवाओं से मिली जानकारी शामिल हो सकती है."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"फिर से न दिखाएं"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाना चाहता है"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"बदलाव करें"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कॉल और सूचनाओं के लिए डिवाइस वाइब्रेट हाेगा"</string>
@@ -2119,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"वर्क प्रोफ़ाइल चालू करने के लिए टैप करें"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"यह कॉन्टेंट, ऑफ़िस के काम से जुड़े आपके किसी भी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"यह कॉन्टेंट आपके किसी भी निजी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"क्या <xliff:g id="APP">%s</xliff:g> को निजी प्रोफ़ाइल में खोलना है?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"क्या <xliff:g id="APP">%s</xliff:g> को वर्क प्रोफ़ाइल में खोलना है?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"निजी ब्राउज़र का इस्तेमाल करें"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ऑफ़िस के काम से जुड़े ब्राउज़र का इस्तेमाल करें"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क को अनलॉक करने का पिन"</string>
@@ -2257,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> बैकग्राउंड में चल रहा है और बैटरी खर्च कर रहा है. देखने के लिए टैप करें."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> बैकग्राउंड में बहुत देर से चल रहा है. देखने के लिए टैप करें."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"चालू ऐप्लिकेशन देखें"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 50d5f68..14139ea 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -589,8 +589,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Upotrijebite zaključavanje zaslona da biste nastavili"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Otkriven je djelomični otisak prsta"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Obrada otiska prsta nije uspjela. Pokušajte ponovo."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Očistite senzor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Zadržite još malo"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Presporo pomicanje prsta. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Isprobajte drugi otisak prsta"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Presvijetlo"</string>
@@ -598,6 +602,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Svaki put lagano promijenite položaj prsta"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Autentificirano otiskom prsta"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Lice je autentificirano"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Lice je autentificirano, pritisnite Potvrdi"</string>
@@ -1501,7 +1509,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Nema rezultata"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pronađi na stranici"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# podudaranje}one{# od {total}}few{# od {total}}other{# od {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Gotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Brisanje dijeljene pohrane…"</string>
<string name="share" msgid="4157615043345227321">"Dijeli"</string>
@@ -1929,6 +1938,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Uključi"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutačno nije dostupna."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – nije dostupno"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Trenutačno toj aplikaciji nije moguće pristupiti na vašem uređaju <xliff:g id="DEVICE">%1$s</xliff:g>. Pokušajte joj pristupiti na Android TV uređaju."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Trenutačno toj aplikaciji nije moguće pristupiti na vašem uređaju <xliff:g id="DEVICE">%1$s</xliff:g>. Pokušajte joj pristupiti na svojem tabletu."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Trenutačno toj aplikaciji nije moguće pristupiti na vašem uređaju <xliff:g id="DEVICE">%1$s</xliff:g>. Pokušajte joj pristupiti na svojem telefonu."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ova je aplikacija razvijena za stariju verziju Androida i možda neće funkcionirati pravilno. Potražite ažuriranja ili se obratite razvojnom programeru."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Provjeri ažuriranja"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Imate nove poruke"</string>
@@ -2018,16 +2031,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALIRAJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Zahtjev za pristup zapisnicima sustava"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Samo ovaj put"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nemoj dopustiti"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Aplikacija <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> zahtijeva zapisnike sustava radi funkcionalnog otklanjanja pogrešaka. Ti zapisnici mogu sadržavati podatke koje su zabilježile aplikacije i usluge na vašem uređaju."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne prikazuj ponovo"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> želi prikazivati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Uredi"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Uređaj će vibrirati za pozive i obavijesti"</string>
@@ -2090,22 +2098,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključajte zaslon"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimka zaslona"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kuka za slušalice"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečac pristupačnosti na zaslonu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Alat za odabir prečaca pristupačnosti na zaslonu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečac pristupačnosti"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Odbacivanje zaslona obavijesti"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Gore na plohi za smjerove"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dolje na plohi za smjerove"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Lijevo na plohi za smjerove"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Desno na plohi za smjerove"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"U središtu plohe za smjerove"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka naslova aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> premješten je u spremnik OGRANIČENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2126,10 +2128,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da biste uključili"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Poslovne aplikacije nisu dostupne"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Osobne aplikacije nisu dostupne"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Želite li otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na osobnom profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Želite li otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na poslovnom profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi osobni preglednik"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni preglednik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje SIM mreže."</string>
@@ -2264,4 +2264,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> izvodi se u pozadini i prazni bateriju. Dodirnite za pregled."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> dugo se izvodi u pozadini. Dodirnite za pregled."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Provjera aktivnih aplikacija"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 9260a7c..f94f063 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"hozzáférés a naptárhoz"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS-ek küldése és megtekintése"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Fájlok és dokumentumok"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"hozzáférhet fájljaihoz és dokumentumaihoz az eszközén"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Zenék és más audiotartalmak"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"hozzáférés az eszközön található hangfájlokhoz"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotók és videók"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"A folytatáshoz adja meg a képernyőzár hitelesítési adatait"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"A rendszer részleges ujjlenyomatot észlelt"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nem sikerült feldolgozni az ujjlenyomatot. Próbálkozzon újra."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Tisztítsa meg az érzékelőt"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Ne mozdítsa meg az ujját még egy kicsit"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Tisztítsa meg az ujjlenyomat-érzékelőt, majd próbálja újra"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Tisztítsa meg az érzékelőt, majd próbálja újra"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Nyomja meg határozottan az érzékelőt"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Túl lassan húzta az ujját. Próbálkozzon újra."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Próbálkozzon másik ujjlenyomattal"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Túl világos"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Módosítsa minden alkalommal kis mértékben ujja helyzetét."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Az ujjlenyomat nem ismerhető fel"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Nyomja meg határozottan az érzékelőt"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Ujjlenyomat hitelesítve"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Arc hitelesítve"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Arc hitelesítve; nyomja meg a Megerősítés lehetőséget"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Kihagyás"</string>
<string name="no_matches" msgid="6472699895759164599">"Nincs találat"</string>
<string name="find_on_page" msgid="5400537367077438198">"Keresés az oldalon"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# találat {total}/}other{# }} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Kész"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Közös tárhely tartalmának törlése…"</string>
<string name="share" msgid="4157615043345227321">"Megosztás"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Bekapcsolás"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Az alkalmazás nem hozzáférhető"</string>
<string name="app_blocked_message" msgid="542972921087873023">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> jelenleg nem hozzáférhető."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"A(z) <xliff:g id="ACTIVITY">%1$s</xliff:g> nem áll rendelkezése"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Ehhez jelenleg nem lehet hozzáférni a következő eszközön: <xliff:g id="DEVICE">%1$s</xliff:g>. Próbálja újra Android TV-eszközén."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Ehhez jelenleg nem lehet hozzáférni a következő eszközön: <xliff:g id="DEVICE">%1$s</xliff:g>. Próbálja újra a táblagépén."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Ehhez jelenleg nem lehet hozzáférni a következő eszközön: <xliff:g id="DEVICE">%1$s</xliff:g>. Próbálja újra a telefonján."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ez az alkalmazás az Android egyik korábbi verziójához készült, így elképzelhető, hogy nem működik majd megfelelően ezen a rendszeren. Keressen frissítéseket, vagy vegye fel a kapcsolatot a fejlesztővel."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Frissítés keresése"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Új üzenetei érkeztek"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ELTÁVOLÍTÁS"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"MEGNYITÁS MÉGIS"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"A rendszer kártékony alkalmazást észlelt"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Rendszernaplókhoz való hozzáférés kérése"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Csak most"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Tiltás"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Funkcionális hibaelhárítás céljából a(z) <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> hozzáférést kér a rendszernaplókhoz. A naplókban olyan információk lehetnek, amelyek az eszközön használt alkalmazásoktól és szolgáltatásoktól származnak."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne jelenjen meg újra"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"A(z) <xliff:g id="APP_0">%1$s</xliff:g> alkalmazás részleteket szeretne megjeleníteni a(z) <xliff:g id="APP_2">%2$s</xliff:g> alkalmazásból"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Szerkesztés"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"A hívások és az értesítések rezegnek"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Akkumulátorral kapcsolatos párbeszédpanel"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lezárási képernyő"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Képernyőkép"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headsetkampó"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancs"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancsválasztó"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Kisegítő lehetőségek gyorsparancsa"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Értesítési felület bezárása"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-pad – fel"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-pad – le"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad – balra"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad – jobbra"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – középre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás címsora."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"A következő csomag a KORLÁTOZOTT csoportba került: <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Koppintson a bekapcsoláshoz"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nincs munkahelyi alkalmazás"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nincs személyes alkalmazás"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazást a személyes profil használatával?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazást a munkaprofil használatával?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Személyes böngésző használata"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Munkahelyi böngésző használata"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Hálózati SIM feloldó PIN-kódja"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"A(z) <xliff:g id="APP">%1$s</xliff:g> alkalmazás fut a háttérben, és meríti az akkumulátort. Koppintson az áttekintéshez."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"A(z) <xliff:g id="APP">%1$s</xliff:g> alkalmazás már hosszú ideje fut a háttérben. Koppintson az áttekintéshez."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Aktív alkalmazások ellenőrzése"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index ddbc9cf..ea6eddd 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Շարունակելու համար ապակողպեք էկրանը"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Մատնահետքն ամբողջությամբ չի սկանավորվել"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Չհաջողվեց մշակել մատնահետքը: Նորից փորձեք:"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Մաքրեք մատնահետքի սկաները"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Փոքր-ինչ երկար պահեք"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Շատ դանդաղ անցկացրիք մատը: Փորձեք նորից:"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Փորձեք մեկ այլ մատնահետք"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Շատ լուսավոր է"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Ամեն անգամ թեթևակի փոխեք մատի դիրքը"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Մատնահետքը նույնականացվեց"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Դեմքը ճանաչվեց"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Դեմքը ճանաչվեց: Սեղմեք «Հաստատել»:"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Բաց թողնել"</string>
<string name="no_matches" msgid="6472699895759164599">"Համընկնում չկա"</string>
<string name="find_on_page" msgid="5400537367077438198">"Գտեք էջում"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# համընկնում}one{#-ը՝ {total}-ից}other{#-ը՝ {total}-ից}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Պատրաստ է"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Ընդհանուր հիշողությունը ջնջվում է…"</string>
<string name="share" msgid="4157615043345227321">"Կիսվել"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Միացնել"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Հավելվածը հասանելի չէ"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այս պահին հասանելի չէ։"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g>՝ անհասանելի է"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Այս պահին հնարավոր չէ բացել հավելվածը <xliff:g id="DEVICE">%1$s</xliff:g> սարքում։ Փորձեք Android TV սարքում։"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Այս պահին հնարավոր չէ բացել հավելվածը <xliff:g id="DEVICE">%1$s</xliff:g> սարքում։ Փորձեք ձեր պլանշետում։"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Այս պահին հնարավոր չէ բացել հավելվածը <xliff:g id="DEVICE">%1$s</xliff:g> սարքում։ Փորձեք ձեր հեռախոսում։"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Այս հավելվածը ստեղծվել է Android-ի ավելի հին տարբերակի համար և կարող է պատշաճ չաշխատել: Ստուգեք թարմացումների առկայությունը կամ դիմեք մշակողին:"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Ստուգել նոր տարբերակի առկայությունը"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Դուք ունեք նոր հաղորդագրություններ"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ԱՊԱՏԵՂԱԴՐԵԼ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ԲԱՑԵԼ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Հայտնաբերվել է վնասաբեր հավելված"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Համակարգի մատյանների օգտագործման հարցում"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Միայն այս անգամ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Չթույլատրել"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> հավելվածը համակարգի մատյաններն օգտագործելու թույլտվություն է խնդրում՝ ֆունկցիոնալ վրիպազերծում կատարելու համար։ Այս մատյանները կարող են պարունակել տեղեկություններ, որոնք գրվել են ձեր սարքի հավելվածների ու ծառայությունների կողմից։"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Այլևս ցույց չտալ"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> հավելվածն ուզում է ցուցադրել հատվածներ <xliff:g id="APP_2">%2$s</xliff:g> հավելվածից"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Փոփոխել"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Զանգերի և ծանուցումների համար թրթռոցը միացված է"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Սնուցման պատուհան"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Կողպէկրան"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Սքրինշոթ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Ականջակալի կարթ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Հատուկ գործառույթների դյուրանցում"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Հատուկ գործառույթների դյուրանցման ընտրիչ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Հատուկ գործառույթների դյուրանցում"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Փակել ծանուցումների վահանակը"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad-ի «Վերև» կոճակ"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad-ի «Ներքև» կոճակ"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad-ի «Ձախ» կոճակ"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad-ի «Աջ» կոճակ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad-ի «Կենտրոն» կոճակ"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի ենթագրերի գոտին։"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> փաթեթը գցվեց ՍԱՀՄԱՆԱՓԱԿՎԱԾ զամբյուղի մեջ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Հպեք՝ միացնելու համար"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Աշխատանքային հավելվածներ չկան"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Անձնական հավելվածներ չկան"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածը ձեր անձնական պրոֆիլում"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածը ձեր աշխատանքային պրոֆիլում"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Օգտագործել անձնական դիտարկիչը"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Օգտագործել աշխատանքային դիտարկիչը"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM Network քարտի ապակողպման PIN"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> հավելվածն աշխատում է ֆոնային ռեժիմում և սպառում է մարտկոցի լիցքը։ Հպեք՝ դիտելու համար։"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> հավելվածը երկար ժամանակ աշխատում է ֆոնային ռեժիմում։ Հպեք՝ դիտելու համար։"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Ստուգել ակտիվ հավելվածները"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 65e0cc0..de24aa5 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Masukkan kunci layar untuk melanjutkan"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Sebagian sidik jari terdeteksi"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Tidak dapat memproses sidik jari. Coba lagi."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Bersihkan sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Tahan sedikit lebih lama"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Jari digerakkan terlalu lambat. Coba lagi."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Coba sidik jari lain"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Terlalu terang"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Ubah sedikit posisi jari di setiap percobaan"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Sidik jari diautentikasi"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Wajah diautentikasi"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Wajah diautentikasi, silakan tekan konfirmasi"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Lewati"</string>
<string name="no_matches" msgid="6472699895759164599">"Tidak ada kecocokan"</string>
<string name="find_on_page" msgid="5400537367077438198">"Temukan pada halaman"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# cocok}other{# dari {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Selesai"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Menghapus penyimpanan bersama…"</string>
<string name="share" msgid="4157615043345227321">"Bagikan"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aktifkan"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikasi tidak tersedia"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak tersedia saat ini."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> tidak tersedia"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Aplikasi ini tidak dapat diakses di <xliff:g id="DEVICE">%1$s</xliff:g> untuk saat ini. Coba di perangkat Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Aplikasi ini tidak dapat diakses di <xliff:g id="DEVICE">%1$s</xliff:g> untuk saat ini. Coba di tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Aplikasi ini tidak dapat diakses di <xliff:g id="DEVICE">%1$s</xliff:g> untuk saat ini. Coba di ponsel."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Aplikasi ini dibuat untuk Android versi lama dan mungkin tidak berfungsi sebagaimana mestinya. Coba periksa apakah ada update, atau hubungi developer."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Periksa apakah ada update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Ada pesan baru"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTAL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TETAP BUKA"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplikasi berbahaya terdeteksi"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Permintaan akses log sistem"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Hanya kali ini"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Jangan izinkan"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> meminta log sistem untuk proses debug fungsional. Log ini mungkin berisi informasi yang telah ditulis oleh aplikasi dan layanan di perangkat Anda."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Jangan tampilkan lagi"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ingin menampilkan potongan <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Panggilan dan notifikasi akan bergetar"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Daya"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Layar Kunci"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset Hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pintasan Aksesibilitas di layar"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pemilih Pintasan Aksesibilitas di layar"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pintasan Aksesibilitas"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Tutup Menu Notifikasi"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad Atas"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad Bawah"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Kiri"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Kanan"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Kolom teks <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah dimasukkan ke dalam bucket DIBATASI"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Ketuk untuk mengaktifkan"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Tidak ada aplikasi kerja"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Tidak ada aplikasi pribadi"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Buka <xliff:g id="APP">%s</xliff:g> di profil pribadi?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Buka <xliff:g id="APP">%s</xliff:g> di profil kerja?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gunakan browser pribadi"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gunakan browser kerja"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN pembuka kunci SIM network"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> berjalan di latar belakang dan menghabiskan daya baterai. Ketuk untuk meninjau."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> berjalan di latar belakang dalam waktu yang lama. Ketuk untuk meninjau."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Periksa aplikasi aktif"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 3a38bf8..4b2f371 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Sláðu inn skjálásinn þinn til að halda áfram"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Hluti fingrafars greindist"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Ekki var hægt að vinna úr fingrafarinu. Reyndu aftur."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Hreinsaðu lesarann"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Haltu aðeins lengur"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Fingurinn hreyfðist of hægt. Reyndu aftur."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prófaðu annað fingrafar"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Of bjart"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Breyttu stöðu fingursins örlítið í hvert skipti"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingrafar staðfest"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Andlit staðfest"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Andlit staðfest, ýttu til að staðfesta"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Sleppa"</string>
<string name="no_matches" msgid="6472699895759164599">"Engar samsvaranir"</string>
<string name="find_on_page" msgid="5400537367077438198">"Finna á síðu"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# samsvörun}one{# af {total}}other{# af {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Lokið"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Eyðir samnýttri geymslu…"</string>
<string name="share" msgid="4157615043345227321">"Deila"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Kveikja"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Forrit er ekki tiltækt"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> er ekki tiltækt núna."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ekki í boði"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Aðgangur að þessu í <xliff:g id="DEVICE">%1$s</xliff:g> er ekki í boði eins og er. Prófaðu það í Android TV tækinu í staðinn."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Aðgangur að þessu í <xliff:g id="DEVICE">%1$s</xliff:g> er ekki í boði eins og er. Prófaðu það í spjaldtölvunni í staðinn."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Aðgangur að þessu í <xliff:g id="DEVICE">%1$s</xliff:g> er ekki í boði eins og er. Prófaðu það í símanum í staðinn."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Þetta forrit var hannað fyrir eldri útgáfu af Android og ekki er víst að það virki eðlilega. Athugaðu hvort uppfærslur séu í boði eða hafðu samband við þróunaraðilann."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Leita að uppfærslu"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Þú ert með ný skilaboð"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"FJARLÆGJA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPNA SAMT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Skaðlegt forrit fannst"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Beiðni um aðgang að kerfisannálum"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Aðeins í þetta skipti"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ekki leyfa"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> biður um kerfisannála fyrir virka villuleit. Annálarnir kunna að innihalda upplýsingar sem forrit og þjónustur í tækinu þínu hafa skrifað."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ekki sýna aftur"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vill sýna sneiðar úr <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Breyta"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Titringur er virkur fyrir símtöl og tilkynningar"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Gluggi til að slökkva/endurræsa"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lásskjár"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjámynd"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Höfuðtólasnagi"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Flýtileið í aðgengiseiginleika á skjánum"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Val um flýtileið í aðgengiseiginleika á skjánum"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Flýtileið aðgengisstillingar"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Loka tilkynningaglugga"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Upphnappur stýriflatar"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Niðurhnappur stýriflatar"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Vinstrihnappur stýriflatar"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Hægrihnappur stýriflatar"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Miðjuhnappur stýriflatar"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Skjátextastika <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> var sett í flokkinn TAKMARKAÐ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Ýttu til að kveikja"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Engin vinnuforrit"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Engin forrit til einkanota"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Opna <xliff:g id="APP">%s</xliff:g> í þínu eigin sniði?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Opna <xliff:g id="APP">%s</xliff:g> í vinnusniðinu þínu?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Nota einkavafra"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Nota vinnuvafra"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-númer fyrir opnun á SIM-korti netkerfis"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> keyrir í bakgrunni og eyðir rafhlöðuorku. Ýttu til að skoða."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> hefur keyrt lengi í bakgrunni. Ýttu til að skoða."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Skoða virk forrit"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 9f047b4..b246d79 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"Possono accedere al calendario"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"Possono inviare e visualizzare SMS"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"File e documenti"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"Consente di accedere a file e documenti sul tuo dispositivo"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musica e altro audio"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"Accesso ai file audio sul tuo dispositivo"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto e video"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Inserisci il blocco schermo per continuare"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Rilevata impronta parziale"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Impossibile elaborare l\'impronta. Riprova."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Pulisci il sensore"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Tieni premuto un po\' più a lungo"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Pulisci il sensore di impronte digitali e riprova"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Pulisci il sensore e riprova"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Premi con decisione sul sensore"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Movimento del dito troppo lento. Riprova."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prova con un\'altra impronta"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Troppa luce"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Cambia leggermente la posizione del dito ogni volta"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Impronta non riconosciuta"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Premi con decisione sul sensore"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Impronta autenticata"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Volto autenticato"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Volto autenticato, premi Conferma"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Salta"</string>
<string name="no_matches" msgid="6472699895759164599">"Nessuna corrispondenza"</string>
<string name="find_on_page" msgid="5400537367077438198">"Trova nella pagina"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# corrispondenza}one{# di {total}}other{# di {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Fine"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Cancellazione archivio condiviso…"</string>
<string name="share" msgid="4157615043345227321">"Condividi"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Attiva"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"L\'app non è disponibile"</string>
<string name="app_blocked_message" msgid="542972921087873023">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> non è al momento disponibile."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> non disponibile"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Al momento non è possibile accedere a questa app su <xliff:g id="DEVICE">%1$s</xliff:g>. Prova a usare il dispositivo Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Al momento non è possibile accedere a questa app su <xliff:g id="DEVICE">%1$s</xliff:g>. Prova a usare il tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Al momento non è possibile accedere a questa app su <xliff:g id="DEVICE">%1$s</xliff:g>. Prova a usare il telefono."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Questa app è stata realizzata per una versione precedente di Android e potrebbe non funzionare correttamente. Prova a verificare la disponibilità di aggiornamenti o contatta lo sviluppatore."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Cerca aggiornamenti"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Hai nuovi messaggi"</string>
@@ -2089,22 +2095,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Finestra di dialogo Alimentazione"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Schermata di blocco"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Hook cuffie"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Scorciatoia Accessibilità sullo schermo"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selettore scorciatoia Accessibilità sullo schermo"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Scorciatoia Accessibilità"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignora area notifiche"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-pad - Su"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-pad - Giù"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad - Sinistra"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad - Destra"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad - Centro"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra del titolo di <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> è stato inserito nel bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> è in esecuzione in background e sta consumando la batteria. Tocca per controllare."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> è in esecuzione in background da molto tempo. Tocca per controllare."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verifica le app attive"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 14208e4..7cd023f 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -590,8 +590,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"יש לבטל את נעילת המסך כדי להמשיך"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"זוהתה טביעת אצבע חלקית"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"לא ניתן היה לעבד את טביעת האצבע. אפשר לנסות שוב."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"יש לנקות את החיישן"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"עליך להשאיר את האצבע על החיישן קצת יותר זמן"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"הזזת את האצבע לאט מדי. יש לנסות שוב."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"יש להשתמש בטביעת אצבע אחרת"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"בהיר מדי"</string>
@@ -599,6 +603,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"צריך לשנות מעט את תנוחת האצבע בכל פעם"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"טביעת האצבע אומתה"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"זיהוי הפנים בוצע"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"זיהוי הפנים בוצע. יש ללחוץ על אישור"</string>
@@ -1502,7 +1510,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"דילוג"</string>
<string name="no_matches" msgid="6472699895759164599">"אין התאמות"</string>
<string name="find_on_page" msgid="5400537367077438198">"חיפוש בדף"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{התאמה אחת}two{# מתוך {total}}many{# מתוך {total}}other{# מתוך {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"סיום"</string>
<string name="progress_erasing" msgid="6891435992721028004">"בתהליך מחיקה של אחסון משותף…"</string>
<string name="share" msgid="4157615043345227321">"שיתוף"</string>
@@ -1930,6 +1939,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"הפעלה"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"האפליקציה לא זמינה"</string>
<string name="app_blocked_message" msgid="542972921087873023">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא זמינה בשלב זה."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> לא זמינה"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"אי אפשר לגשת לאפליקציה הזו במכשיר <xliff:g id="DEVICE">%1$s</xliff:g> כרגע. במקום זאת, יש לנסות במכשיר Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"אי אפשר לגשת לאפליקציה הזו במכשיר <xliff:g id="DEVICE">%1$s</xliff:g> כרגע. במקום זאת, יש לנסות בטאבלט."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"אי אפשר לגשת לאפליקציה הזו במכשיר <xliff:g id="DEVICE">%1$s</xliff:g> כרגע. במקום זאת, יש לנסות בטלפון."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"האפליקציה הזו עוצבה לגרסה ישנה יותר של Android וייתכן שלא תפעל כראוי. ניתן לבדוק אם יש עדכונים או ליצור קשר עם המפתח."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"יש עדכון חדש?"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"יש לך הודעות חדשות"</string>
@@ -2019,16 +2032,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"הסרת התקנה"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"לפתוח בכל זאת"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"אותרה אפליקציה מזיקה"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"בקשת גישה ליומן מערכת"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"רק הפעם"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"אין אישור"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"האפליקציה <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> מבקשת יומני מערכת לצורך ניפוי באגים פונקציונלי. יכול להיות שהיומנים האלה מכילים מידע שנכתב על ידי אפליקציות ושירותים שבמכשיר שלך."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"אין להציג שוב"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> רוצה להציג חלקים מ-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"עריכה"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"שיחות והודעות ירטטו"</string>
@@ -2091,22 +2099,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"תיבת דו-שיח לגבי הסוללה"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"מסך הנעילה"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"צילום מסך"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"הוק לאוזניות"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"קיצור דרך לנגישות במסך"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"בורר קיצורי דרך לנגישות במסך"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"קיצור דרך לנגישות"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"סגירת לוח ההתראות"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"לחצן עליון ב-Dpad"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"לחצן תחתון ב-Dpad"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"לחצן שמאלי ב-Dpad"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"לחצן ימני ב-Dpad"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"לחצן אמצעי ב-Dpad"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"סרגל כיתוב של <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> התווספה לקטגוריה \'מוגבל\'"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2129,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"יש להקיש כדי להפעיל את פרופיל העבודה"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"אין אפליקציות לעבודה"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"אין אפליקציות לשימוש אישי"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"לפתוח את <xliff:g id="APP">%s</xliff:g> בפרופיל האישי?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"לפתוח את <xliff:g id="APP">%s</xliff:g> בפרופיל העבודה?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"בדפדפן האישי"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"בדפדפן של העבודה"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"קוד אימות לביטול הנעילה של רשת SIM"</string>
@@ -2265,4 +2265,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת ברקע ומרוקנת את הסוללה. יש להקיש כדי לבדוק."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת ברקע במשך הרבה זמן. יש להקיש כדי לבדוק."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"כדאי לבדוק את האפליקציות הפעילות"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 99435f4..0c70187 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -30,7 +30,7 @@
<string name="untitled" msgid="3381766946944136678">"<新規>"</string>
<string name="emptyPhoneNumber" msgid="5812172618020360048">"(電話番号なし)"</string>
<string name="unknownName" msgid="7078697621109055330">"不明"</string>
- <string name="defaultVoiceMailAlphaTag" msgid="2190754495304236490">"ボイスメール"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2190754495304236490">"留守番電話"</string>
<string name="defaultMsisdnAlphaTag" msgid="2285034592902077488">"MSISDN1"</string>
<string name="mmiError" msgid="2862759606579822246">"接続に問題があるか、MMIコードが正しくありません。"</string>
<string name="mmiFdnError" msgid="3975490266767565852">"発信番号制限で指定された番号に対してのみ操作できます。"</string>
@@ -91,7 +91,7 @@
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"緊急通報待機モード"</string>
<string name="notification_channel_mobile_data_status" msgid="1941911162076442474">"モバイルデータのステータス"</string>
<string name="notification_channel_sms" msgid="1243384981025535724">"SMS メッセージ"</string>
- <string name="notification_channel_voice_mail" msgid="8457433203106654172">"ボイスメール メッセージ"</string>
+ <string name="notification_channel_voice_mail" msgid="8457433203106654172">"留守番電話メッセージ"</string>
<string name="notification_channel_wfc" msgid="9048240466765169038">"Wi-Fi 通話"</string>
<string name="notification_channel_sim" msgid="5098802350325677490">"SIM のステータス"</string>
<string name="notification_channel_sim_high_prio" msgid="642361929452850928">"高優先度: SIM のステータス"</string>
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"カレンダーへのアクセス"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMSメッセージの送信と表示"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ファイル、ドキュメント"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"デバイス内のファイルやドキュメントへのアクセス"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"音楽やその他の音声"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"デバイス上の音声ファイルへのアクセス"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"写真と動画"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"続行するには画面ロックを入力してください"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"指紋の一部しか検出できません"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"指紋を処理できませんでした。もう一度お試しください。"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"センサーの汚れを取り除いてください"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"もう少し長く押してください"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"指紋認証センサーの汚れを取り除いて、もう一度お試しください"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"センサーの汚れを取り除いて、もう一度お試しください"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"センサーにしっかりと押し当ててください"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"指の動きが遅すぎました。もう一度お試しください。"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"別の指紋をお試しください"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"明るすぎます"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"毎回、指を置く位置を少し変えてください"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"指紋を認識できません"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"センサーにしっかりと押し当ててください"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"指紋認証を完了しました"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"顔を認証しました"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"顔を認証しました。[確認] を押してください"</string>
@@ -1037,8 +1038,8 @@
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"モバイル デバイスに保存されているブラウザの履歴やブックマークの変更をアプリに許可します。これにより、アプリがブラウザデータを消去または変更できるようになる可能性があります。注: この許可は、サードパーティブラウザまたはウェブブラウジング機能を備えたその他のアプリでは適用されない場合があります。"</string>
<string name="permlab_setAlarm" msgid="1158001610254173567">"アラームの設定"</string>
<string name="permdesc_setAlarm" msgid="2185033720060109640">"インストール済みアラームアプリのアラームを設定することをアプリに許可します。この機能が実装されていないアラームアプリもあります。"</string>
- <string name="permlab_addVoicemail" msgid="4770245808840814471">"ボイスメールの追加"</string>
- <string name="permdesc_addVoicemail" msgid="5470312139820074324">"ボイスメール受信トレイにメッセージを追加することをアプリに許可します。"</string>
+ <string name="permlab_addVoicemail" msgid="4770245808840814471">"留守番電話の追加"</string>
+ <string name="permdesc_addVoicemail" msgid="5470312139820074324">"留守番電話受信トレイにメッセージを追加することをアプリに許可します。"</string>
<string name="permlab_writeGeolocationPermissions" msgid="8605631647492879449">"ブラウザの現在地情報に対する権限の変更"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="5817346421222227772">"ブラウザの現在地情報に対する権限の変更をアプリに許可します。この許可を悪意のあるアプリに利用されると、任意のウェブサイトに現在地情報が送信される恐れがあります。"</string>
<string name="save_password_message" msgid="2146409467245462965">"このパスワードをブラウザで保存しますか?"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"スキップ"</string>
<string name="no_matches" msgid="6472699895759164599">"該当なし"</string>
<string name="find_on_page" msgid="5400537367077438198">"ページ内を検索"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 件の一致}other{# 件(合計 {total} 件)}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"完了"</string>
<string name="progress_erasing" msgid="6891435992721028004">"共有ストレージを消去しています…"</string>
<string name="share" msgid="4157615043345227321">"共有"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ON にする"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"アプリの利用不可"</string>
<string name="app_blocked_message" msgid="542972921087873023">"現在 <xliff:g id="APP_NAME">%1$s</xliff:g> はご利用になれません。"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g>は利用できません"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"現在、<xliff:g id="DEVICE">%1$s</xliff:g> からアクセスできません。Android TV デバイスでのアクセスをお試しください。"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"現在、<xliff:g id="DEVICE">%1$s</xliff:g> からアクセスできません。タブレットでのアクセスをお試しください。"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"現在、<xliff:g id="DEVICE">%1$s</xliff:g> からアクセスできません。スマートフォンでのアクセスをお試しください。"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"このアプリは以前のバージョンの Android 用に作成されており、正常に動作しない可能性があります。アップデートを確認するか、デベロッパーにお問い合わせください。"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"アップデートを確認"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"新着メッセージがあります"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"アンインストール"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"開く"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"有害なアプリが検出されました"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"システムログへのアクセスのリクエスト"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"今回のみ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"許可しない"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> が機能デバッグのためにシステムログをリクエストしています。これらのログには、デバイス上のアプリやサービスが書き込んだ情報が含まれている可能性があります。"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"次回から表示しない"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"「<xliff:g id="APP_0">%1$s</xliff:g>」が「<xliff:g id="APP_2">%2$s</xliff:g>」のスライスの表示をリクエストしています"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"編集"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"着信や通知をバイブレーションで知らせます"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"電源ダイアログ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ロック画面"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"スクリーンショット"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ヘッドセット: フック"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"画面上のユーザー補助機能のショートカット"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"画面上のユーザー補助機能のショートカットの選択メニュー"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ユーザー補助機能のショートカット"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"通知シェードを閉じる"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-pad: 上"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-pad: 下"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad: 左"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad: 右"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad: 中央"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> のキャプション バーです。"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> は RESTRICTED バケットに移動しました。"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"タップすると有効になります"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"仕事用アプリはありません"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"個人用アプリはありません"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"個人用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"仕事用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"個人用ブラウザを使用"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"仕事用ブラウザを使用"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM のネットワーク ロック解除 PIN"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> がバックグラウンドで実行され、バッテリーを消費しています。タップしてご確認ください。"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> がバックグラウンドで長時間実行されています。タップしてご確認ください。"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"有効なアプリをチェック"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 8af5df9..ae3f31c 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"თქვენს კალენდარზე წვდომა"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS შეტყობინებების გაგზავნა და ნახვა"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ფაილები და დოკუმენტები"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"თქვენს მოწყობილობაზე ფაილებსა და დოკუმენტებზე წვდომა"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"მუსიკა და სხვა აუდიო ფაილები"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"თქვენს მოწყობილობაზე აუდიო ფაილებზე წვდომა"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ფოტოები და ვიდეოები"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"გასაგრძელებლად შედით ეკრანის დაბლოკვაში"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ამოცნობილია ნაწილობრივი თითის ანაბეჭდი"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"თითის ანაბეჭდის დამუშავება ვერ მოხერხდა. გთხოვთ, ცადოთ ხელახლა."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"გაწმინდეთ სენსორი"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ცოტა მეტ ხანს გეჭიროთ"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"გაწმინდეთ თითის ანაბეჭდის სენსორი და ხელახლა ცადეთ"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"გაწმინდეთ სენსორი და ხელახლა ცადეთ"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"მაგრად დააჭირეთ სენსორს"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"თითის აღება მეტისმეტად ნელა მოხდა. გთხოვთ, სცადოთ ხელახლა."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ცადეთ სხვა თითის ანაბეჭდი"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ზედმეტად ნათელია"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ოდნავ შეცვალეთ თითის დაჭერის ადგილი ყოველ ჯერზე"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"თითის ანაბეჭდის ამოცნობა ვერ მოხერხდა"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"მაგრად დააჭირეთ სენსორს"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"თითის ანაბეჭდი ავტორიზებულია"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"სახე ავტორიზებულია"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"სახე ავტორიზებულია, დააჭირეთ დადასტურებას"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"გამოტოვება"</string>
<string name="no_matches" msgid="6472699895759164599">"შესატყვისები არ არის."</string>
<string name="find_on_page" msgid="5400537367077438198">"გვერდზე ძებნა"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# დამთხვევა}other{# {total}-დან}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"დასრულდა"</string>
<string name="progress_erasing" msgid="6891435992721028004">"მიმდინარეობს ზიარი მეხსიერების ამოშლა…"</string>
<string name="share" msgid="4157615043345227321">"გაზიარება"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ჩართვა"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"აპი მიუწვდომელია"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ამჟამად მიუწვდომელია."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> მიუწვდომელია"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ამჟამად ამ აპზე თქვენი <xliff:g id="DEVICE">%1$s</xliff:g>-დან წვდომა შეუძლებელია. ცადეთ Android TV მოწყობილობიდან."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ამჟამად ამ აპზე თქვენი <xliff:g id="DEVICE">%1$s</xliff:g>-დან წვდომა შეუძლებელია. ცადეთ ტაბლეტიდან."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ამჟამად ამ აპზე თქვენი <xliff:g id="DEVICE">%1$s</xliff:g>-დან წვდომა შეუძლებელია. ცადეთ ტელეფონიდან."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ეს აპი Android-ის ძველი ვერსიისთვის შეიქმნა და შესაძლოა სათანადოდ არ მუშაობდეს. გადაამოწმეთ განახლებები ან დაუკავშირდით დეველოპერს."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"განახლების შემოწმება"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"თქვენ ახალი შეტყობინებები გაქვთ"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"დეინსტალაცია"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"მაინც გახსნა"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"აღმოჩენილია საზიანო აპი"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"სისტემის ჟურნალში წვდომის მოთხოვნა"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"მხოლოდ ამ ერთხელ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"არ დაიშვას"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ითხოვს სისტემის ჟურნალებს ფუნქციური გამართვისთვის. ეს ჟურნალები შეიძლება შეიცავდეს ინფორმაციას, რომელიც დაწერილია თქვენს მოწყობილობაზე არსებულ აპებსა და სერვისებზე."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"აღარ გამოჩნდეს"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>-ს სურს, გაჩვენოთ <xliff:g id="APP_2">%2$s</xliff:g>-ის ფრაგმენტები"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"რედაქტირება"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ზარების და შეტყობინებების მიღებისას ვიბრაცია ჩაირთვება"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ელკვების დიალოგი"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ჩაკეტილი ეკრანი"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ეკრანის ანაბეჭდი"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ყურსაცვამის წამოგება"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"მისაწვდომობის ეკრანული მალსახმობი"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"მისაწვდომობის ეკრანული მალსახმობის ამომრჩევი"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"მისაწვდომობის მალსახმობი"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"შეტყობინებების ფარდის დახურვა"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ზევით"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ქვევით"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad მარცხნივ"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad მარჯვნივ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ცენტრი"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის სუბტიტრების ზოლი."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> მოთავსდა კალათაში „შეზღუდული“"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"შეეხეთ ჩასართავად"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"სამსახურის აპები არ არის"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"პირადი აპები არ არის"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"გსურთ <xliff:g id="APP">%s</xliff:g>-ის გახსნა თქვენს პირად პროფილში?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"გსურთ <xliff:g id="APP">%s</xliff:g>-ის გახსნა თქვენს სამსახურის პროფილში?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"პირადი ბრაუზერის გამოყენება"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"სამსახურის ბრაუზერის გამოყენება"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ქსელის განბლოკვის PIN-კოდი"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> გაშვებულია ფონურ რეჟიმში და იყენებს ბატარეას. შეეხეთ გადასახედად."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ფონურ რეჟიმში დიდი ხანია გაშვებულია. შეეხეთ გადასახედად."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"აქტიური აპების შემოწმება"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index ced90de..439060f 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Жалғастыру үшін экран құлпын енгізіңіз."</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Саусақ ізі жартылай анықталды."</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Саусақ ізін өңдеу мүмкін емес. Әрекетті қайталаңыз."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Датчикті тазалаңыз."</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Сәл ұзағырақ ұстаңыз."</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Саусағыңызды тым баяу қозғалттыңыз. Әрекетті қайталап көріңіз."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Басқа саусақ ізін байқап көріңіз."</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Тым жарық."</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Саусағыңыздың қалпын аздап өзгертіп тұрыңыз."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Саусақ ізі аутентификацияланды"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Бет танылды"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Бет танылды, \"Растау\" түймесін басыңыз"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Өткізіп жіберу"</string>
<string name="no_matches" msgid="6472699895759164599">"Сәйкес табылмады"</string>
<string name="find_on_page" msgid="5400537367077438198">"Беттен табу"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# матч}other{#/{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Дайын"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Ортақ жад тазартылуда…"</string>
<string name="share" msgid="4157615043345227321">"Бөлісу"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Қосу"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Қолданба қолжетімді емес"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> қазір қолжетімді емес."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> қолжетімсіз"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Қазір бұған <xliff:g id="DEVICE">%1$s</xliff:g> құрылғысынан кіру мүмкін емес. Оның орнына Android TV құрылғысын пайдаланып көріңіз."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Қазір бұған <xliff:g id="DEVICE">%1$s</xliff:g> құрылғысынан кіру мүмкін емес. Оның орнына планшетті пайдаланып көріңіз."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Қазір бұған <xliff:g id="DEVICE">%1$s</xliff:g> құрылғысынан кіру мүмкін емес. Оның орнына телефонды пайдаланып көріңіз."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Қолданба Android жүйесінің ескі нұсқасына арналған және дұрыс жұмыс істемеуі мүмкін. Жаңартылған нұсқаны тексеріңіз немесе әзірлеушіге хабарласыңыз."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Жаңарту бар-жоғын тексеру"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Сізде жаңа хабарлар бар"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ЖОЮ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"БӘРІБІР АШУ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Зиянды қолданба анықталды"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Жүйе журналын пайдалану рұқсатын сұрау"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Тек осы жолы"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Рұқсат бермеу"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> қолданбасы функционалдық түзету үшін жүйе журналдарын сұрайды. Бұл журналдарда құрылғыңыздағы қолданбалар мен қызметтер енгізген ақпарат қамтылуы мүмкін."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Қайта көрсетілмесін"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> қолданбасы <xliff:g id="APP_2">%2$s</xliff:g> қолданбасының үзінділерін көрсеткісі келеді"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Өзгерту"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Қоңыраулар мен хабарландырулардың вибрациясы болады"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Қуат диалогтік терезесі"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Құлып экраны"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Гарнитура ілгіші"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Экрандағы арнайы мүмкіндіктерді жылдам қосу"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Экрандағы арнайы мүмкіндіктерді жылдам қосу әрекетін таңдау"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Арнайы мүмкіндіктерді жылдам қосу"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Хабарландыру тақтасын жабу"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Жоғарғы Dpad түймесі"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Төменгі Dpad түймесі"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Сол жақ Dpad түймесі"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Оң жақ Dpad түймесі"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Ортаңғы Dpad түймесі"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының жазу жолағы."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ШЕКТЕЛГЕН себетке салынды."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Қосу үшін түртіңіз"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жұмыс қолданбалары жоқ."</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке қолданбалар жоқ."</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> қолданбасын жеке профиліңізде ашу керек пе?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> қолданбасын жұмыс профиліңізде ашу керек пе?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Жеке браузерді пайдалану"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Жұмыс браузерін пайдалану"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM желісінің құлпын ашатын PIN коды"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> қолданбасы фондық режимде жұмыс істеуде және батарея жұмсауда. Көру үшін түртіңіз."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> қолданбасы ұзақ уақыт бойы фондық режимде жұмыс істеуде. Көру үшін түртіңіз."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Белсенді қолданбаларды тексеру"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 0497b4e..49f2255 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"បញ្ចូលការចាក់សោអេក្រង់របស់អ្នក ដើម្បីបន្ត"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"បានសម្គាល់ស្នាមម្រាមដៃដោយផ្នែក"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"មិនអាចដំណើរការស្នាមម្រាមដៃបានទេ។ សូមព្យាយាមម្តងទៀត។"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"សម្អាតឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ដាក់ឱ្យយូរជាងនេះបន្តិច"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ចលនាម្រាមដៃយឺតពេកហើយ។ សូមព្យាយាមម្តងទៀត។"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"សាកល្បងប្រើស្នាមម្រាមដៃផ្សេងទៀត"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ភ្លឺពេក"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ប្ដូរទីតាំងម្រាមដៃរបស់អ្នកតិចៗគ្រប់ពេល"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"បានផ្ទៀងផ្ទាត់ស្នាមម្រាមដៃ"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"បានផ្ទៀងផ្ទាត់មុខ"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"បានផ្ទៀងផ្ទាត់មុខ សូមចុចបញ្ជាក់"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"រំលង"</string>
<string name="no_matches" msgid="6472699895759164599">"គ្មានការផ្គូផ្គង"</string>
<string name="find_on_page" msgid="5400537367077438198">"រកក្នុងទំព័រ"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ដូចគ្នា}other{# នៃ {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"រួចរាល់"</string>
<string name="progress_erasing" msgid="6891435992721028004">"កំពុងលុបទំហំផ្ទុករួម…"</string>
<string name="share" msgid="4157615043345227321">"ចែករំលែក"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"បើក"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"មិនអាចប្រើកម្មវិធីនេះបានទេ"</string>
<string name="app_blocked_message" msgid="542972921087873023">"មិនអាចប្រើ <xliff:g id="APP_NAME">%1$s</xliff:g> នៅពេលនេះបានទេ។"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"មិនអាចប្រើ <xliff:g id="ACTIVITY">%1$s</xliff:g> បានទេ"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"មិនអាចប្រើកម្មវិធីនេះនៅលើ <xliff:g id="DEVICE">%1$s</xliff:g> របស់អ្នកនៅពេលនេះបានទេ។ សូមសាកល្បងប្រើនៅលើឧបករណ៍ Android TV របស់អ្នកជំនួសវិញ។"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"មិនអាចប្រើកម្មវិធីនេះនៅលើ <xliff:g id="DEVICE">%1$s</xliff:g> របស់អ្នកនៅពេលនេះបានទេ។ សូមសាកល្បងប្រើនៅលើថេប្លេតរបស់អ្នកជំនួសវិញ។"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"មិនអាចប្រើកម្មវិធីនេះនៅលើ <xliff:g id="DEVICE">%1$s</xliff:g> របស់អ្នកនៅពេលនេះបានទេ។ សូមសាកល្បងប្រើនៅលើទូរសព្ទរបស់អ្នកជំនួសវិញ។"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"កម្មវិធីនេះត្រូវបានបង្កើតឡើងសម្រាប់កំណែប្រព័ន្ធប្រតិបត្តិការ Android ចាស់ ហើយវាអាចដំណើរការខុសប្រក្រតី។ សូមសាកល្បងពិនិត្យមើលកំណែថ្មី ឬទាក់ទងទៅអ្នកអភិវឌ្ឍន៍។"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"រកមើលកំណែថ្មី"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"អ្នកមានសារថ្មី"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"លុប"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"មិនអីទេ បើកចុះ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"បានរកឃើញកម្មវិធីដែលបង្កគ្រោះថ្នាក់"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"សំណើចូលប្រើកំណត់ហេតុប្រព័ន្ធ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"តែពេលនេះប៉ុណ្ណោះ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"មិនអនុញ្ញាត"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ស្នើសុំកំណត់ហេតុប្រព័ន្ធសម្រាប់ជួសជុលមុខងារ។ កំណត់ហេតុទាំងនេះប្រហែលជាមានព័ត៌មានដែលកម្មវិធី និងសេវាកម្មនៅលើឧបករណ៍របស់អ្នកបានសរសេរ។"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"កុំបង្ហាញម្ដងទៀត"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ចង់បង្ហាញស្ថិតិប្រើប្រាស់របស់ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"កែសម្រួល"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ការហៅទូរសព្ទ និងការជូនដំណឹងនឹងញ័រ"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ប្រអប់ថាមពល"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"អេក្រង់ចាក់សោ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"រូបថតអេក្រង់"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ទំពក់កាស"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ផ្លូវកាត់ភាពងាយស្រួលនៅលើអេក្រង់"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ម៉ឺនុយជ្រើសរើសផ្លូវកាត់ភាពងាយស្រួលនៅលើអេក្រង់"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ផ្លូវកាត់ភាពងាយស្រួល"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ច្រានចោលផ្ទាំងជូនដំណឹង"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ឡើងលើ"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ចុះក្រោម"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ឆ្វេង"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ស្ដាំ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad កណ្ដាល"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"របារពណ៌នាអំពី <xliff:g id="APP_NAME">%1$s</xliff:g>។"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ត្រូវបានដាក់ទៅក្នុងធុងដែលបានដាក់កំហិត"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>៖"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ចុចដើម្បីបើក"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"គ្មានកម្មវិធីការងារទេ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"គ្មានកម្មវិធីផ្ទាល់ខ្លួនទេ"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"បើក <xliff:g id="APP">%s</xliff:g> នៅក្នុងកម្រងព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកឬ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"បើក <xliff:g id="APP">%s</xliff:g> នៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នកឬ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ប្រើកម្មវិធីរុករកតាមអ៊ីនធឺណិតផ្ទាល់ខ្លួន"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ប្រើកម្មវិធីរុករកតាមអ៊ីនធឺណិតសម្រាប់ការងារ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"កូដ PIN ដោះសោបណ្ដាញស៊ីម"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការនៅផ្ទៃខាងក្រោយ និងធ្វើឱ្យអស់ថ្មលឿន។ សូមចុច ដើម្បីពិនិត្យមើល។"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការនៅផ្ទៃខាងក្រោយអស់រយៈពេលយូរហើយ។ សូមចុច ដើម្បីពិនិត្យមើល។"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ពិនិត្យមើលកម្មវិធីសកម្ម"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 659d885..b73b96f 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ಫೈಲ್ಗಳು ಮತ್ತು ಡಾಕ್ಯುಮೆಂಟ್ಗಳು"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಫೈಲ್ಗಳು ಮತ್ತು ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ಸಂಗೀತ ಮತ್ತು ಇತರ ಆಡಿಯೋ"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಡಿಯೊ ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ಮುಂದುವರಿಯಲು ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ನಮೂದಿಸಿ"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ಭಾಗಶಃ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಪತ್ತೆಯಾಗಿದೆ"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ವಚ್ಚಗೊಳಿಸಿ"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಸಮಯ ಒತ್ತಿ ಹಿಡಿಯಿರಿ"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಸ್ವಚ್ಛಗೊಳಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"ಸೆನ್ಸರ್ ಸ್ವಚ್ಛಗೊಳಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"ಸೆನ್ಸರ್ ಮೇಲೆ ದೃಢವಾಗಿ ಒತ್ತಿರಿ"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ಬೆರಳನ್ನು ತುಂಬಾ ನಿಧಾನವಾಗಿ ಸರಿಸಲಾಗಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ಮತ್ತೊಂದು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ತುಂಬಾ ಪ್ರಕಾಶಮಾನವಾಗಿದೆ"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ಪ್ರತಿ ಬಾರಿಯೂ ನಿಮ್ಮ ಬೆರಳಿನ ಸ್ಥಾನವನ್ನು ಸ್ವಲ್ಪ ಮಟ್ಟಿಗೆ ಬದಲಾಯಿಸಿ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಅನ್ನು ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"ಸೆನ್ಸರ್ ಮೇಲೆ ದೃಢವಾಗಿ ಒತ್ತಿರಿ"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಪ್ರಮಾಣೀಕರಣ ಮಾಡಲಾಗಿದೆ"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ, ದೃಢೀಕರಣವನ್ನು ಒತ್ತಿ"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ಸ್ಕಿಪ್"</string>
<string name="no_matches" msgid="6472699895759164599">"ಯಾವುದೇ ಹೊಂದಿಕೆಗಳಿಲ್ಲ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ಪುಟದಲ್ಲಿ ಹುಡುಕಿ"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ಹೊಂದಾಣಿಕೆ{total} ರಲ್ಲಿ }one{#{total} ರಲ್ಲಿ }other{#}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"ಮುಗಿದಿದೆ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ಹಂಚಲಾದ ಸಂಗ್ರಹಣೆಯನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="share" msgid="4157615043345227321">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ಆನ್ ಮಾಡಿ"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ಆ್ಯಪ್ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಇದೀಗ ಲಭ್ಯವಿಲ್ಲ."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ಈ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ <xliff:g id="DEVICE">%1$s</xliff:g> ನಲ್ಲಿ ಇದನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅದರ ಬದಲು ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ಈ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ <xliff:g id="DEVICE">%1$s</xliff:g> ನಲ್ಲಿ ಇದನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅದರ ಬದಲು ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ಈ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ <xliff:g id="DEVICE">%1$s</xliff:g> ನಲ್ಲಿ ಇದನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅದರ ಬದಲು ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು Android ನ ಹಳೆಯ ಆವೃತ್ತಿಗೆ ರಚಿಸಲಾಗಿದೆ ಮತ್ತು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿರಬಹುದು. ಅಪ್ಡೇಟ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ಡೆವಲಪರ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ಅಪ್ಡೇಟ್ಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ಹೇಗಿದ್ದರೂ ತೆರೆಯಿರಿ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"ಸಿಸ್ಟಂ ಲಾಗ್ ಪ್ರವೇಶ ವಿನಂತಿ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"ಈ ಬಾರಿ ಮಾತ್ರ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"ಅನುಮತಿಸಬೇಡಿ"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"ಫಂಕ್ಷನಲ್ ಡೀಬಗ್ ಮಾಡುವಿಕೆಗಾಗಿ <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ಸಿಸ್ಟಂ ಲಾಗ್ಗಳನ್ನು ವಿನಂತಿಸುತ್ತದೆ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿನ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಬರೆದಿರುವ ಮಾಹಿತಿಯನ್ನು ಈ ಲಾಗ್ಗಳು ಒಳಗೊಂಡಿರಬಹುದು."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸಬೇಡಿ"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್ಗಳನ್ನು <xliff:g id="APP_0">%1$s</xliff:g> ತೋರಿಸಲು ಬಯಸಿದೆ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ಎಡಿಟ್"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ವೈಬ್ರೇಟ್ ಆಗುತ್ತವೆ"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ಆನ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ಯಾವುದೇ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ <xliff:g id="APP">%s</xliff:g> ಅನ್ನು ತೆರೆಯಬೇಕೆ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ <xliff:g id="APP">%s</xliff:g> ಅನ್ನು ತೆರೆಯಬೇಕೆ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ವೈಯಕ್ತಿಕ ಬ್ರೌಸರ್ ಬಳಸಿ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ಉದ್ಯೋಗ ಬ್ರೌಸರ್ ಬಳಸಿ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ನೆಟ್ವರ್ಕ್ ಅನ್ಲಾಕ್ ಮಾಡುವ ಪಿನ್"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ ಹಾಗೂ ಬ್ಯಾಟರಿಯನ್ನು ಹೆಚ್ಚು ಬಳಸುತ್ತಿದೆ. ಪರಿಶೀಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ಬಹಳ ಸಮಯದಿಂದ ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ. ಪರಿಶೀಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ಸಕ್ರಿಯ ಆ್ಯಪ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index ff4d5d6..a7f8cb4 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"계속하려면 화면 잠금용 사용자 인증 정보를 입력하세요"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"지문의 일부만 감지됨"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"지문을 인식할 수 없습니다. 다시 시도해 주세요."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"센서 닦기"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"조금 더 길게 터치하세요."</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"손가락을 너무 느리게 움직였습니다. 다시 시도해 주세요."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"다른 지문으로 시도"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"너무 밝음"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"지문을 등록할 때마다 손가락을 조금씩 이동하세요."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"지문이 인증됨"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"얼굴이 인증되었습니다"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"얼굴이 인증되었습니다. 확인을 누르세요"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"건너뛰기"</string>
<string name="no_matches" msgid="6472699895759164599">"검색결과 없음"</string>
<string name="find_on_page" msgid="5400537367077438198">"페이지에서 찾기"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{일치하는 항목 #개}other{#/{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"완료"</string>
<string name="progress_erasing" msgid="6891435992721028004">"공유 저장공간 지우는 중…"</string>
<string name="share" msgid="4157615043345227321">"공유"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"사용 설정"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"앱을 사용할 수 없습니다"</string>
<string name="app_blocked_message" msgid="542972921087873023">"현재 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 사용할 수 없습니다."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> 사용할 수 없음"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"현재 <xliff:g id="DEVICE">%1$s</xliff:g>에서 액세스할 수 없습니다. 대신 Android TV 기기에서 시도해 보세요."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"현재 <xliff:g id="DEVICE">%1$s</xliff:g>에서 액세스할 수 없습니다. 대신 태블릿에서 시도해 보세요."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"현재 <xliff:g id="DEVICE">%1$s</xliff:g>에서 액세스할 수 없습니다. 대신 스마트폰에서 시도해 보세요."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"이 앱은 Android 이전 버전에 맞게 개발되었기 때문에 제대로 작동하지 않을 수 있습니다. 업데이트를 확인하거나 개발자에게 문의하세요."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"업데이트 확인"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"새 메시지 있음"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"제거"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"열기"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"유해한 앱 감지됨"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"시스템 로그 액세스 요청"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"이번만 허용"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"허용 안함"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> 앱에서 기능 디버깅을 위해 시스템 로그를 요청합니다. 이 로그에는 기기의 앱과 서비스가 작성한 정보가 포함될 수 있습니다."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"다시 표시 안함"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>에서 <xliff:g id="APP_2">%2$s</xliff:g>의 슬라이스를 표시하려고 합니다"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"수정"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"전화 및 알림이 오면 진동이 사용됩니다."</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"전원 대화상자"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"잠금 화면"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"스크린샷"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"헤드셋 후크"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"화면상의 접근성 바로가기"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"화면상의 접근성 바로가기 선택 도구"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"접근성 단축키"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"알림 창 닫기"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"방향 패드 위쪽"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"방향 패드 아래"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"방향 패드 왼쪽"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"방향 패드 오른쪽"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"방향 패드 가운데"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 자막 표시줄입니다."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 항목이 RESTRICTED 버킷으로 이동함"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"탭하여 사용 설정"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"직장 앱 없음"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"개인 앱 없음"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"개인 프로필에서 <xliff:g id="APP">%s</xliff:g> 앱을 여시겠습니까?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"직장 프로필에서 <xliff:g id="APP">%s</xliff:g> 앱을 여시겠습니까?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"개인 브라우저 사용"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"직장 브라우저 사용"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 네트워크 잠금 해제 PIN"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> 앱이 백그라운드에서 실행 중이며 배터리를 소모하고 있습니다. 확인하려면 탭하세요."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> 앱이 백그라운드에서 오랫동안 실행 중입니다. 확인하려면 탭하세요."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"활성 상태의 앱 확인"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 7e25ce4..577626d 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Улантуу үчүн экрандын кулпусун киргизиңиз"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Манжа изи жарым-жартылай аныкталды"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Манжа изи иштелбей койду. Кайталап көрүңүз."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Сенсорду тазалаңыз"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Дагы бир аз кармап туруңуз"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Манжа өтө жай жылды. Кайталап көрүңүз."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Башка манжа изин байкап көрүңүз"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Өтө жарык"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Манжаңыздын абалын ар жолкусунда бир аз өзгөртүп туруңуз"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Манжа изи текшерилди"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Жүздүн аныктыгы текшерилди"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Жүздүн аныктыгы текшерилди, эми \"Ырастоону\" басыңыз"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Өткөрүп жиберүү"</string>
<string name="no_matches" msgid="6472699895759164599">"Дал келүүлөр жок"</string>
<string name="find_on_page" msgid="5400537367077438198">"Барактан табуу"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# дал келүү{total} ичинен }other{# }} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Даяр"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Жалпы сактагыч тазаланууда…"</string>
<string name="share" msgid="4157615043345227321">"Бөлүшүү"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Күйгүзүү"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Колдонмо учурда жеткиликсиз"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> учурда жеткиликсиз"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> жеткиликсиз"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Учурда буга <xliff:g id="DEVICE">%1$s</xliff:g> түзмөгүңүздөн кире албайсыз. Android TV түзмөгүңүздөн аракет кылып көрүңүз."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Учурда буга <xliff:g id="DEVICE">%1$s</xliff:g> түзмөгүңүздөн кире албайсыз. Планшетиңизден кирип көрүңүз."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Учурда буга <xliff:g id="DEVICE">%1$s</xliff:g> түзмөгүңүздөн кире албайсыз. Анын ордуна телефондон кирип көрүңүз."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Бул колдонмо Android\'дин эски версиясы үчүн иштеп чыгарылган, андыктан туура эмес иштеши мүмкүн. Жаңыртууларды издеп көрүңүз же иштеп чыгуучуга кайрылыңыз."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Жаңыртууларды текшерүү"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Сизге жаңы билдирүүлөр келди"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ЧЫГАРЫП САЛУУ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"БААРЫ БИР АЧЫЛСЫН"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Зыянкеч колдонмо аныкталды"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Тутум таржымалына кирүүгө уруксат суралды"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Ушул жолу гана"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Уруксат берилбесин"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> функционалдык мүчүлүштүктөрдү оңдоо үчүн тутум таржымалдарын сурап жатат. Бул таржымалдарда түзмөгүңүздөгү колдонмолор жана кызматтар жазган маалымат камтылышы мүмкүн."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Экинчи көрүнбөсүн"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> колдонмосу <xliff:g id="APP_2">%2$s</xliff:g> үлгүлөрүн көрсөткөнү жатат"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Түзөтүү"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Чалуулар менен билдирмелер дирилдөө режиминде иштейт"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Кубат диалогу"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Кулпуланган экран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Гарнитуранын илмеги"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ыкчам иштетүү"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ыкчам иштетүү менюсу"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Ыкчам иштетүү"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Билдирмелер тактасын жабуу"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad\'дын жогорку баскычы"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad\'дын ылдыйкы баскычы"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad\'дын сол баскычы"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad\'дын оң баскычы"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad\'дын ортоңку баскычы"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунун маалымат тилкеси."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Күйгүзүү үчүн таптап коюңуз"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жумуш колдонмолору жок"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке колдонмолор жок"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> колдонмосу жеке профилде ачылсынбы?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> колдонмосу жумуш профилинде ачылсынбы?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Жеке серепчини колдонуу"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Жумуш серепчисин колдонуу"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM карта тармагынын кулпусун ачуучу PIN код"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> фондо иштеп, батареяны отургузуп жатат. Көрүү үчүн таптап коюңуз."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> колдонмосу көп убакыттан бери фондо иштеп жатат. Көрүү үчүн таптап коюңуз."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Жигердүү колдонмолорду карап чыгуу"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index e8ac194..090bde9 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ເຂົ້າຫາປະຕິທິນຂອງທ່ານ"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"ສົ່ງ ແລະເບິ່ງຂໍ້ຄວາມ SMS"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ໄຟລ໌ ແລະ ເອກະສານ"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"ເຂົ້າເຖິງໄຟລ໌ ແລະ ເອກະສານຢູ່ອຸປະກອນຂອງທ່ານ"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ເພງ ແລະ ສຽງອື່ນໆ"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ເຂົ້າເຖິງໄຟລ໌ສຽງຢູ່ອຸປະກອນຂອງທ່ານ"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ຮູບພາບ ແລະ ວິດີໂອ"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ໃສ່ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອສືບຕໍ່"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ກວດພົບລາຍນິ້ວມືບາງສ່ວນ"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ບໍ່ສາມາດດຳເນີນການລາຍນີ້ວມືໄດ້. ກະລຸນາລອງໃໝ່ອີກ."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ກະລຸນາອະນາໄມເຊັນເຊີ"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ກົດໄວ້ດົນຂຶ້ນອີກໜ້ອຍໜຶ່ງ"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"ໃຫ້ອະນາໄມເຊັນເຊີລາຍນິ້ວມືແລ້ວລອງໃໝ່"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"ໃຫ້ອະນາໄມເຊັນເຊີແລ້ວລອງໃໝ່"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"ກົດຢູ່ເຊັນເຊີໃຫ້ແໜ້ນ"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ຍ້າຍນີ້ວມືໄປຊ້າເກີນໄປ. ກະລຸນາລອງໃໝ່ອີກ."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ລອງໃຊ້ລາຍນິ້ວມືອື່ນ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ແຈ້ງເກີນໄປ"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ປ່ຽນຕຳແໜ່ງຂອງນິ້ວມືຂອງທ່ານເລັກນ້ອຍໃນແຕ່ລະເທື່ອ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"ບໍ່ຮູ້ຈັກລາຍນິ້ວມື"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"ກົດຢູ່ເຊັນເຊີໃຫ້ແໜ້ນ"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ພິສູດຢືນຢັນລາຍນິ້ວມືແລ້ວ"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ພິສູດຢືນຢັນໃບໜ້າແລ້ວ"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ພິສູດຢືນຢັນໃບໜ້າແລ້ວ, ກະລຸນາກົດຢືນຢັນ"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ຂ້າມ"</string>
<string name="no_matches" msgid="6472699895759164599">"ບໍ່ພົບຜົນການຊອກຫາ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ຊອກໃນໜ້າ"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ຂໍ້ມູນທີ່ກົງກັນ}other{# ຈາກທັງໝົດ {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"ແລ້ວໆ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ກຳລັງລຶບບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນ…"</string>
<string name="share" msgid="4157615043345227321">"ແບ່ງປັນ"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ເປີດ"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ແອັບບໍ່ສາມາດໃຊ້ໄດ້"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ສາມາດໃຊ້ໄດ້ໃນຕອນນີ້."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"ບໍ່ສາມາດໃຊ້ <xliff:g id="ACTIVITY">%1$s</xliff:g> ໄດ້"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ບໍ່ສາມາດເຂົ້າເຖິງແອັບນີ້ໄດ້ຢູ່ <xliff:g id="DEVICE">%1$s</xliff:g> ຂອງທ່ານໃນຕອນນີ້. ກະລຸນາລອງໃຊ້ຢູ່ອຸປະກອນ Android TV ຂອງທ່ານແທນ."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ບໍ່ສາມາດເຂົ້າເຖິງແອັບນີ້ໄດ້ຢູ່ <xliff:g id="DEVICE">%1$s</xliff:g> ຂອງທ່ານໃນຕອນນີ້. ກະລຸນາລອງຢູ່ແທັບເລັດຂອງທ່ານແທນ."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ບໍ່ສາມາດເຂົ້າເຖິງແອັບນີ້ໄດ້ຢູ່ <xliff:g id="DEVICE">%1$s</xliff:g> ຂອງທ່ານໃນຕອນນີ້. ກະລຸນາລອງຢູ່ໂທລະສັບຂອງທ່ານແທນ."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ແອັບນີ້ຖືກສ້າງຂຶ້ນສຳລັບ Android ເວີຊັນທີ່ເກົ່າກວ່າ ແລະ ອາດເຮັດວຽກໄດ້ບໍ່ປົກກະຕິ. ໃຫ້ລອງກວດສອບເບິ່ງອັບເດດ ຫຼື ຕິດຕໍ່ຜູ້ພັດທະນາ."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ກວດເບິ່ງອັບເດດ"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"ທ່ານມີຂໍ້ຄວາມໃໝ່"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ຖອນການຕິດຕັ້ງ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ຢືນຢັນການເປີດ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ກວດສອບແອັບທີ່ເປັນອັນຕະລາຍ"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"ຄຳຮ້ອງຂໍການເຂົ້າເຖິງບັນທຶກລະບົບ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"ສະເພາະເທື່ອນີ້"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"ບໍ່ອະນຸຍາດ"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ຮ້ອງຂໍບັນທຶກລະບົບສຳລັບການດີບັກການເຮັດວຽກ. ບັນທຶກເຫຼົ່ານີ້ອາດມີເນື້ອຫາທີ່ແອັບ ແລະ ບໍລິການຢູ່ອຸປະກອນຂອງທ່ານໄດ້ຂຽນໄວ້."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"ບໍ່ຕ້ອງສະແດງອີກ"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ຕ້ອງການສະແດງ <xliff:g id="APP_2">%2$s</xliff:g> ສະໄລ້"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ແກ້ໄຂ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະສັ່ນ"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ກ່ອງໂຕ້ຕອບການເປີດປິດ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ໜ້າຈໍລັອກ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ຮູບໜ້າຈໍ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ຄຳສັ່ງ Hook ຂອງຊຸດຫູຟັງ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ທາງລັດການຊ່ວຍເຂົ້າເຖິງຢູ່ໜ້າຈໍ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ຕົວເລືອກທາງລັດການຊ່ວຍເຂົ້າເຖິງຢູ່ໜ້າຈໍ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ທາງລັດການຊ່ວຍເຂົ້າເຖິງ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ປິດເງົາການແຈ້ງເຕືອນໄວ້"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ຂຶ້ນ"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ລົງ"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ຊ້າຍ"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ຂວາ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ກາງ"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"ແຖບຄຳບັນຍາຍຂອງ <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ຖືກວາງໄວ້ໃນກະຕ່າ \"ຈຳກັດ\" ແລ້ວ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ແຕະເພື່ອເປີດໃຊ້"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ບໍ່ມີແອັບບ່ອນເຮັດວຽກ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ບໍ່ມີແອັບສ່ວນຕົວ"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"ເປີດ <xliff:g id="APP">%s</xliff:g> ໃນໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານບໍ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"ເປີດ <xliff:g id="APP">%s</xliff:g> ໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານບໍ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ໃຊ້ໂປຣແກຣມທ່ອງເວັບສ່ວນຕົວ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ໃຊ້ໂປຣແກຣມທ່ອງເວັບບ່ອນເຮັດວຽກ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ປົດລັອກເຄືອຂ່າຍຊິມ"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກໃນພື້ນຫຼັງ ແລະ ໃຊ້ແບັດເຕີຣີຫຼາຍ. ແຕະເພື່ອກວດສອບ."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກໃນພື້ນຫຼັງເປັນເວລາດົນແລ້ວ. ແຕະເພື່ອກວດສອບ."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ກວດສອບແອັບທີ່ເຄື່ອນໄຫວ"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 77e61a5..f89c429 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -306,10 +306,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"pasiekti kalendorių"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"siųsti ir peržiūrėti SMS pranešimus"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Failai ir dokumentai"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"pasiekti failus ir dokumentus jūsų įrenginyje"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzika ir kiti garso įrašai"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pasiekti garso failus įrenginyje"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Nuotraukos ir vaizdo įrašai"</string>
@@ -590,8 +588,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Jei norite tęsti, įveskite ekrano užraktą"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Aptiktas dalinis kontrolinis kodas"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nepavyko apdoroti piršto antspaudo. Bandykite dar kartą."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Nuvalykite jutiklį"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Palaukite šiek tiek ilgiau"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Nuvalykite kontrolinio kodo jutiklį ir bandykite dar kartą"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Nuvalykite jutiklį ir bandykite dar kartą"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Tvirtai paspauskite jutiklį"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Per lėtai judinate pirštą. Bandykite dar kartą."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Pabandykite kitą kontrolinį kodą"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Per šviesu"</string>
@@ -599,6 +598,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Kaskart šiek tiek pakeiskite piršto poziciją"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Kontrolinis kodas neatpažintas"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Tvirtai paspauskite jutiklį"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Piršto antspaudas autentifikuotas"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Veidas autentifikuotas"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Veidas autentifikuotas, paspauskite patvirtinimo mygtuką"</string>
@@ -1502,7 +1503,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Praleisti"</string>
<string name="no_matches" msgid="6472699895759164599">"Nėra atitikčių"</string>
<string name="find_on_page" msgid="5400537367077438198">"Ieškoti puslapyje"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# atitiktis}one{# iš {total}}few{# iš {total}}many{# iš {total}}other{# iš {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Atlikta"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Ištrinama bendrinama saugykla…"</string>
<string name="share" msgid="4157615043345227321">"Bendrinti"</string>
@@ -1930,6 +1932,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Įjungti"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Programa nepasiekiama."</string>
<string name="app_blocked_message" msgid="542972921087873023">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ šiuo metu nepasiekiama."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"„<xliff:g id="ACTIVITY">%1$s</xliff:g>“ nepasiekiama"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Šįkart nepavyksta pasiekti programos iš jūsų „<xliff:g id="DEVICE">%1$s</xliff:g>“. Pabandykite naudoti „Android TV“ įrenginį."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Šįkart nepavyksta pasiekti programos iš jūsų „<xliff:g id="DEVICE">%1$s</xliff:g>“. Pabandykite naudoti planšetinį kompiuterį."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Šįkart nepavyksta pasiekti programos iš jūsų „<xliff:g id="DEVICE">%1$s</xliff:g>“. Pabandykite naudoti telefoną."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ši programa sukurta naudoti senesnės versijos sistemoje „Android“ ir gali tinkamai neveikti. Pabandykite patikrinti, ar yra naujinių, arba susisiekite su kūrėju."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Tikrinti, ar yra naujinių"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Turite naujų pranešimų"</string>
@@ -2019,16 +2025,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"PAŠALINTI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VIS TIEK ATIDARYTI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aptikta žalinga programa"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Prieigos prie sistemos žurnalų užklausa"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Tik šį kartą"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Neleisti"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"„<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>“ prašo leisti pasiekti sistemos žurnalus funkcinio derinimo tikslais. Šiuose žurnaluose gali būti informacijos, kurią įrašė įrenginyje esančios programos ir paslaugos."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Daugiau neberodyti"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"„<xliff:g id="APP_0">%1$s</xliff:g>“ nori rodyti „<xliff:g id="APP_2">%2$s</xliff:g>“ fragmentus"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Redaguoti"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Skambučiai ir pranešimai vibruos"</string>
@@ -2091,22 +2092,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Maitinimo dialogo langas"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Užrakinimo ekranas"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrano kopija"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Pakabinti virtualiosios realybės įrenginį"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekrano pritaikomumo šaukinys"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekrano pritaikomumo šaukinių parinkiklis"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pritaikomumo šaukinys"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Atsisakyti pranešimų skydelio"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Valdymo pultas – aukštyn"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Valdymo pultas – žemyn"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Valdymo pultas – kairėn"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Valdymo pultas – dešinėn"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Valdymo pultas – centras"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ antraštės juosta."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"„<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>“ įkeltas į grupę APRIBOTA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2122,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Paliesti, norint įjungti"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nėra darbo programų"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nėra asmeninių programų"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Atidaryti „<xliff:g id="APP">%s</xliff:g>“ asmeniniame profilyje?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Atidaryti „<xliff:g id="APP">%s</xliff:g>“ darbo profilyje?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Naudoti asmeninę naršyklę"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Naudoti darbo naršyklę"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM tinklo operatoriaus pasirinkimo ribojimo panaikinimo PIN kodas"</string>
@@ -2265,4 +2258,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"„<xliff:g id="APP">%1$s</xliff:g>“ veikia fone ir eikvoja akumuliatoriaus energiją. Palieskite ir peržiūrėkite."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"„<xliff:g id="APP">%1$s</xliff:g>“ ilgą laiką veikia fone. Palieskite ir peržiūrėkite."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Peržiūrėkite aktyvias programas"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 166ec36..030144b 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -589,8 +589,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Lai turpinātu, ievadiet ekrāna bloķēšanas informāciju"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Tika konstatēts nepilnīgs pilna nospiedums"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nevarēja apstrādāt pirksta nospiedumu. Lūdzu, mēģiniet vēlreiz."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Notīriet sensoru"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Turiet pirkstu uz sensora nedaudz ilgāk."</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Pārāk lēna pirksta kustība. Lūdzu, mēģiniet vēlreiz."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Izmēģiniet citu pirksta nospiedumu"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Pārāk spilgts"</string>
@@ -598,6 +602,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Katru reizi mazliet mainiet pirksta pozīciju."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Pirksta nospiedums tika autentificēts."</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Seja autentificēta"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Seja ir autentificēta. Nospiediet pogu Apstiprināt."</string>
@@ -1501,7 +1509,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Izlaist"</string>
<string name="no_matches" msgid="6472699895759164599">"Nav atbilstību"</string>
<string name="find_on_page" msgid="5400537367077438198">"Atrast lapā"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# atbilstība}zero{#. no {total}}one{#. no {total}}other{#. no {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Gatavs"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Notiek koplietotās krātuves dzēšana…"</string>
<string name="share" msgid="4157615043345227321">"Kopīgot"</string>
@@ -1929,6 +1938,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Ieslēgt"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Lietotne nav pieejama"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pašlaik nav pieejama."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> nav pieejams"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Šajā ierīcē (<xliff:g id="DEVICE">%1$s</xliff:g>) pašlaik nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā Android TV ierīcē."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Šajā ierīcē (<xliff:g id="DEVICE">%1$s</xliff:g>) pašlaik nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā planšetdatorā."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Šajā ierīcē (<xliff:g id="DEVICE">%1$s</xliff:g>) pašlaik nevar piekļūt šai lietotnei. Mēģiniet tai piekļūt savā tālrunī."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Šī lietotne tika izstrādāta vecākai Android versijai un var nedarboties pareizi. Meklējiet atjauninājumus vai sazinieties ar izstrādātāju."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Meklēt atjauninājumu"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Jums ir jaunas īsziņas."</string>
@@ -2018,16 +2031,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ATINSTALĒT"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TIK UN TĀ ATVĒRT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Konstatēta kaitīga lietotne"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Pieprasījums piekļūt sistēmas žurnāliem"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Tikai šoreiz"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Neatļaut"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Lietotne <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> pieprasa sistēmas žurnālus funkciju atkļūdošanai. Šie žurnāli var ietvert informāciju, ko ir rakstījušas jūsu ierīces lietotnes un pakalpojumi."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Vairs nerādīt"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Lietotne <xliff:g id="APP_0">%1$s</xliff:g> vēlas rādīt lietotnes <xliff:g id="APP_2">%2$s</xliff:g> sadaļas"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Rediģēt"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Zvaniem un paziņojumiem tiks aktivizēta vibrācija."</string>
@@ -2090,22 +2098,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Barošanas dialoglodziņš"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloķēt ekrānu"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrānuzņēmums"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Uzkārt austiņas"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekrāna pieejamības saīsne"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekrāna pieejamības saīsnes atlasītājs"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pieejamības saīsne"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Nerādīt paziņojumu paneli"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Virzienu slēdzis — augšup"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Virzienu slēdzis — lejup"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Virzienu slēdzis — pa kreisi"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Virzienu slēdzis — pa labi"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Virzienu slēdzis — centrs"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> subtitru josla."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Pakotne “<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>” ir ievietota ierobežotā kopā."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2126,10 +2128,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Lai ieslēgtu, pieskarieties"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nav darba lietotņu"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nav personīgu lietotņu"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Vai atvērt lietotni <xliff:g id="APP">%s</xliff:g> jūsu personīgajā profilā?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Vai atvērt lietotni <xliff:g id="APP">%s</xliff:g> jūsu darba profilā?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Izmantot personīgo pārlūku"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Izmantot darba pārlūku"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM tīkla atbloķēšanas PIN"</string>
@@ -2264,4 +2264,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> darbojas fonā un patērē akumulatora enerģiju. Pieskarieties, lai to pārskatītu."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ilgi darbojas fonā. Pieskarieties, lai to pārskatītu."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Pārbaudiet aktīvās lietotnes"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 930e4ab..a67a522 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Внесете го заклучувањето на екранот за да продолжите"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Откриен е делумен отпечаток"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Отпечатокот не може да се обработи. Обидете се повторно."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Исчистете го сензорот"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Држете малку подолго"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Прстот се движеше премногу бавно. Обидете се повторно."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Пробајте со друг отпечаток"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Премногу светло"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Менувајте ја положбата на прстот по малку секој пат"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Отпечатокот е проверен"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Лицето е проверено"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Лицето е проверено, притиснете го копчето „Потврди“"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Прескокни"</string>
<string name="no_matches" msgid="6472699895759164599">"Нема совпаѓања"</string>
<string name="find_on_page" msgid="5400537367077438198">"Пронајди на страница"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# совпаѓање}one{# од {total}}other{# од {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Бришење споделена меморија…"</string>
<string name="share" msgid="4157615043345227321">"Сподели"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Вклучи"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Апликацијата не е достапна"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> не е достапна во моментов."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> е недостапна"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Ова не може да се отвори на <xliff:g id="DEVICE">%1$s</xliff:g> во моментов. Пробајте на вашиот Android TV како алтернатива."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Ова не може да се отвори на <xliff:g id="DEVICE">%1$s</xliff:g> во моментов. Пробајте на вашиот таблет како алтернатива."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Ова не може да се отвори на <xliff:g id="DEVICE">%1$s</xliff:g> во моментов. Пробајте на вашиот телефон како алтернатива."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Апликацијава е создадена за постара верзија на Android и може да не функционира правилно. Проверете за ажурирања или контактирајте со програмерот."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Проверка за ажурирање"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Имате нови пораки"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ДЕИНСТАЛИРАЈ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"СЕПАК ОТВОРИ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Откриена е штетна апликација"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Барање за пристап до системска евиденција"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Само овој пат"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Не дозволувај"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> бара системска евиденција за отстранување грешка на функција. Оваа евиденција може да содржи податоци запишани од апликациите и услугите на уредот."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Не прикажувај повторно"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> сака да прикажува делови од <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Измени"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Повиците и известувањата ќе вибрираат"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог за напојување"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заклучен екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Слика од екранот"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Елемент за привлекување на слушалките"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Кратенка за пристапност на екранот"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Избирач на кратенка за пристапност на екранот"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Кратенка за пристапност"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Отфрлете го панелот за известување"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Навигациско копче за нагоре"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Навигациско копче за надолу"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Навигациско копче за налево"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Навигациско копче за надесно"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Навигациско копче за средина"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Насловна лента на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е ставен во корпата ОГРАНИЧЕНИ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Допрете за да вклучите"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Нема работни апликации"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Нема лични апликации"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Да се отвори <xliff:g id="APP">%s</xliff:g> во личниот профил?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Да се отвори <xliff:g id="APP">%s</xliff:g> во работниот профил?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Користи личен прелистувач"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Користи работен прелистувач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN за отклучување на мрежата на SIM-картичката"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> се извршува во заднина и ја троши батеријата. Допрете за да прегледате."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> се извршува во заднина веќе долго време. Допрете за да прегледате."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверете ги активните апликации"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index c41cec4..ec027b9 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"നിങ്ങളുടെ കലണ്ടർ ആക്സസ്സ് ചെയ്യുക"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS സന്ദേശങ്ങൾ അയയ്ക്കുകയും കാണുകയും ചെയ്യുക"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ഫയലുകളും ഡോക്യുമെന്റുകളും"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഫയലുകളും ഡോക്യുമെന്റുകളും ആക്സസ് ചെയ്യുക"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"സംഗീതവും മറ്റ് ഓഡിയോയും"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഓഡിയോ ഫയലുകൾ ആക്സസ് ചെയ്യുക"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ഫോട്ടോകളും വീഡിയോകളും"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"തുടരാൻ നിങ്ങളുടെ സ്ക്രീൻ ലോക്ക് നൽകുക"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ഫിംഗർപ്രിന്റ് ഭാഗികമായി തിരിച്ചറിഞ്ഞു"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ഫിംഗർപ്രിന്റ് പ്രോസസ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"സെൻസർ വൃത്തിയാക്കുക"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"കുറച്ച് സമയം കൂടി അമർത്തിപ്പിടിക്കുക"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"ഫിംഗർപ്രിന്റ് സെൻസർ വൃത്തിയാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"സെൻസർ വൃത്തിയാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"സെൻസറിന് മുകളിൽ ശക്തിയായി അമർത്തുക"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"വിരൽ വളരെ പതുക്കെ നീക്കി. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"മറ്റൊരു ഫിംഗർപ്രിന്റ് ഉപയോഗിച്ച് നോക്കുക"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"തെളിച്ചം വളരെയധികമാണ്"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ഓരോ തവണയും നിങ്ങളുടെ വിരലിന്റെ സ്ഥാനം ചെറുതായി മാറ്റുക"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"ഫിംഗർപ്രിന്റ് തിരിച്ചറിഞ്ഞില്ല"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"സെൻസറിന് മുകളിൽ ശക്തിയായി അമർത്തുക"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ഫിംഗർപ്രിന്റ് പരിശോധിച്ചുറപ്പിച്ചു"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"മുഖം പരിശോധിച്ചുറപ്പിച്ചു"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"മുഖം പരിശോധിച്ചുറപ്പിച്ചു, സ്ഥിരീകരിക്കുക അമർത്തുക"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ഒഴിവാക്കുക"</string>
<string name="no_matches" msgid="6472699895759164599">"പൊരുത്തപ്പെടലുകൾ ഒന്നുമില്ല"</string>
<string name="find_on_page" msgid="5400537367077438198">"പേജിൽ കണ്ടെത്തുക"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# പൊരുത്തം}other{{total}-ൽ #-ാമത്തെ പൊരുത്തം}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"പൂർത്തിയായി"</string>
<string name="progress_erasing" msgid="6891435992721028004">"പങ്കിടുന്ന സ്റ്റോറേജ് മായ്ക്കുന്നു…"</string>
<string name="share" msgid="4157615043345227321">"പങ്കിടുക"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ഓണാക്കുക"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ആപ്പ് ലഭ്യമല്ല"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ഇപ്പോൾ ലഭ്യമല്ല."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ലഭ്യമല്ല"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ഇപ്പോൾ നിങ്ങളുടെ <xliff:g id="DEVICE">%1$s</xliff:g> ഉപകരണത്തിൽ ഇത് ആക്സസ് ചെയ്യാനാകില്ല. പകരം Android TV ഉപകരണത്തിൽ ശ്രമിച്ച് നോക്കൂ."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ഇപ്പോൾ നിങ്ങളുടെ <xliff:g id="DEVICE">%1$s</xliff:g> ഉപകരണത്തിൽ ഇത് ആക്സസ് ചെയ്യാനാകില്ല. പകരം നിങ്ങളുടെ ടാബ്ലെറ്റിൽ ശ്രമിച്ച് നോക്കൂ."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ഇപ്പോൾ നിങ്ങളുടെ <xliff:g id="DEVICE">%1$s</xliff:g> ഉപകരണത്തിൽ ഇത് ആക്സസ് ചെയ്യാനാകില്ല. പകരം നിങ്ങളുടെ ഫോണിൽ ശ്രമിച്ച് നോക്കൂ."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ഈ ആപ്പ് Android-ന്റെ പഴയ പതിപ്പിനായി നിർമ്മിച്ചിരിക്കുന്നതിനാൽ ശരിയായി പ്രവർത്തിച്ചേക്കില്ല. അപ്ഡേറ്റിനായി പരിശോധിക്കുക, അല്ലെങ്കിൽ ഡെവലപ്പറുമായി ബന്ധപ്പെടുക."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"അപ്ഡേറ്റിനായി പരിശോധിക്കുക"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"നിങ്ങൾക്ക് പുതിയ സന്ദേശങ്ങൾ ഉണ്ട്"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"അൺഇൻസ്റ്റാള് ചെയ്യുക"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"എന്തായാലും തുറക്കുക"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ദോഷകരമായ ആപ്പ് കണ്ടെത്തി"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"സിസ്റ്റം ലോഗ് ആക്സസ് അഭ്യർത്ഥന"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"ഇപ്രാവശ്യം മാത്രം"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"അനുവദിക്കരുത്"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>, ഫംഗ്ഷണൽ ഡീബഗ്ഗിംഗിന് സിസ്റ്റം ലോഗുകൾ അഭ്യർത്ഥിക്കുന്നു. ഈ ലോഗുകളിൽ, നിങ്ങളുടെ ഉപകരണത്തിലെ ആപ്പുകളും സേവനങ്ങളും രേഖപ്പെടുത്തിയ വിവരങ്ങൾ അടങ്ങിയേക്കാം."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"വീണ്ടും കാണിക്കരുത്"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> സ്ലൈസുകൾ കാണിക്കാൻ <xliff:g id="APP_0">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"എഡിറ്റ് ചെയ്യുക"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"കോളുകളും അറിയിപ്പുകളും വൈബ്രേറ്റ് ചെയ്യും"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ഓണാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ഔദ്യോഗിക ആപ്പുകൾ ഇല്ല"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"വ്യക്തിപര ആപ്പുകൾ ഇല്ല"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g>, നിങ്ങളുടെ വ്യക്തിപരമായ പ്രൊഫൈലിൽ തുറക്കണോ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g>, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിൽ തുറക്കണോ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"വ്യക്തിപരമായ ബ്രൗസർ ഉപയോഗിക്കുക"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ഔദ്യോഗിക ബ്രൗസർ ഉപയോഗിക്കുക"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"സിം നെറ്റ്വർക്ക് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ആപ്പ് പശ്ചാത്തലത്തിൽ റൺ ചെയ്യുന്നു, ഇത് ബാറ്ററി ഉപയോഗിച്ചുതീർക്കുന്നു. അവലോകനം ചെയ്യാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"പശ്ചാത്തലത്തിൽ <xliff:g id="APP">%1$s</xliff:g> ആപ്പ് ഒരുപാട് നേരമായി റൺ ചെയ്യുന്നു. അവലോകനം ചെയ്യാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"സജീവമായ ആപ്പുകൾ പരിശോധിക്കുക"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 9fee4c8..5681de0 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"Календарь руу хандах"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Мессеж"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS мессежийг илгээх, харах"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Файл болон документ"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"таны төхөөрөмж дээрх файл болон документод хандах"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Хөгжим & бусад аудио"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"таны төхөөрөмж дээрх аудио файлд хандах"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Зураг & видео"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Үргэлжлүүлэхийн тулд дэлгэцийн түгжээгээ оруулна уу"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Хэсэгчилсэн хурууны хээ илэрлээ"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Хурууны хээ боловсруулж чадахгүй байна. Дахин оролдоно уу."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Мэдрэгчийг цэвэрлэнэ үү"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Бага зэрэг удаан дарна уу"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Хурууны хээ мэдрэгчийг цэвэрлээд, дахин оролдоно уу"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Мэдрэгчийг цэвэрлээд, дахин оролдоно уу"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Мэдрэгч дээр чанга дарна уу"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Хуруу хэт удаан хөдөлгөсөн байна. Дахин оролдоно уу."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Өөр хурууны хээ туршина уу"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Хэт гэрэлтэй байна"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Хурууныхаа байрлалыг тухай бүрд бага зэрэг өөрчилнө үү"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Хурууны хээг таньсангүй"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Мэдрэгч дээр чанга дарна уу"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Хурууны хээг нотолсон"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Царайг баталгаажууллаа"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Царайг баталгаажууллаа. Баталгаажуулах товчлуурыг дарна уу"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Алгасах"</string>
<string name="no_matches" msgid="6472699895759164599">"Илэрц алга"</string>
<string name="find_on_page" msgid="5400537367077438198">"Хуудаснаас олох"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# таарсан илэрц{total}-н }other{#}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Дуусгах"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Хуваалцсан хадгалах санг устгаж байна…"</string>
<string name="share" msgid="4157615043345227321">"Хуваалцах"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Асаах"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Апп боломжгүй байна"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> яг одоо боломжгүй байна."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> боломжгүй байна"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Одоогоор үүнд таны <xliff:g id="DEVICE">%1$s</xliff:g> дээрээс хандах боломжгүй. Оронд нь Android TV төхөөрөмж дээрээ туршиж үзнэ үү."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Одоогоор үүнд таны <xliff:g id="DEVICE">%1$s</xliff:g> дээрээс хандах боломжгүй. Оронд нь таблет дээрээ туршиж үзнэ үү."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Одоогоор үүнд таны <xliff:g id="DEVICE">%1$s</xliff:g> дээрээс хандах боломжгүй. Оронд нь утсан дээрээ туршиж үзнэ үү."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Энэ аппыг Андройдын хуучин хувилбарт зориулсан бөгөөд буруу ажиллаж болзошгүй. Шинэчлэлтийг шалгаж эсвэл хөгжүүлэгчтэй холбогдоно уу."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Шинэчлэлтийг шалгах"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Танд шинэ мессежүүд байна"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"УСТГАХ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ЯМАР Ч ТОХИОЛДОЛД НЭЭХ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Аюултай апп олдсон"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Системийн логийн хандалтын хүсэлт"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Зөвхөн энэ удаа"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Бүү зөвшөөр"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> функциональ дибаг хийх системийн логийг хүсдэг. Эдгээр лог нь таны төхөөрөмж дээрх апп болон үйлчилгээнүүдийн бичсэн мэдээллийг агуулж болно."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Дахиж бүү харуул"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g>-н хэсгүүдийг (slices) харуулах хүсэлтэй байна"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Засах"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Дуудлага болон мэдэгдэл чичирнэ"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Тэжээлийн харилцах цонх"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Дэлгэцийг түгжих"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Дэлгэцийн зураг дарах"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Чихэвч дэгээдэгч"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Дэлгэц дээрх хандалтын товчлол"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Дэлгэц дээрх хандалтын товчлол сонгогч"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Хандалтын товчлол"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Мэдэгдлийн хураангуй самбарыг хаах"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad дээш"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad доош"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad зүүн"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad баруун"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad гол"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н гарчгийн талбар."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>-г ХЯЗГААРЛАСАН сагс руу орууллаа"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Асаахын тулд товших"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ямар ч ажлын апп байхгүй байна"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ямар ч хувийн апп байхгүй байна"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Хувийн профайл дээрээ <xliff:g id="APP">%s</xliff:g>-г нээх үү?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Ажлын профайл дээрээ <xliff:g id="APP">%s</xliff:g>-г нээх үү?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Хувийн хөтөч ашиглах"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Ажлын хөтөч ашиглах"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Сүлжээний SIM-н түгжээг тайлах ПИН"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> дэвсгэрт ажиллаж байгаа бөгөөд батарейг дуусгаж байна. Хянахын тулд товшино уу."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> дэвсгэрт удаан хугацааны турш ажиллаж байна. Хянахын тулд товшино уу."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Идэвхтэй аппуудыг шалгах"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index af1e760..1c434bb 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"आपल्या कॅलेंडरवर प्रवेश"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS मेसेज पाठवणे आणि पाहणे हे"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"फाइल आणि दस्तऐवज"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"तुमच्या डिव्हाइसवर फाइल आणि दस्तऐवज अॅक्सेस करा"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"संगीत & इतर ऑडिओ"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"तुमच्या डिव्हाइसवर ऑडिओ फाइल अॅक्सेस करा"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"फोटो & व्हिडिओ"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"पुढे सुरू ठेवण्यासाठी तुमचे स्क्रीन लॉक एंटर करा"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"आंशिक फिंगरप्रिंट डिटेक्ट केली"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"फिंगरप्रिंटवर प्रक्रिया करणे शक्य झाले नाही. कृपया पुन्हा प्रयत्न करा."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"सेन्सर साफ करा"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"जरा जास्त वेळ धरून ठेवा"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"फिंगरप्रिंट सेन्सर स्वच्छ करा आणि पुन्हा प्रयत्न करा"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"सेन्सर स्वच्छ करा आणि पुन्हा प्रयत्न करा"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"सेन्सरवर जोरात दाबा"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"बोट खूप सावकाश हलविले. कृपया पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"दुसरी फिंगरप्रिंट वापरून पहा"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"खूप प्रखर"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"तुमच्या बोटाची स्थिती प्रत्येक वेळी थोडीशी बदला"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"फिंगरप्रिंट ओळखले नाही"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"सेन्सरवर जोरात दाबा"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"फिंगरप्रिंट ऑथेंटिकेट केली आहे"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"चेहरा ऑथेंटिकेशन केलेला आहे"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"चेहरा ऑथेंटिकेशन केलेला आहे, कृपया कंफर्म दाबा"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"वगळा"</string>
<string name="no_matches" msgid="6472699895759164599">"कोणत्याही जुळण्या नाहीत"</string>
<string name="find_on_page" msgid="5400537367077438198">"पेजवर शोधा"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# सामना }other{ # सामने }} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"पूर्ण केले"</string>
<string name="progress_erasing" msgid="6891435992721028004">"शेअर केलेले स्टोरेज मिटवत आहे…"</string>
<string name="share" msgid="4157615043345227321">"शेअर करा"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"सुरू करा"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ॲप उपलब्ध नाही"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> आता उपलब्ध नाही."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> उपलब्ध नाही"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"हे यावेळी तुमच्या <xliff:g id="DEVICE">%1$s</xliff:g> वर अॅक्सेस करू शकत नाही. त्याऐवजी तुमच्या Android TV डिव्हाइसवर अॅक्सेस करून पहा."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"हे यावेळी तुमच्या <xliff:g id="DEVICE">%1$s</xliff:g> वर अॅक्सेस करू शकत नाही. त्याऐवजी तुमच्या टॅबलेटवर अॅक्सेस करून पहा."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"हे यावेळी तुमच्या <xliff:g id="DEVICE">%1$s</xliff:g> वर अॅक्सेस करू शकत नाही. त्याऐवजी तुमच्या फोनवर अॅक्सेस करून पहा."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"हे अॅप Android च्या जुन्या आवृत्ती साठी तयार करण्यात आले होते आणि योग्यरितीने कार्य करू शकणार नाही. अपडेट आहेत का ते तपासून पहा, किंवा डेव्हलपरशी संपर्क साधण्याचा प्रयत्न करा."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"अपडेटसाठी तपासा"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"आपल्याकडे नवीन मेसेज आहेत"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"अनइंस्टॉल करा"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"तरीही उघडा"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"हानिकारक अॅप आढळला"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"सिस्टीम लॉगच्या अॅक्सेसची विनंती"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"फक्त यावेळी"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"अनुमती देऊ नका"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> हे फंक्शनल डीबगिंगसाठी सिस्टीम लॉगची विनंती करते. या लॉगमध्ये तुमच्या डिव्हाइसवरील ॲप्स आणि सेवांनी लिहिलेली माहिती असू शकते."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"पुन्हा दाखवू नका"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ला <xliff:g id="APP_2">%2$s</xliff:g> चे तुकडे दाखवायचे आहेत"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"संपादित करा"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कॉल आणि सूचनांवर व्हायब्रेट होईल"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"सुरू करण्यासाठी टॅप करा"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"कोणतीही कार्य ॲप्स सपोर्ट करत नाहीत"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"कोणतीही वैयक्तिक ॲप्स सपोर्ट करत नाहीत"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"तुमच्या वैयक्तिक प्रोफाइलमध्ये <xliff:g id="APP">%s</xliff:g> उघडायचे आहे का?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"तुमच्या कार्य प्रोफाइलमध्ये <xliff:g id="APP">%s</xliff:g> उघडायचे आहे का?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"वैयक्तिक ब्राउझर वापरा"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"कार्य ब्राउझर वापरा"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क अनलॉक पिन"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> हे बॅकग्राउंडमध्ये रन होत आहे आणि बॅटरी संपवत आहे. पुनरावलोकनासाठी टॅप करा."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> हे बऱ्याच कालावधीपासून बॅकग्राउंडमध्ये रन होत आहे. पुनरावलोकनासाठी टॅप करा."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ॲक्टिव्ह ॲप्स पहा"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index cacdc8d..b4ce57c 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Masukkan kunci skrin untuk teruskan"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Cap jari separa dikesan"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Tidak dapat memproses cap jari. Sila cuba lagi."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Bersihkan penderia"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Tahan lebih lama sedikit"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Jari digerakkan terlalu perlahan. Sila cuba lagi."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Cuba cap jari lain"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Terlalu terang"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Tukar sedikit kedudukan jari anda setiap kali pergerakan dilakukan"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Cap jari disahkan"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Wajah disahkan"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Wajah disahkan, sila tekan sahkan"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Langkau"</string>
<string name="no_matches" msgid="6472699895759164599">"Tiada padanan"</string>
<string name="find_on_page" msgid="5400537367077438198">"Cari di halaman"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# padanan}other{# daripada {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Selesai"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Memadamkan storan kongsi…"</string>
<string name="share" msgid="4157615043345227321">"Kongsi"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Hidupkan"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Apl tidak tersedia"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak tersedia sekarang."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> tidak tersedia"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Aplikasi ini tidak boleh diakses pada <xliff:g id="DEVICE">%1$s</xliff:g> anda pada masa ini. Cuba pada peranti Android TV anda."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Aplikasi ini tidak boleh diakses pada <xliff:g id="DEVICE">%1$s</xliff:g> anda pada masa ini. Cuba pada tablet anda."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Aplikasi ini tidak boleh diakses pada <xliff:g id="DEVICE">%1$s</xliff:g> anda pada masa ini. Cuba pada telefon anda."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Apl ini dibina untuk versi Android yang lebih lama dan mungkin tidak berfungsi dengan betul. Cuba semak kemas kini atau hubungi pembangun."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Semak kemaskinian"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Anda mempunyai mesej baharu"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"NYAHPASANG"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"BUKA JUGA"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Apl berbahaya dikesan"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Permintaan akses log sistem"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Kali ini sahaja"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Jangan benarkan"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> meminta log sistem untuk penyahpepijatan berfungsi. Log ini mungkin mengandungi maklumat yang telah ditulis apl dan perkhidmatan pada peranti anda."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Jangan tunjuk lagi"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> mahu menunjukkan <xliff:g id="APP_2">%2$s</xliff:g> hirisan"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Panggilan dan pemberitahuan akan bergetar"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Kuasa"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrin Kunci"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Tangkapan skrin"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Cangkuk Set Kepala"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pintasan Kebolehaksesan Pada Skrin"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pemilih Pintasan Kebolehaksesan Pada Skrin"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pintasan Kebolehaksesan"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ketepikan Bidai Pemberitahuan"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad Atas"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad Bawah"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Kiri"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Kanan"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bar kapsyen <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah diletakkan dalam baldi TERHAD"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Ketik untuk menghidupkan profil"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Tiada apl kerja"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Tiada apl peribadi"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Buka <xliff:g id="APP">%s</xliff:g> dalam profil peribadi anda?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Buka <xliff:g id="APP">%s</xliff:g> dalam profil kerja anda?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gunakan penyemak imbas peribadi"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gunakan penyemak imbas kerja"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN buka kunci rangkaian SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> sedang berjalan di latar belakang dan menghabiskan bateri. Ketik untuk menyemak."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g>sedang berjalan di latar belakang untuk masa yang lama. Ketik untuk menyemak."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Semak apl aktif"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 3259803..acbd498 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ရှေ့ဆက်ရန် သင်၏ဖန်သားပြင် လော့ခ်ချခြင်းကို ထည့်ပါ"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"လက်ဗွေတစ်စိတ်တစ်ပိုင်းကို ရှာတွေ့သည်"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"လက်ဗွေယူ၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"အာရုံခံကိရိယာကို သန့်ရှင်းရေးလုပ်ပါ"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"အနည်းငယ်ကြာအောင် ဖိထားပါ"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"လက်ညှိုးအလွန်နှေးကွေးစွာ ရွေ့ခဲ့သည်။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"အခြားလက်ဗွေဖြင့် စမ်းကြည့်ပါ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"အလွန် လင်းသည်"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"အကြိမ်တိုင်း သင့်လက်ချောင်း၏တည်နေရာကို အနည်းငယ်ပြောင်းပါ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"လက်ဗွေကို အထောက်အထား စိစစ်ပြီးပါပြီ"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"မျက်နှာ အထောက်အထားစိစစ်ပြီးပြီ"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"မျက်နှာ အထောက်အထားစိစစ်ပြီးပြီ၊ အတည်ပြုရန်ကို နှိပ်ပါ"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ကျော်ရန်"</string>
<string name="no_matches" msgid="6472699895759164599">"ထပ်တူမတွေ့ရှိပါ"</string>
<string name="find_on_page" msgid="5400537367077438198">"စာမျက်နှာတွင်ရှာဖွေရန်"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ပွဲ}other{{total} ပွဲအနက် #}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"ပြီးပါပြီ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"မျှဝေထားသည့် သိုလှောင်ခန်းကို ဖျက်နေသည်…"</string>
<string name="share" msgid="4157615043345227321">"မျှဝေရန်"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ဖွင့်ပါ"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"အက်ပ်ကို မရနိုင်ပါ"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို ယခု မရနိုင်ပါ။"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> မရနိုင်ပါ"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"၎င်းအား ယခု သင့် <xliff:g id="DEVICE">%1$s</xliff:g> တွင် ဝင်၍မရပါ။ ယင်းအစား Android TV စက်တွင် စမ်းကြည့်ပါ။"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"၎င်းအား ယခု သင့် <xliff:g id="DEVICE">%1$s</xliff:g> တွင် ဝင်၍မရပါ။ ယင်းအစား တက်ဘလက်တွင် စမ်းကြည့်ပါ။"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"၎င်းအား ယခု သင့် <xliff:g id="DEVICE">%1$s</xliff:g> တွင် ဝင်၍မရပါ။ ယင်းအစား ဖုန်းတွင် စမ်းကြည့်ပါ။"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ဤအက်ပ်ကို Android ဗားရှင်းဟောင်းအတွက် ပြုလုပ်ထားခြင်းဖြစ်ပြီး ပုံမှန်အလုပ်မလုပ်နိုင်ပါ။ အပ်ဒိတ်များအတွက် ရှာကြည့်ပါ သို့မဟုတ် ဆော့ဖ်ဝဲအင်ဂျင်နီယာကို ဆက်သွယ်ပါ။"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"အပ်ဒိတ်စစ်ရန်"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"သင့်ထံတွင် စာအသစ်များရောက်နေသည်"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ဖြုတ်ရန်"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ဘာဖြစ်ဖြစ် ဖွင့်ရန်"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"အန္တရာယ်ရှိသော အက်ပ်ကို တွေ့ရှိထားသည်"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"စနစ်မှတ်တမ်းသုံးခွင့် တောင်းဆိုခြင်း"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"ဤတစ်ကြိမ်သာ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"ခွင့်မပြုပါ"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"အမှားရှာပြင်မှု လုပ်ဆောင်နိုင်ရန်အတွက် စနစ်မှတ်တမ်းများကို <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> က တောင်းဆိုသည်။ ဤမှတ်တမ်းများတွင် သင်၏စက်ပေါ်ရှိအက်ပ်နှင့် ဝန်ဆောင်မှုများ ရေးထားသော အချက်အလက်များ ပါဝင်နိုင်သည်။"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"နောက်ထပ်မပြပါနှင့်"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> သည် <xliff:g id="APP_2">%2$s</xliff:g> ၏အချပ်များကို ပြသလိုသည်"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"တည်းဖြတ်ရန်"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များ တုန်ခါပါမည်"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ပါဝါ ဒိုင်ယာလော့"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"လော့ခ်မျက်နှာပြင်"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"မိုက်ခွက်ပါနားကြပ်ချိတ်"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ်"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ် ရွေးချယ်စနစ်"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"အကြောင်းကြားစာအကွက်ကို ပယ်ရန်"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad အပေါ်"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad အောက်"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ဘယ်"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ညာ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad အလယ်"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>၏ ခေါင်းစီး ဘား။"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ကို တားမြစ်ထားသော သိမ်းဆည်းမှုအတွင်းသို့ ထည့်ပြီးပါပြီ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ဖွင့်ရန်တို့ပါ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"အလုပ်သုံးအက်ပ်များ မရှိပါ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ကိုယ်ပိုင်အက်ပ်များ မရှိပါ"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> ကို သင့်ကိုယ်ပိုင်ပရိုဖိုင်တွင် ဖွင့်မလား။"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> ကို သင့်အလုပ်ပရိုဖိုင်တွင် ဖွင့်မလား။"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ကိုယ်ပိုင်ဘရောင်ဇာ သုံးရန်"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"အလုပ်သုံးဘရောင်ဇာ သုံးရန်"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ဆင်းမ်ကွန်ရက် လော့ခ်ဖွင့်ရန် ပင်နံပါတ်"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> သည် နောက်ခံတွင်ပွင့်နေပြီး ဘက်ထရီအားကုန်စေသည်။ ပြန်ကြည့်ရန် တို့ပါ။"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> သည် နောက်ခံတွင် အချိန်အတော်ကြာပွင့်နေသည်။ ပြန်ကြည့်ရန် တို့ပါ။"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ပွင့်နေသည့်အက်ပ်များ စစ်ဆေးရန်"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index db84e2f..234ead8 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Skriv inn skjermlåsen for å fortsette"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Et delvis fingeravtrykk er registrert"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Kunne ikke registrere fingeravtrykket. Prøv på nytt."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Rengjør sensoren"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hold litt lenger"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Du flyttet fingeren for sakte. Prøv på nytt."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Prøv et annet fingeravtrykk"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"For lyst"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Endre posisjonen til fingeren litt hver gang"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingeravtrykket er godkjent"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Ansiktet er autentisert"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Ansiktet er autentisert. Trykk på Bekreft"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Hopp over"</string>
<string name="no_matches" msgid="6472699895759164599">"Ingen treff"</string>
<string name="find_on_page" msgid="5400537367077438198">"Finn på side"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# treff}other{# av {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Ferdig"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Sletter delt lagring …"</string>
<string name="share" msgid="4157615043345227321">"Del"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Slå på"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Appen er ikke tilgjengelig"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> er ikke tilgjengelig for øyeblikket."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> er utilgjengelig"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Dette er ikke tilgjengelig på <xliff:g id="DEVICE">%1$s</xliff:g> for øyeblikket. Prøv på Android TV-enheten din i stedet."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Dette er ikke tilgjengelig på <xliff:g id="DEVICE">%1$s</xliff:g> for øyeblikket. Prøv på nettbrettet ditt i stedet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Dette er ikke tilgjengelig på <xliff:g id="DEVICE">%1$s</xliff:g> for øyeblikket. Prøv på telefonen din i stedet."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Denne appen er utviklet for en eldre versjon av Android og fungerer kanskje ikke som den skal. Prøv å se etter oppdateringer, eller kontakt utvikleren."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Se etter oppdateringer"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Du har nye meldinger"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"AVINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ÅPNE LIKEVEL"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"En skadelig app ble oppdaget"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Forespørsel om tilgang til systemlogg"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Bare denne gangen"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ikke tillat"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ber om systemlogger for funksjonell feilsøking. Disse loggene kan inneholde informasjon som apper og tjenester på enheten din har skrevet."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ikke vis igjen"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vil vise <xliff:g id="APP_2">%2$s</xliff:g>-utsnitt"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Endre"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Anrop og varsler vibrerer"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks for å slå av/på"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskjerm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjermdump"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Hook for hodetelefoner"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Tilgjengelighetssnarvei på skjermen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Velger for tilgjengelighetssnarvei på skjermen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Tilgjengelighetssnarvei"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Lukk varselpanelet"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Opp på styrepilene"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Ned på styrepilene"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Venstre på styrepilene"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Høyre på styrepilene"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Midt på styrepilene"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstingsfelt i <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blitt plassert i TILGANGSBEGRENSET-toppmappen"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Trykk for å slå på"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ingen jobbapper"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ingen personlige apper"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Vil du åpne <xliff:g id="APP">%s</xliff:g> i den personlige profilen din?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Vil du åpne <xliff:g id="APP">%s</xliff:g> i jobbprofilen din?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Bruk den personlige nettleseren"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Bruk jobbnettleseren"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-kode for å fjerne operatørlåser"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> kjører i bakgrunnen og bruker batteri. Trykk for å gjennomgå."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> kjører lenge i bakgrunnen. Trykk for å gjennomgå."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Sjekk aktive apper"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 6a4ac47..77257b1 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"फाइल र डकुमेन्टहरू"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"आफ्नो डिभाइसमा भएका फाइल र डकुमेन्टहरू प्रयोग गर्नुहोस्"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"सङ्गीत तथा अन्य अडियो"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"तपाईंको डिभाइसमा भएका अडियो फाइलहरू प्रयोग गर्ने"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"फोटो तथा भिडियोहरू"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"जारी राख्न आफ्नो स्क्रिन लक हाल्नुहोस्"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"फिंगरप्रिन्ट आंशिक रूपमा पत्ता लाग्यो"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"फिंगरप्रिन्ट प्रशोधन गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"सेन्सर सफा गर्नुहोस्"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"औँला अलि बढी समयसम्म सेन्सरमा राख्नुहोस्"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"फिंगरप्रिन्ट सेन्सर सफा गरेर फेरि प्रयास गर्नुहोस्"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"सेन्सर सफा गरेर फेरि प्रयास गर्नुहोस्"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"सेन्सरमा बेसरी थिच्नुहोस्"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"औंला निकै सुस्त सारियो। कृपया फेरि प्रयास गर्नुहोस्।"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"अर्को फिंगरप्रिन्ट प्रयोग गरी हेर्नुहोस्"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ज्यादै उज्यालो छ"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"हरेक पटक आफ्नो औँला थोरै यताउता सार्नुहोस्"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"फिंगरप्रिन्ट पहिचान गर्न सकिएन"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"सेन्सरमा बेसरी थिच्नुहोस्"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"फिंगरप्रिन्ट प्रमाणीकरण गरियो"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"अनुहार प्रमाणीकरण गरियो"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"अनुहार प्रमाणीकरण गरियो, कृपया पुष्टि गर्नुहोस् थिच्नुहोस्"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"छोड्नुहोस्"</string>
<string name="no_matches" msgid="6472699895759164599">"कुनै मिलेन"</string>
<string name="find_on_page" msgid="5400537367077438198">"पृष्ठमा फेला पार्नुहोस्"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# खेल{total} वटा खेलमध्ये }other{# औँ खेल}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"भयो"</string>
<string name="progress_erasing" msgid="6891435992721028004">"साझेदारी गरिएको भण्डारण मेट्दै…"</string>
<string name="share" msgid="4157615043345227321">"सेयर गर्नुहोस्"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"सक्रिय गर्नुहोस्"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"एप उपलब्ध छैन"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> अहिले उपलब्ध छैन।"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> उपलब्ध छैन"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"यस बखत तपाईंको <xliff:g id="DEVICE">%1$s</xliff:g> मा यो एप स्ट्रिम गर्न मिल्दैन। बरु तपाईंको Android TV डिभाइसमा स्ट्रिम गरी हेर्नुहोस्।"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"यस बखत तपाईंको <xliff:g id="DEVICE">%1$s</xliff:g> मा यो एप स्ट्रिम गर्न मिल्दैन। बरु तपाईंको ट्याब्लेटमा स्ट्रिम गरी हेर्नुहोस्।"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"यस बखत तपाईंको <xliff:g id="DEVICE">%1$s</xliff:g> मा यो एप स्ट्रिम गर्न मिल्दैन। बरु तपाईंको फोनमा स्ट्रिम गरी हेर्नुहोस्।"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"यो एप Android को पुरानो संस्करणका लागि बनाइएको हुनाले यसले सही ढङ्गले काम नगर्न सक्छ। अद्यावधिकहरू उपलब्ध छन् वा छैनन् भनी जाँच गरी हेर्नुहोस् वा यसको विकासकर्तालाई सम्पर्क गर्नुहोस्।"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"अपडेट उपलब्ध छ वा छैन जाँच्नुहोस्"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"तपाईंलाई नयाँ सन्देश आएको छ"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"स्थापना रद्द गर्नु…"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"जे भए पनि खोल्नुहोस्"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"हानिकारक एप भेटियो"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"सिस्टम लग प्रयोग गर्ने अनुमति"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"यस पटक मात्र"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"अनुमति नदिनुहोस्"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ले फङ्सनल डिबग प्रक्रियाका लागि सिस्टम लगहरू हेर्ने तथा प्रयोग गर्ने अनुमति माग्दै छ। यी लगहरूमा तपाईंको डिभाइसमा रहेका एप र सेवाहरूले राइट गरेको जानकारी समावेश हुन सक्छ।"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"फेरि नदेखाइयोस्"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ले <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन चाहन्छ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"सम्पादन गर्नुहोस्"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कल तथा सूचनाहरू आउँदा कम्पन हुने छ"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"अन गर्न ट्याप गर्नुहोस्"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"यो सामग्री खोल्न मिल्ने कुनै पनि कामसम्बन्धी एप छैन"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"यो सामग्री खोल्न मिल्ने कुनै पनि व्यक्तिगत एप छैन"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> तपाईंको व्यक्तिगत प्रोफाइलमा खोल्ने हो?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> तपाईंको कार्य प्रोफाइलमा खोल्ने हो?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"व्यक्तिगत ब्राउजर प्रयोग गर्नुहोस्"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"कार्य ब्राउजर प्रयोग गर्नुहोस्"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM को नेटवर्क अनलक गर्ने PIN"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ब्याकग्राउन्डमा चलिरहेको हुनाले ब्याट्री खपत भइरहेको छ। तपाईं यसका सम्बन्धमा समीक्षा गर्न चाहनुहुन्छ भने ट्याप गर्नुहोस्।"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> लामो समयदेखि ब्याकग्राउन्डमा चलिरहेको छ। तपाईं यसका सम्बन्धमा समीक्षा गर्न चाहनुहुन्छ भने ट्याप गर्नुहोस्।"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"कुन कुन एप सक्रिय छ भन्ने कुरा जाँच्नुहोस्"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index b06db70..f85f5f6 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Voer je schermvergrendeling in om door te gaan"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Gedeeltelijke vingerafdruk gedetecteerd"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Kan vingerafdruk niet verwerken. Probeer het opnieuw."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Maak de sensor schoon"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Houd iets langer vast"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Vinger te langzaam bewogen. Probeer het opnieuw."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Probeer een andere vingerafdruk"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Te veel licht"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Verander de positie van je vinger steeds een beetje"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Vingerafdruk geverifieerd"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Gezicht geverifieerd"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Gezicht geverifieerd. Druk op Bevestigen."</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Overslaan"</string>
<string name="no_matches" msgid="6472699895759164599">"Geen overeenkomsten"</string>
<string name="find_on_page" msgid="5400537367077438198">"Zoeken op pagina"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# overeenkomst}other{# van {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Klaar"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Gedeelde opslag wissen…"</string>
<string name="share" msgid="4157615043345227321">"Delen"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aanzetten"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App is niet beschikbaar"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is momenteel niet beschikbaar."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> niet beschikbaar"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Je hebt hier nu geen toegang toe op je <xliff:g id="DEVICE">%1$s</xliff:g>. Probeer het in plaats daarvan op je Android TV-apparaat."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Je hebt hier nu geen toegang toe op je <xliff:g id="DEVICE">%1$s</xliff:g>. Probeer het in plaats daarvan op je tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Je hebt hier nu geen toegang toe op je <xliff:g id="DEVICE">%1$s</xliff:g>. Probeer het in plaats daarvan op je telefoon."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Deze app is ontwikkeld voor een oudere versie van Android en werkt mogelijk niet op de juiste manier. Controleer op updates of neem contact op met de ontwikkelaar."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Controleren op update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Je hebt nieuwe berichten"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"VERWIJDEREN"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TOCH OPENEN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Schadelijke app gevonden"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Verzoek om toegang tot systeemlogboeken"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Alleen deze keer"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Niet toestaan"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> vraagt om systeemlogboeken voor functionele foutopsporing. Deze logboeken kunnen informatie bevatten die apps en services op je apparaat hebben geschreven."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Niet opnieuw tonen"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wil segmenten van <xliff:g id="APP_2">%2$s</xliff:g> tonen"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Bewerken"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Trillen bij gesprekken en meldingen"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Voedingsdialoogvenster"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Scherm vergrendelen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset-hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Snelkoppeling voor toegankelijkheid op scherm"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Kiezer voor snelkoppeling voor toegankelijkheid op scherm"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Snelkoppeling voor toegankelijkheid"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Meldingenpaneel sluiten"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-pad omhoog"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-pad omlaag"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad links"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad rechts"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad midden"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ondertitelingsbalk van <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in de bucket RESTRICTED geplaatst"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tik om aan te zetten"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werk-apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlijke apps"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> openen in je persoonlijke profiel?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> openen in je werkprofiel?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Persoonlijke browser gebruiken"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Werkbrowser gebruiken"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Ontgrendelingspincode voor SIM-netwerk"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> wordt uitgevoerd op de achtergrond en verbruikt veel batterijlading. Tik om te bekijken."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> wordt al lange tijd uitgevoerd op de achtergrond. Tik om te bekijken."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Actieve apps checken"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 37682af..0a945e0 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍ ଆକ୍ସେସ୍ କରେ"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ମେସେଜ୍ ପଠାନ୍ତୁ ଓ ଦେଖନ୍ତୁ"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ଫାଇଲ ଏବଂ ଡକ୍ୟୁମେଣ୍ଟଗୁଡ଼ିକ"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଥିବା ଫାଇଲ ଏବଂ ଡକ୍ୟୁମେଣ୍ଟଗୁଡ଼ିକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ମ୍ୟୁଜିକ ଓ ଅନ୍ୟ ଅଡିଓ"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଅଡିଓ ଫାଇଲଗୁଡ଼ିକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ଫଟୋ ଓ ଭିଡିଓଗୁଡ଼ିକ"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ ଲକ୍ ଏଣ୍ଟର୍ କରନ୍ତୁ"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ଆଂଶିକ ଟିପଚିହ୍ନ ଚିହ୍ନଟ କରାଯାଇଛି"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ଟିପଚିହ୍ନ ପ୍ରୋସେସ୍ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ସେନ୍ସରକୁ ସଫା କରନ୍ତୁ"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ଟିକିଏ ଅଧିକ ସମୟ ଧରି ରଖନ୍ତୁ"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ପରିଷ୍କାର କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"ସେନ୍ସରକୁ ପରିଷ୍କାର କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"ସେନ୍ସର ଉପରେ ଦୃଢ଼ ଭାବେ ଦବାନ୍ତୁ"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ଆଙ୍ଗୁଠି ଖୁବ୍ ଧୀରେ ନିଆଗଲା। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ଅନ୍ୟ ଏକ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ବହୁତ ଉଜ୍ଜ୍ୱଳ"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ପ୍ରତି ଥର ଆପଣଙ୍କ ଆଙ୍ଗୁଠିର ସ୍ଥାନ ସାମାନ୍ୟ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"ଟିପଚିହ୍ନ ଚିହ୍ନଟ ହେଲା ନାହିଁ"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"ସେନ୍ସର ଉପରେ ଦୃଢ଼ ଭାବେ ଦବାନ୍ତୁ"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ଟିପଚିହ୍ନ ପ୍ରମାଣିତ ହେଲା"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ମୁହଁ ଚିହ୍ନଟ ହୋଇଛି"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ମୁହଁ ଚିହ୍ନଟ ହୋଇଛି, ଦୟାକରି ସୁନିଶ୍ଚିତ ଦବାନ୍ତୁ"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ଛାଡ଼ିଦିଅନ୍ତୁ"</string>
<string name="no_matches" msgid="6472699895759164599">"କୌଣସି ମେଳକ ନାହିଁ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ପୃଷ୍ଠାରେ ଖୋଜନ୍ତୁ"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{#ଟି ମେଳ{total}ର }other{#ଟି ମେଳ}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"ହୋଇଗଲା"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ସେୟାର୍ ହୋଇଥିବା ଷ୍ଟୋରେଜ୍ ଲିଭାଉଛି…"</string>
<string name="share" msgid="4157615043345227321">"ସେୟାର୍"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ଚାଲୁ କରନ୍ତୁ"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ଆପ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ନାହିଁ।"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ବର୍ତ୍ତମାନ ଏହାକୁ ଆପଣଙ୍କ <xliff:g id="DEVICE">%1$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇପାରିବ ନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ ଆପଣଙ୍କ Android TV ଡିଭାଇସରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ବର୍ତ୍ତମାନ ଏହାକୁ ଆପଣଙ୍କ <xliff:g id="DEVICE">%1$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇପାରିବ ନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ ଆପଣଙ୍କ ଟାବଲେଟରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ବର୍ତ୍ତମାନ ଏହାକୁ ଆପଣଙ୍କ <xliff:g id="DEVICE">%1$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇପାରିବ ନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ ଆପଣଙ୍କ ଫୋନରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ଏହି ଆପ୍କୁ Androidର ପୁରୁଣା ଭର୍ସନ୍ ପାଇଁ ନିର୍ମାଣ କରାଯାଇଥିଲା ଏବଂ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ। ଏହାପାଇଁ ଅପଡେଟ୍ ଅଛି କି ନାହିଁ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା ଡେଭେଲପର୍ଙ୍କ ସହିତ ସମ୍ପର୍କ କରନ୍ତୁ।"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ଅପଡେଟ୍ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"ଆପଣଙ୍କ ପାଖରେ ନୂଆ ମେସେଜ୍ ରହିଛି"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ଅନଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"କୌଣସିମତେ ଖୋଲନ୍ତୁ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ହାନିକାରକ ଆପ୍ ଚିହ୍ନଟ ହୋଇଛି"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"ସିଷ୍ଟମ ଲଗକୁ ଆକ୍ସେସ କରିବାର ଅନୁରୋଧ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"କେବଳ ଏହି ଥର"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ଫଙ୍କସନାଲ ଡିବଗିଂ ପାଇଁ ସିଷ୍ଟମ ଲଗଗୁଡ଼ିକର ଅନୁରୋଧ କରୁଛି। ଆପଣଙ୍କ ଡିଭାଇସରେ ଥିବା ଆପ ଏବଂ ସେବାଗୁଡ଼ିକ ଲେଖିଥିବା ସୂଚନା ଏହି ଲଗଗୁଡ଼ିକରେ ଥାଇପାରେ।"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> ସ୍ଲାଇସ୍କୁ ଦେଖାଇବା ପାଇଁ ଚାହେଁ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ଏଡିଟ୍ କରନ୍ତୁ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଭାଇବ୍ରେଟ୍ ହେବ"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ପାୱାର ଡାୟଲଗ୍ ଖୋଲନ୍ତୁ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ସ୍କ୍ରିନ୍ ଲକ୍ କରନ୍ତୁ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ସ୍କ୍ରିନ୍ସଟ୍ ନିଅନ୍ତୁ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ହେଡସେଟ ହୁକ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍ ବାଛିବା ସୁବିଧା"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ବିଜ୍ଞପ୍ତି ସେଡକୁ ଖାରଜ କରନ୍ତୁ"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ଉପର"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ତଳ"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ବାମ"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ଡାହାଣ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad କେନ୍ଦ୍ର"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ର କ୍ୟାପ୍ସନ୍ ବାର୍।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ଚାଲୁ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"କୌଣସି ୱାର୍କ ଆପ୍ ନାହିଁ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"କୌଣସି ବ୍ୟକ୍ତିଗତ ଆପ୍ ନାହିଁ"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g>କୁ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲରେ ଖୋଲିବେ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g>କୁ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲରେ ଖୋଲିବେ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ବ୍ୟକ୍ତିଗତ ବ୍ରାଉଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ୱାର୍କ ବ୍ରାଉଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ନେଟୱାର୍କ ଅନଲକ୍ PIN"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ପୃଷ୍ଠପଟରେ ଚାଲୁଛି ଏବଂ ବ୍ୟାଟେରୀର ଚାର୍ଜ ସମାପ୍ତ ହେଉଛି। ସମୀକ୍ଷା କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ଦୀର୍ଘ ସମୟ ଧରି ପୃଷ୍ଠପଟରେ ଚାଲୁଛି। ସମୀକ୍ଷା କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ସକ୍ରିୟ ଆପଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 636cdba..294dd3c 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਸਕ੍ਰੀਨ ਲਾਕ ਦਾਖਲ ਕਰੋ"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ਅੰਸ਼ਕ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ਫਿੰਗਰਪ੍ਰਿੰਟ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਨਹੀਂ ਹੋ ਸਕੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ਸੈਂਸਰ ਨੂੰ ਸਾਫ਼ ਕਰੋ"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"ਸੈਂਸਰ \'ਤੇ ਉਂਗਲ ਨੂੰ ਥੋੜ੍ਹਾ ਜ਼ਿਆਦਾ ਦੇਰ ਲਈ ਰੱਖੋ"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ਉਂਗਲ ਕਾਫ਼ੀ ਹੌਲੀ ਮੂਵ ਹੋਈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ਕੋਈ ਹੋਰ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤ ਕੇ ਦੇਖੋ"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਚਮਕ"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ਹਰ ਵਾਰ ਆਪਣੀ ਉਂਗਲ ਨੂੰ ਥੋੜ੍ਹਾ ਹਿਲਾਓ"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ਚਿਹਰਾ ਪੁਸ਼ਟੀਕਰਨ"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ਚਿਹਰਾ ਪੁਸ਼ਟੀਕਰਨ, ਕਿਰਪਾ ਕਰਕੇ \'ਪੁਸ਼ਟੀ ਕਰੋ\' ਦਬਾਓ"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ਛੱਡੋ"</string>
<string name="no_matches" msgid="6472699895759164599">"ਕੋਈ ਮੇਲ ਨਹੀਂ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ਸਫ਼ੇ ਤੇ ਲੱਭੋ"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ਮਿਲਾਨ{total} ਵਿੱਚੋਂ }one{#{total} ਵਿੱਚੋਂ }other{#}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"ਹੋ ਗਿਆ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਮਿਟਾਈ ਜਾ ਰਹੀ ਹੈ…"</string>
<string name="share" msgid="4157615043345227321">"ਸਾਂਝਾ ਕਰੋ"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ਚਾਲੂ ਕਰੋ"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ਇਸ ਸਮੇਂ ਤੁਹਾਡੇ <xliff:g id="DEVICE">%1$s</xliff:g> \'ਤੇ ਇਸ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇਸਦੀ ਬਜਾਏ ਆਪਣੇ Android TV ਡੀਵਾਈਸ \'ਤੇ ਵਰਤ ਕੇ ਦੇਖੋ।"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ਇਸ ਸਮੇਂ ਤੁਹਾਡੇ <xliff:g id="DEVICE">%1$s</xliff:g> \'ਤੇ ਇਸ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇਸਦੀ ਬਜਾਏ ਆਪਣੇ ਟੈਬਲੈੱਟ \'ਤੇ ਵਰਤ ਕੇ ਦੇਖੋ।"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ਇਸ ਸਮੇਂ ਤੁਹਾਡੇ <xliff:g id="DEVICE">%1$s</xliff:g> \'ਤੇ ਇਸ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇਸਦੀ ਬਜਾਏ ਆਪਣੇ ਫ਼ੋਨ \'ਤੇ ਵਰਤ ਕੇ ਦੇਖੋ।"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ਇਹ ਐਪ Android ਦੇ ਕਿਸੇ ਵਧੇਰੇ ਪੁਰਾਣੇ ਵਰਜਨ ਲਈ ਬਣਾਈ ਗਈ ਸੀ ਅਤੇ ਸ਼ਾਇਦ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ। ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਕਰੋ ਜਾਂ ਵਿਕਾਸਕਾਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕਰੋ"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"ਤੁਹਾਨੂੰ ਨਵੇਂ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਹੋਏ ਹਨ"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ਅਣਸਥਾਪਤ ਕਰੋ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ਫਿਰ ਵੀ ਖੋਲ੍ਹੋ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ਹਾਨੀਕਾਰਕ ਐਪ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"ਸਿਸਟਮ ਲੌਗ ਤੱਕ ਪਹੁੰਚ ਦੀ ਬੇਨਤੀ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"ਸਿਰਫ਼ ਇਸ ਵਾਰ"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"ਆਗਿਆ ਨਾ ਦਿਓ"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"ਕਾਰਜਾਤਮਿਕ ਡੀਬੱਗਿੰਗ ਲਈ <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ਸਿਸਟਮ ਲੌਗਾਂ ਦੀ ਬੇਨਤੀ ਕਰਦੀ ਹੈ। ਇਨ੍ਹਾਂ ਲੌਗਾਂ ਵਿੱਚ ਉਹ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੋ ਸਕਦੀ ਹੈ ਜੋ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਨੇ ਲਿਖੀ ਹੈ।"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ਦੀ <xliff:g id="APP_2">%2$s</xliff:g> ਦੇ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦੀ ਇੱਛਾ ਹੈ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਦੀ ਥਰਥਰਾਹਟ ਹੋਵੇਗੀ"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ਪਾਵਰ ਵਿੰਡੋ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ਲਾਕ ਸਕ੍ਰੀਨ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ਹੈੱਡਸੈੱਟ ਦਾ ਹੁੱਕ ਬਟਨ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲਾ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲੇ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਦਾ ਚੋਣਕਾਰ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ਸੂਚਨਾ ਸ਼ੇਡ ਖਾਰਜ ਕਰੋ"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ਦਾ ਉੱਪਰਲਾ ਬਟਨ"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ਦਾ ਹੇਠਲਾ ਬਟਨ"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ਦਾ ਖੱਬੇ ਪਾਸੇ ਵਾਲਾ ਬਟਨ"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ਦਾ ਸੱਜੇ ਪਾਸੇ ਵਾਲਾ ਬਟਨ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ਦਾ ਵਿਚਕਾਰਲਾ ਬਟਨ"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਦੀ ਸੁਰਖੀ ਪੱਟੀ।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ਚਾਲੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ਕੋਈ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਨਹੀਂ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਨਹੀਂ"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"ਕੀ ਆਪਣੇ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"ਕੀ ਆਪਣੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ਨਿੱਜੀ ਬ੍ਰਾਊਜ਼ਰ ਵਰਤੋ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ਕੰਮ ਸੰਬੰਧੀ ਬ੍ਰਾਊਜ਼ਰ ਵਰਤੋ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ਸਿਮ ਨੈੱਟਵਰਕ ਅਣਲਾਕ ਪਿੰਨ"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀ ਹੈ ਅਤੇ ਬੈਟਰੀ ਦੀ ਖਪਤ ਕਰ ਰਹੀ ਹੈ। ਸਮੀਖਿਆ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ਲੰਮੇ ਸਮੇਂ ਤੋਂ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀ ਹੈ। ਸਮੀਖਿਆ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ਕਿਰਿਆਸ਼ੀਲ ਐਪਾਂ ਦੀ ਜਾਂਚ ਕਰੋ"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index f8b3dec..a316127 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -590,8 +590,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Użyj blokady ekranu, aby kontynuować"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Wykryto częściowy odcisk palca"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Nie udało się przetworzyć odcisku palca. Spróbuj ponownie."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Wyczyść czytnik"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Przytrzymaj trochę dłużej"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Palec został obrócony zbyt wolno. Spróbuj ponownie."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Użyj odcisku innego palca"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Zbyt jasno"</string>
@@ -599,6 +603,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Za każdym razem lekko zmieniaj ułożenie palca"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Uwierzytelniono odciskiem palca"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Twarz rozpoznana"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Twarz rozpoznana, kliknij Potwierdź"</string>
@@ -1502,7 +1510,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Pomiń"</string>
<string name="no_matches" msgid="6472699895759164599">"Brak wyników"</string>
<string name="find_on_page" msgid="5400537367077438198">"Znajdź na stronie"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# odpowiednik}few{# z {total}}many{# z {total}}other{# z {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Gotowe"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Kasuję dane z pamięci współdzielonej…"</string>
<string name="share" msgid="4157615043345227321">"Udostępnij"</string>
@@ -1930,6 +1939,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Włącz"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacja jest niedostępna"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> jest obecnie niedostępna."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – brak dostępu"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"W tej chwili nie można z tego skorzystać na urządzeniu <xliff:g id="DEVICE">%1$s</xliff:g>. Użyj urządzenia z Androidem TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"W tej chwili nie można z tego skorzystać na urządzeniu <xliff:g id="DEVICE">%1$s</xliff:g>. Użyj tabletu."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"W tej chwili nie można z tego skorzystać na urządzeniu <xliff:g id="DEVICE">%1$s</xliff:g>. Użyj telefonu."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ta aplikacja jest na starszą wersję Androida i może nie działać prawidłowo. Sprawdź dostępność aktualizacji lub skontaktuj się z programistą."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Sprawdź dostępność aktualizacji"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Masz nowe wiadomości"</string>
@@ -2019,16 +2032,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODINSTALUJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OTWÓRZ MIMO TO"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Wykryto szkodliwą aplikację"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Prośba o dostęp do dziennika systemowego"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Tylko tym razem"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nie zezwalaj"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Aplikacja <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> prosi o dzienniki systemowe do funkcjonalnego debugowania. Te dzienniki mogą zawierać informacje zapisane Twoim urządzeniu przez aplikacje i usługi."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Nie pokazuj ponownie"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikacja <xliff:g id="APP_0">%1$s</xliff:g> chce pokazywać wycinki z aplikacji <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edytuj"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Wibracje przy połączeniach i powiadomieniach"</string>
@@ -2091,22 +2099,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Okno opcji zasilania"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran blokady"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Zrzut ekranu"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Punkt zaczepienia zestawu słuchawkowego"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranowy skrót ułatwień dostępu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Wybierz ekranowy skrót ułatwień dostępu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Skrót ułatwień dostępu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Zamknij obszar powiadomień"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad – w górę"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad – w dół"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad – w lewo"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad – w prawo"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – środek"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Pasek napisów w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Umieszczono pakiet <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> w zasobniku danych RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2129,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Kliknij, aby włączyć"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Brak aplikacji służbowych"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Brak aplikacji osobistych"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Otworzyć aplikację <xliff:g id="APP">%s</xliff:g> w profilu osobistym?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Otworzyć aplikację <xliff:g id="APP">%s</xliff:g> w profilu służbowym?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Użyj przeglądarki osobistej"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Użyj przeglądarki służbowej"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kod PIN do karty SIM odblokowujący sieć"</string>
@@ -2265,4 +2265,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> działa w tle i zużywa baterię. Kliknij, aby sprawdzić."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> długo działa w tle. Kliknij, aby sprawdzić."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Sprawdź aktywne aplikacje"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index f867ea9..fd01b22 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Insira seu bloqueio de tela para continuar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Impressão digital parcial detectada"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Não foi possível processar a impressão digital. Tente novamente."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpe o sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mantenha o dedo por mais tempo"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"O movimento do dedo está muito lento. Tente novamente."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Use outra impressão digital"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Claro demais"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Mude a posição do dedo ligeiramente a cada momento"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Impressão digital autenticada"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Rosto autenticado"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Rosto autenticado, pressione \"Confirmar\""</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Pular"</string>
<string name="no_matches" msgid="6472699895759164599">"Não encontrado"</string>
<string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# corresponde a }one{# de {total}}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Limpando armazenamento compartilhado…"</string>
<string name="share" msgid="4157615043345227321">"Compartilhar"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Ativar"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"O app não está disponível"</string>
<string name="app_blocked_message" msgid="542972921087873023">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não está disponível no momento."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponível"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"No momento, não é possível acessar esse app pelo <xliff:g id="DEVICE">%1$s</xliff:g>. Tente pelo dispositivo Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"No momento, não é possível acessar esse app pelo <xliff:g id="DEVICE">%1$s</xliff:g>. Tente pelo seu tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"No momento, não é possível acessar esse app pelo <xliff:g id="DEVICE">%1$s</xliff:g>. Tente pelo seu smartphone."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Este app foi criado para uma versão mais antiga do Android e pode não funcionar corretamente. Tente verificar se há atualizações ou entre em contato com o desenvolvedor."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Procurar atualizações"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Você tem mensagens novas"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"App nocivo detectado"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Solicitação de acesso ao registro do sistema"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Apenas esta vez"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Não permitir"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"O app <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> solicita registros do sistema para fazer uma depuração funcional. Esses registros podem conter informações que apps e serviços do dispositivo escreveram."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Não mostrar novamente"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chamadas e notificações farão o dispositivo vibrar"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Gancho do fone de ouvido"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Seletor de atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dispensar aba de notificações"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Botão direcional: para cima"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Botão direcional: para baixo"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toque para ativar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nenhum app de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nenhum app pessoal"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil pessoal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil de trabalho?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar o navegador pessoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar o navegador de trabalho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para desbloqueio da rede do chip"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano e drenando a energia da bateria. Toque para revisar."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano faz muito tempo. Toque para revisar."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificar apps ativos"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 13da16e..aa8571b 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Introduza o bloqueio de ecrã para continuar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Impressão digital parcial detetada"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Não foi possível processar a impressão digital. Tente novamente."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpe o sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mantenha o dedo encostado durante mais algum tempo"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Moveu o dedo demasiado lentamente. Tente novamente."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Experimente outra impressão digital"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Está demasiado claro"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Altere a posição do seu dedo ligeiramente de cada vez"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"A impressão digital foi autenticada."</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Rosto autenticado."</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Rosto autenticado. Prima Confirmar."</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ignorar"</string>
<string name="no_matches" msgid="6472699895759164599">"Sem correspondências"</string>
<string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string>
<string name="progress_erasing" msgid="6891435992721028004">"A apagar o armazenamento partilhado…"</string>
<string name="share" msgid="4157615043345227321">"Partilhar"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Ativar"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"A app não está disponível"</string>
<string name="app_blocked_message" msgid="542972921087873023">"De momento, a app <xliff:g id="APP_NAME">%1$s</xliff:g> não está disponível."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponível"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"De momento, não é possível aceder a esta app no seu <xliff:g id="DEVICE">%1$s</xliff:g>. Em alternativa, experimente no dispositivo Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"De momento, não é possível aceder a esta app no seu <xliff:g id="DEVICE">%1$s</xliff:g>. Em alternativa, experimente no tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"De momento, não é possível aceder a esta app no seu <xliff:g id="DEVICE">%1$s</xliff:g>. Em alternativa, experimente no telemóvel."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Esta app foi concebida para uma versão mais antiga do Android e pode não funcionar corretamente. Experimente verificar se existem atualizações ou contacte o programador."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Verificar atualizações"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Tem mensagens novas"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplicação prejudicial detetada"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Pedido de acesso ao registo do sistema"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Apenas desta vez"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Não permitir"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"A app <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> solicita registos do sistema para depuração funcional. Estes registos podem conter informações escritas por apps e serviços no seu dispositivo."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Não mostrar de novo"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"A app <xliff:g id="APP_0">%1$s</xliff:g> pretende mostrar partes da app <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificações vibram."</string>
@@ -2119,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tocar para ativar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Sem apps de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Sem apps pessoais"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Abrir a app <xliff:g id="APP">%s</xliff:g> no seu perfil pessoal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Abrir a app <xliff:g id="APP">%s</xliff:g> no seu perfil de trabalho?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilizar navegador pessoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilizar navegador de trabalho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para desbloqueio de rede do cartão SIM"</string>
@@ -2257,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"A app <xliff:g id="APP">%1$s</xliff:g> está a ser executada em segundo plano e a consumir rapidamente a bateria Toque para analisar."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"A app <xliff:g id="APP">%1$s</xliff:g> está a ser executada em segundo plano há muito tempo. Toque para analisar."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificar apps ativas"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index f867ea9..fd01b22 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Insira seu bloqueio de tela para continuar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Impressão digital parcial detectada"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Não foi possível processar a impressão digital. Tente novamente."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Limpe o sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mantenha o dedo por mais tempo"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"O movimento do dedo está muito lento. Tente novamente."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Use outra impressão digital"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Claro demais"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Mude a posição do dedo ligeiramente a cada momento"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Impressão digital autenticada"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Rosto autenticado"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Rosto autenticado, pressione \"Confirmar\""</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Pular"</string>
<string name="no_matches" msgid="6472699895759164599">"Não encontrado"</string>
<string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# corresponde a }one{# de {total}}other{# de {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Limpando armazenamento compartilhado…"</string>
<string name="share" msgid="4157615043345227321">"Compartilhar"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Ativar"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"O app não está disponível"</string>
<string name="app_blocked_message" msgid="542972921087873023">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não está disponível no momento."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponível"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"No momento, não é possível acessar esse app pelo <xliff:g id="DEVICE">%1$s</xliff:g>. Tente pelo dispositivo Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"No momento, não é possível acessar esse app pelo <xliff:g id="DEVICE">%1$s</xliff:g>. Tente pelo seu tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"No momento, não é possível acessar esse app pelo <xliff:g id="DEVICE">%1$s</xliff:g>. Tente pelo seu smartphone."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Este app foi criado para uma versão mais antiga do Android e pode não funcionar corretamente. Tente verificar se há atualizações ou entre em contato com o desenvolvedor."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Procurar atualizações"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Você tem mensagens novas"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"App nocivo detectado"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Solicitação de acesso ao registro do sistema"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Apenas esta vez"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Não permitir"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"O app <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> solicita registros do sistema para fazer uma depuração funcional. Esses registros podem conter informações que apps e serviços do dispositivo escreveram."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Não mostrar novamente"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chamadas e notificações farão o dispositivo vibrar"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Gancho do fone de ouvido"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Seletor de atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dispensar aba de notificações"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Botão direcional: para cima"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Botão direcional: para baixo"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toque para ativar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nenhum app de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nenhum app pessoal"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil pessoal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil de trabalho?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar o navegador pessoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar o navegador de trabalho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para desbloqueio da rede do chip"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano e drenando a energia da bateria. Toque para revisar."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano faz muito tempo. Toque para revisar."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificar apps ativos"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 9471cb2..fab2656 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -305,10 +305,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"acceseze calendarul"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"trimită și să vadă mesajele SMS"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Fișiere și documente"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"să acceseze fișiere și documente de pe dispozitiv"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzică și alt conținut audio"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"să acceseze fișiere audio de pe dispozitiv"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografii și videoclipuri"</string>
@@ -589,8 +587,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Introduceți blocarea ecranului ca să continuați"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"S-a detectat o amprentă parțială"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Amprenta nu a putut fi procesată. Încercați din nou."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Curățați senzorul"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Țineți degetul apăsat puțin mai mult"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Curățați senzorul de amprentă și încercați din nou"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Curățați senzorul și încercați din nou"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Apăsați ferm pe senzor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Ați mișcat degetul prea lent. Încercați din nou."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Încercați altă amprentă"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Prea luminos"</string>
@@ -598,6 +597,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Schimbați ușor poziția degetului de fiecare dată"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Amprenta nu a fost recunoscută"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Apăsați ferm pe senzor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Amprentă autentificată"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Chip autentificat"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Chip autentificat, apăsați Confirmați"</string>
@@ -1501,7 +1502,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omiteți"</string>
<string name="no_matches" msgid="6472699895759164599">"Nicio potrivire"</string>
<string name="find_on_page" msgid="5400537367077438198">"Găsiți pe pagină"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# potrivire}few{# din {total}}other{# din {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Terminat"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Se șterge spațiul de stocare distribuit..."</string>
<string name="share" msgid="4157615043345227321">"Distribuiți"</string>
@@ -1929,6 +1931,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Activați"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplicația nu este disponibilă"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu este disponibilă momentan."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> nu este disponibilă"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Aplicația nu poate fi accesată pe <xliff:g id="DEVICE">%1$s</xliff:g> momentan. Încercați pe dispozitivul Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Aplicația nu poate fi accesată pe <xliff:g id="DEVICE">%1$s</xliff:g> momentan. Încercați pe tabletă."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Aplicația nu poate fi accesată pe <xliff:g id="DEVICE">%1$s</xliff:g> momentan. Încercați pe telefon."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Această aplicație a fost creată pentru o versiune Android mai veche și este posibil să nu funcționeze corect. Încercați să căutați actualizări sau contactați dezvoltatorul."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Căutați actualizări"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Aveți mesaje noi"</string>
@@ -2018,16 +2024,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEZINSTALAȚI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"Deschideți oricum"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplicație dăunătoare detectată"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Solicitare de acces la jurnale de sistem"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Doar de data aceasta"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nu permiteți"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> solicită jurnale de sistem pentru remedierea erorilor de funcționare. Aceste jurnale pot conține informații scrise de aplicațiile și serviciile de pe dispozitiv."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Nu mai afișa"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vrea să afișeze porțiuni din <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editați"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Apelurile și notificările vor vibra"</string>
@@ -2090,22 +2091,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialog"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ecran de blocare"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captură de ecran"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Hook pentru setul de căști-microfon"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Comandă rapidă de accesibilitate de pe ecran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de comenzi rapide de accesibilitate de pe ecran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Comandă rapidă de accesibilitate"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Închideți fereastra de notificări"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad sus"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad jos"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad stânga"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad dreapta"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centru"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bară cu legenda pentru <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a fost adăugat la grupul RESTRICȚIONATE"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2126,10 +2121,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Atingeți pentru a activa"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nicio aplicație pentru lucru"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nicio aplicație personală"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Deschideți <xliff:g id="APP">%s</xliff:g> în profilul personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Deschideți <xliff:g id="APP">%s</xliff:g> în profilul de serviciu?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Folosiți browserul personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Folosiți browserul de serviciu"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Codul PIN de deblocare SIM privind rețeaua"</string>
@@ -2264,4 +2257,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> rulează în fundal și consumă bateria. Atingeți pentru a examina."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> rulează în fundal mult timp. Atingeți pentru a examina."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificați aplicațiile active"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index aaf2bc9..0ba7cb0 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -590,8 +590,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Чтобы продолжить, разблокируйте экран."</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Отсканирована только часть отпечатка."</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Не удалось распознать отпечаток. Повторите попытку."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Очистите сканер."</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Вы слишком быстро убираете палец со сканера."</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Вы перемещали палец слишком медленно. Повторите попытку."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Попробуйте сохранить отпечаток другого пальца."</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Слишком светло."</string>
@@ -599,6 +603,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Каждый раз немного меняйте положение пальца."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Отпечаток пальца проверен"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Лицо распознано"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Лицо распознано, нажмите кнопку \"Подтвердить\""</string>
@@ -1502,7 +1510,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Пропустить"</string>
<string name="no_matches" msgid="6472699895759164599">"Нет совпадений"</string>
<string name="find_on_page" msgid="5400537367077438198">"Найти на странице"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# совпадение}one{# из {total}}few{# из {total}}many{# из {total}}other{# из {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Очистка единого хранилища…"</string>
<string name="share" msgid="4157615043345227321">"Поделиться"</string>
@@ -1930,6 +1939,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Включить"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Приложение недоступно"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" сейчас недоступно."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"Недоступно: <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Эта функция пока недоступна на устройстве <xliff:g id="DEVICE">%1$s</xliff:g>. Используйте Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Эта функция пока недоступна на устройстве <xliff:g id="DEVICE">%1$s</xliff:g>. Используйте планшет."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Эта функция пока недоступна на устройстве <xliff:g id="DEVICE">%1$s</xliff:g>. Используйте телефон."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Это приложение было создано для более ранней версии Android и может работать со сбоями. Проверьте наличие обновлений или свяжитесь с разработчиком."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Проверить обновления"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Новые сообщения"</string>
@@ -2019,16 +2032,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"УДАЛИТЬ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ОТКРЫТЬ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Обнаружено вредоносное приложение"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Запрос на доступ к системным журналам"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Только в этот раз"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Запретить"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> запрашивает доступ к системным журналам для отладки функций. В этих журналах может содержаться информация, записанная приложениями и сервисами на вашем устройстве."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Больше не показывать"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Приложение \"<xliff:g id="APP_0">%1$s</xliff:g>\" запрашивает разрешение на показ фрагментов приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Изменить"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Для звонков и уведомлений включен вибросигнал."</string>
@@ -2091,22 +2099,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалоговое окно питания"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокированный экран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Повесить гарнитуру"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Действие для быстрого включения"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Выбор действия для быстрого включения"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Быстрое включение"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Скрыть панель уведомлений"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-pad – вверх"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-pad – вниз"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad – влево"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad – вправо"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – по центру"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Строка субтитров в приложении \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Приложение \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" помещено в категорию с ограниченным доступом."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2129,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Нажмите, чтобы включить"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Не поддерживается рабочими приложениями."</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Не поддерживается личными приложениями."</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Открыть приложение \"<xliff:g id="APP">%s</xliff:g>\" в личном профиле?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Открыть приложение \"<xliff:g id="APP">%s</xliff:g>\" в рабочем профиле?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Использовать личный браузер"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Использовать рабочий браузер"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код для разблокировки сети SIM-карты"</string>
@@ -2265,4 +2265,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Приложение \"<xliff:g id="APP">%1$s</xliff:g>\" работает в фоновом режиме и расходует заряд батареи. Нажмите, чтобы узнать подробности."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Приложение \"<xliff:g id="APP">%1$s</xliff:g>\" работает в фоновом режиме уже длительное время. Нажмите, чтобы узнать подробности."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверить активные приложения"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 1404bb0..2c9950c 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ඉදිරියට යාමට ඔබගේ තිර අගුල ඇතුළත් කරන්න"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"අර්ධ ඇඟිලි සලකුණක් අනාවරණය කරන ලදි"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ඇඟිලි සලකුණ පිරිසැකසීමට නොහැකි විය. කරුණාකර නැවත උත්සාහ කරන්න."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"සංවේදකය පිරිසිදු කරන්න"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"තව ටිකක් වැඩිපුර අල්ලාගෙන සිටින්න"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"ඇඟිල්ල වඩා සෙමෙන් ගෙන යන ලදි. කරුණාකර නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"තවත් ඇඟිලි සලකුණක් උත්සාහ කරන්න"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"දීප්තිය වැඩියි"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"එක් එක් අවස්ථාවේ ඔබගේ ඇඟිල්ලේ පිහිටීම මදක් වෙනස් කරන්න"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ඇඟිලි සලකුණ සත්යාපනය කරන ලදී"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"මුහුණ සත්යාපනය කරන ලදී"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"මුහුණ සත්යාපනය කරන ලදී, කරුණාකර තහවුරු කරන්න ඔබන්න"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"මඟ හරින්න"</string>
<string name="no_matches" msgid="6472699895759164599">"ගැලපීම් නැත"</string>
<string name="find_on_page" msgid="5400537367077438198">"පිටුවෙහි සෙවීම"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# තරඟ {total}}one{# {total}}other{# }} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"හරි"</string>
<string name="progress_erasing" msgid="6891435992721028004">"බෙදා ගත් ගබඩාව මකා දමමින්…"</string>
<string name="share" msgid="4157615043345227321">"බෙදාගන්න"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ක්රියාත්මක කරන්න"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"යෙදුම ලබා ගත නොහැකිය"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> මේ දැන් ලබා ගත නොහැකිය."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> නොතිබේ"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"මේ අවස්ථාවේදී මෙයට ඔබගේ <xliff:g id="DEVICE">%1$s</xliff:g> හි ප්රවේශ විය නොහැකිය. ඒ වෙනුවට ඔබගේ Android TV උපාංගයෙහි උත්සාහ කරන්න."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"මේ අවස්ථාවේදී මෙයට ඔබගේ <xliff:g id="DEVICE">%1$s</xliff:g> හි ප්රවේශ විය නොහැකිය. ඒ වෙනුවට ඔබගේ ටැබ්ලටයෙහි උත්සාහ කරන්න."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"මේ අවස්ථාවේදී මෙයට ඔබගේ <xliff:g id="DEVICE">%1$s</xliff:g> හි ප්රවේශ විය නොහැකිය. ඒ වෙනුවට ඔබගේ දුරකථනයෙහි උත්සාහ කරන්න."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"මෙම යෙදුම Android හි පැරණි අනුවාදයක් සඳහා තනා ඇති අතර නිසියාකාරව ක්රියා නොකරනු ඇත. යාවත්කාලීන සඳහා පරික්ෂා කිරීම උත්සාහ කරන්න, නැතහොත් සංවර්ධක අමතන්න."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"යාවත්කාලීන සඳහා පරික්ෂා කරන්න"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"ඔබට නව පණිවිඩ තිබේ"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"අස්ථාපනය කරන්න"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"කෙසේ වුවත් විවෘත කරන්න"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"හානිකර යෙදුමක් අනාවරණය කර ගන්නා ලදී"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"පද්ධති ලොග ප්රවේශ ඉල්ලීම"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"මෙම වතාවේ පමණි"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"ඉඩ නොදෙන්න"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ක්රියාකාරී නිදොස් කිරීම සඳහා පද්ධති ලොග ඉල්ලයි. මෙම ලොගවල ඔබගේ උපාංගයේ යෙදුම් සහ සේවා ලියා ඇති තොරතුරු අඩංගු විය හැකිය."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"නැවත නොපෙන්වන්න"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> හට කොටස් <xliff:g id="APP_2">%2$s</xliff:g>ක් පෙන්වීමට අවශ්යයි"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"සංස්කරණය"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ඇමතුම් සහ දැනුම්දීම් කම්පනය වනු ඇත"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"බල සංවාදය"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"අගුලු තිරය"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"තිර රුව"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"හෙඩ්සෙට් කොක්ක"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"තිරය මත ප්රවේශ්යතා කෙටිමග"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"තිරය මත ප්රවේශ්යතා කෙටිමං තෝරනය"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ප්රවේශ්යතා කෙටිමඟ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"දැනුම්දීම් සෙවන ඉවත ලන්න"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ඉහළ"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad පහළ"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad වම"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad දකුණ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad මැද"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> හි සිරස්තල තීරුව."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> අවහිර කළ බාල්දියට දමා ඇත"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ක්රියාත්මක කිරීමට තට්ටු කරන්න"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"කාර්යාල යෙදුම් නැත"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"පුද්ගලික යෙදුම් නැත"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> ඔබගේ පුද්ගලික පැතිකඩ තුළ විවෘත කරන්නද?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> ඔබගේ කාර්යාල පැතිකඩ තුළ විවෘත කරන්නද?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"පුද්ගලික බ්රව්සරය භාවිත කරන්න"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"කාර්යාල බ්රව්සරය භාවිත කරන්න"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ජාල අගුලු හැරීමේ PIN"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> පසුබිමේ ධාවනය වන අතර බැටරිය බැස යයි. සමාලෝචනය කිරීමට තට්ටු කරන්න."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> දිගු වේලාවක් පසුබිමේ ධාවනය වේ. සමාලෝචනය කිරීමට තට්ටු කරන්න."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"සක්රිය යෙදුම් පරීක්ෂා කරන්න"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index c8d965d..ce70e5f 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -306,10 +306,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"prístup ku kalendáru"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"posielanie a zobrazovanie SMS"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Súbory a dokumenty"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"prístup k súborom a dokumentom vo vašom zariadení"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Hudba a iné zvuky"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"prístup k zvukovým súborom vo vašom zariadení"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotky a videá"</string>
@@ -590,8 +588,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Pokračujte zadaním zámky obrazovky"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Bol rozpoznaný čiastočný odtlačok prsta"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Odtlačok prsta sa nepodarilo spracovať. Skúste to znova."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Vyčistite senzor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Podržte trochu dlhšie"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Vyčistite senzor odtlačkov prstov a skúste to znova"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Vyčistite senzor a skúste to znova"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Pevne pridržte senzor"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Pohli ste prstom príliš pomaly. Skúste to znova."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Vyskúšajte iný odtlačok prsta"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Príliš jasno"</string>
@@ -599,6 +598,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Zakaždým trocha zmeňte pozíciu prsta"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Odtlačok prsta nebol rozpoznaný"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Pevne pridržte senzor"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Odtlačok prsta bol overený"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Tvár bola overená"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Tvár bola overená, stlačte tlačidlo potvrdenia"</string>
@@ -1502,7 +1503,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskočiť"</string>
<string name="no_matches" msgid="6472699895759164599">"Žiadne zhody"</string>
<string name="find_on_page" msgid="5400537367077438198">"Vyhľadať na stránke"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# zhoda }few{# z {total}}many{# z {total}}other{# z {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Hotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Vymazáva sa zdieľané úložisko…"</string>
<string name="share" msgid="4157615043345227321">"Zdieľať"</string>
@@ -1930,6 +1932,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Zapnúť"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikácia nie je dostupná"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> nie je teraz dostupná."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> nie je k dispozícii"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"V zariadení <xliff:g id="DEVICE">%1$s</xliff:g> momentálne nemáte k tomuto obsahu prístup. Skúste namiesto toho použiť zariadenie Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"V zariadení <xliff:g id="DEVICE">%1$s</xliff:g> momentálne nemáte k tomuto obsahu prístup. Skúste namiesto toho použiť tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"V zariadení <xliff:g id="DEVICE">%1$s</xliff:g> momentálne nemáte k tomuto obsahu prístup. Skúste namiesto toho použiť telefón."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Táto aplikácia bola zostavená pre staršiu verziu Androidu a nemusí správne fungovať. Skúste skontrolovať dostupnosť aktualizácií alebo kontaktovať vývojára."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Skontrolovať dostupnosť aktualizácie"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Máte nové správy."</string>
@@ -2019,16 +2025,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODINŠTALOVAŤ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OTVORIŤ AJ TAK"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Bola zistená škodlivá aplikácia"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Žiadosť o prístup k denníku systému"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Iba tentokrát"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nepovoliť"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> žiada o denníky systému na účely funkčného ladenia. Môžu obsahovať informácie zapísané aplikáciami a službami vo vašom zariadení."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Už nezobrazovať"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovať rezy z aplikácie <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Upraviť"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Hovory a upozornenia budú vibrovať"</string>
@@ -2091,22 +2092,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialógové okno napájania"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Uzamknúť obrazovku"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímka obrazovky"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Hák na slúchadlá s mikrofónom"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Skratka dostupnosti na obrazovke"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Výber skratky dostupnosti na obrazovke"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Skratka dostupnosti"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Zavrieť panel upozornení"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Stlačiť tlačidlo nahor krížového ovládača"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Stlačiť tlačidlo nadol krížového ovládača"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Stlačiť tlačidlo doľava krížového ovládača"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Stlačiť tlačidlo doprava krížového ovládača"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Stlačiť stredné tlačidlo krížového ovládača"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popis aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balík <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> bol vložený do kontajnera OBMEDZENÉ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2122,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Zapnúť klepnutím"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Žiadne pracovné aplikácie"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Žiadne osobné aplikácie"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v osobnom profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v pracovnom profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Použiť osobný prehliadač"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Použiť pracovný prehliadač"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN na odomknutie siete pre SIM kartu"</string>
@@ -2265,4 +2258,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikácie <xliff:g id="APP">%1$s</xliff:g> je spustená na pozadí a vybíja batériu. Skontrolujte to klepnutím."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikácia <xliff:g id="APP">%1$s</xliff:g> je dlhodobo spustená na pozadí. Skontrolujte to klepnutím."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Skontrolovať aktívne aplikácie"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 9a3a7f1..e23cf85 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -306,10 +306,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"dostop do koledarja"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"pošiljanje in ogled sporočil SMS"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Datoteke in dokumenti"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"dostop do datotek in dokumentov v napravi"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Glasba in drugi zvočni posnetki"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"dostop do zvočnih datotek v napravi"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografije in videoposnetki"</string>
@@ -590,8 +588,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Odklenite zaslon, če želite nadaljevati."</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Zaznan je delni prstni odtis."</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Prstnega odtisa ni bilo mogoče obdelati. Poskusite znova."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Očistite tipalo."</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Pridržite malo dlje."</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Očistite tipalo prstnih odtisov in poskusite znova."</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Očistite tipalo in poskusite znova."</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Prst dobro pridržite na tipalu."</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Prepočasen premik prsta. Poskusite znova."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Poskusite z drugim prstnim odtisom."</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Presvetlo je."</string>
@@ -599,6 +598,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Vsakič nekoliko spremenite položaj prsta."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Prstni odtis ni prepoznan."</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Prst dobro pridržite na tipalu."</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Pristnost prstnega odtisa je preverjena"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Pristnost obraza je potrjena"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Pristnost obraza je preverjena. Pritisnite gumb »Potrdi«."</string>
@@ -1502,7 +1503,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Ni ujemanj"</string>
<string name="find_on_page" msgid="5400537367077438198">"Najdi na strani"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ujemanje}one{# od {total}}two{# od {total}}few{# od {total}}other{# od {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Končano"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Brisanje skupne shrambe …"</string>
<string name="share" msgid="4157615043345227321">"Deli"</string>
@@ -1930,6 +1932,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Vklopi"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija ni na voljo"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno ni na voljo."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"»<xliff:g id="ACTIVITY">%1$s</xliff:g>« ni na voljo"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"V napravi <xliff:g id="DEVICE">%1$s</xliff:g> trenutno ni mogoče dostopati do te vsebine. Poskusite z napravo Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"V napravi <xliff:g id="DEVICE">%1$s</xliff:g> trenutno ni mogoče dostopati do te vsebine. Poskusite s tabličnim računalnikom."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"V napravi <xliff:g id="DEVICE">%1$s</xliff:g> trenutno ni mogoče dostopati do te vsebine. Poskusite s telefonom."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ta aplikacija je bila zasnovana za starejšo različico Androida in morda ne bo delovala pravilno. Preverite, ali so na voljo posodobitve, ali pa se obrnite na razvijalca."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Preveri, ali je na voljo posodobitev"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Imate nova sporočila."</string>
@@ -2019,16 +2025,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODMESTI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VSEENO ODPRI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zaznana je bila škodljiva aplikacija"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Zahteva za dostop do sistemskega dnevnika"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Samo tokrat"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ne dovoli"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> zahteva sistemske dnevnike za funkcionalno odpravljanje napak. Ti dnevniki lahko vsebujejo podatke, ki so jih zapisale aplikacije in storitve v vaši napravi."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne prikaži več"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati izreze aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Uredi"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibriranje bo vklopljeno za klice in obvestila"</string>
@@ -2121,10 +2122,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dotaknite se za vklop"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nobena delovna aplikacija ni na voljo"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nobena osebna aplikacija"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Želite aplikacijo <xliff:g id="APP">%s</xliff:g> odpreti v osebnem profilu?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Želite aplikacijo <xliff:g id="APP">%s</xliff:g> odpreti v delovnem profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Uporabi osebni brskalnik"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Uporabi delovni brskalnik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Koda PIN za odklepanje omrežja kartice SIM"</string>
@@ -2259,4 +2258,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> se izvaja v ozadju in porablja energijo baterije. Dotaknite se za pregled."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> se dolgo časa izvaja v ozadju. Dotaknite se za pregled."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Preverite aktivne aplikacije"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 855e93a..ec07f41 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Fut kyçjen e ekranit për të vazhduar"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"U zbulua gjurmë gishti e pjesshme"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Gjurma e gishtit nuk mund të përpunohej. Provo përsëri."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Pastro sensorin"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Mbaje dhe pak"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Gishti lëvizi shumë ngadalë. Provo përsëri."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Provo një gjurmë gishti tjetër"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Me shumë ndriçim"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Ndrysho pak pozicionin e gishtit çdo herë"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Gjurma e gishtit u vërtetua"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Fytyra u vërtetua"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Fytyra u vërtetua, shtyp \"Konfirmo\""</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Kapërce"</string>
<string name="no_matches" msgid="6472699895759164599">"Asnjë përputhje"</string>
<string name="find_on_page" msgid="5400537367077438198">"Gjej brenda faqes"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# përputhje}other{# nga {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"U krye"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Po fshin hapësirën ruajtëse të brendshme…"</string>
<string name="share" msgid="4157615043345227321">"Shpërndaj"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aktivizo"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacioni nuk ofrohet"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk ofrohet për momentin."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> nuk ofrohet"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Qasja është e pamundur në <xliff:g id="DEVICE">%1$s</xliff:g> për momentin. Provoje në pajisjen Android TV më mirë."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Qasja është e pamundur në <xliff:g id="DEVICE">%1$s</xliff:g> për momentin. Provoje në tablet më mirë."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Qasja është e pamundur në <xliff:g id="DEVICE">%1$s</xliff:g> për momentin. Provoje në telefon më mirë."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ky aplikacion është ndërtuar për një version më të vjetër të Android dhe mund të mos funksionojë mirë. Provo të kontrollosh për përditësime ose kontakto me zhvilluesin."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Kontrollo për përditësim"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Ke mesazhe të reja"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ÇINSTALO"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"HAPE GJITHSESI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"U gjet aplikacion i dëmshëm"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Kërkesë për qasje te evidenca e sistemit"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Vetëm këtë herë"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Mos lejo"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> kërkon evidenca të sistemit për korrigjim funksional. Këto evidenca mund të përmbajnë informacione që kanë shkruar aplikacionet dhe shërbimet në pajisjen tënde."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Mos e shfaq më"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> dëshiron të shfaqë pjesë të <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Modifiko"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Do të lëshojë dridhje për telefonatat dhe njoftimet"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogu i energjisë"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekrani i kyçjes"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Pamja e ekranit"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Grepi i kufjeve me mikrofon"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Shkurtorja e qasshmërisë në ekran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Zgjedhësi i shkurtores së qasshmërisë në ekran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Shkurtorja e qasshmërisë"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Hiq \"Strehën e njoftimeve\""</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Lart në bllokun e drejtimit"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Poshtë në bllokun e drejtimit"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Majtas në bllokun e drejtimit"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Djathtas në bllokun e drejtimit"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Qendra e bllokut të drejtimit"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Shiriti i nëntitullit të <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> është vendosur në grupin E KUFIZUAR"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Trokit për ta aktivizuar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nuk ka aplikacione pune"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nuk ka aplikacione personale"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Të hapet <xliff:g id="APP">%s</xliff:g> në profilin tënd personal?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Të hapet <xliff:g id="APP">%s</xliff:g> në profilin tënd të punës?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Përdor shfletuesin personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Përdor shfletuesin e punës"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kodi PIN i shkyçjes së rrjetit të kartës SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> po ekzekutohet në sfond dhe po shkarkon baterinë. Trokit për ta shqyrtuar."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> po ekzekutohet në sfond për një kohe të gjatë. Trokit për ta shqyrtuar."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Kontrollo aplikacionet aktive"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 527ead8..caac95b 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -77,7 +77,7 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"ИД позиваоца подразумевано није ограничен. Следећи позив: Није ограничен."</string>
<string name="serviceNotProvisioned" msgid="8289333510236766193">"Услуга није добављена."</string>
<string name="CLIRPermanent" msgid="166443681876381118">"Не можете да промените подешавање ИД-а корисника."</string>
- <string name="RestrictedOnDataTitle" msgid="1500576417268169774">"Нема услуге преноса података преко мобилног оператера"</string>
+ <string name="RestrictedOnDataTitle" msgid="1500576417268169774">"Нема услуге мобилних података"</string>
<string name="RestrictedOnEmergencyTitle" msgid="2852916906106191866">"Хитни позиви нису доступни"</string>
<string name="RestrictedOnNormalTitle" msgid="7009474589746551737">"Нема гласовне услуге"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="3982069078579103087">"Нема гласовне услуге ни хитних позива"</string>
@@ -589,8 +589,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Употребите закључавање екрана да бисте наставили"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Откривен је делимичан отисак прста"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Није успела обрада отиска прста. Пробајте поново."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Обришите сензор"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Задржите мало дуже"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Превише споро сте померили прст. Пробајте поново."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Пробајте са другим отиском прста"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Превише је светло"</string>
@@ -598,6 +602,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Сваки пут лагано промените положај прста"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Отисак прста је потврђен"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Лице је потврђено"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Лице је потврђено. Притисните Потврди"</string>
@@ -1501,7 +1509,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Прескочи"</string>
<string name="no_matches" msgid="6472699895759164599">"Нема подударања"</string>
<string name="find_on_page" msgid="5400537367077438198">"Пронађи на страници"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# подударање}one{# од {total}}few{# од {total}}other{# of {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Брише се дељени меморијски простор…"</string>
<string name="share" msgid="4157615043345227321">"Дели"</string>
@@ -1929,6 +1938,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Укључи"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Апликација није доступна"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> тренутно није доступна."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – није доступно"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Овој апликацији тренутно не може да се приступи са уређаја <xliff:g id="DEVICE">%1$s</xliff:g>. Пробајте на Android TV уређају."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Овој апликацији тренутно не може да се приступи са уређаја <xliff:g id="DEVICE">%1$s</xliff:g>. Пробајте на таблету."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Овој апликацији тренутно не може да се приступи са уређаја <xliff:g id="DEVICE">%1$s</xliff:g>. Пробајте на телефону."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ова апликација је направљена за старију верзију Android-а, па можда неће радити исправно. Потражите ажурирања или контактирајте програмера."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Потражи ажурирање"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Имате нове поруке"</string>
@@ -2018,16 +2031,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ДЕИНСТАЛИРАЈ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ИПАК ОТВОРИ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Откривена је штетна апликација"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Захтев за приступ системској евиденцији"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Само овај пут"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Не дозволи"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> захтева евиденције система ради отклањања грешака у функцијама. Те евиденције могу да садрже информације које су апликације и услуге на уређају записале."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Не приказуј поново"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Апликација <xliff:g id="APP_0">%1$s</xliff:g> жели да приказује исечке из апликације <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Измени"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Вибрација за позиве и обавештења је укључена"</string>
@@ -2090,22 +2098,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог напајања"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Закључани екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Снимак екрана"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Кука за слушалице"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Пречица за приступачност на екрану"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Алатка за бирање пречица за приступачност на екрану"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Пречица за приступачност"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Одбаци траку са обавештењима"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"нагоре на D-pad-у"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"надоле на D-pad-у"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"налево на D-pad-у"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"надесно на D-pad-у"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"центар на D-pad-у"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Трака са насловима апликације <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> је додат у сегмент ОГРАНИЧЕНО"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2126,10 +2128,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Додирните да бисте укључили"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Нема пословних апликација"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Нема личних апликација"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Желите да на личном профилу отворите: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Желите да на пословном профилу отворите: <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Користи лични прегледач"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Користи пословни прегледач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN за откључавање SIM мреже"</string>
@@ -2264,4 +2264,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута у позадини и троши батерију. Додирните да бисте прегледали."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Апликација <xliff:g id="APP">%1$s</xliff:g> је предуго покренута у позадини. Додирните да бисте прегледали."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверите активне апликације"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 0e46502..4adcc47 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Fortsätt med hjälp av ditt skärmlås"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Ofullständigt fingeravtryck upptäcktes"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Det gick inte att bearbeta fingeravtrycket. Försök igen."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Rengör sensorn"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Håll kvar fingret lite längre"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Du rörde fingret för långsamt. Försök igen."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Testa ett annat fingeravtryck"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Det är för ljust"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Flytta fingret lite varje gång"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Fingeravtrycket har autentiserats"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Ansiktet har autentiserats"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Ansiktet har autentiserats. Tryck på Bekräfta"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Hoppa över"</string>
<string name="no_matches" msgid="6472699895759164599">"Inga träffar"</string>
<string name="find_on_page" msgid="5400537367077438198">"Sök på sidan"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# matchning}other{# av {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Klar"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Delat lagringsutrymme rensas …"</string>
<string name="share" msgid="4157615043345227321">"Dela"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aktivera"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Appen är inte tillgänglig"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> är inte tillgängligt just nu."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> är inte tillgänglig"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Det går inte att streama detta till <xliff:g id="DEVICE">%1$s</xliff:g> för närvarande. Testa med Android TV-enheten i stället."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Det går inte att streama detta till <xliff:g id="DEVICE">%1$s</xliff:g> för närvarande. Testa med surfplattan i stället."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Det går inte att streama detta till <xliff:g id="DEVICE">%1$s</xliff:g> för närvarande. Testa med telefonen i stället."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Appen har utvecklats för en äldre version av Android och kanske inte fungerar som den ska. Testa att söka efter uppdateringar eller kontakta utvecklaren."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Sök efter uppdateringar"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Du har nya meddelanden"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"AVINSTALLERA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ÖPPNA ÄNDÅ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"En skadlig app har upptäckts"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Begäran om åtkomst till systemloggar"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Bara den här gången"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Tillåt inte"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> begär systemloggar i syfte att felsöka funktioner. Dessa loggar kan innehålla information som har skrivits på enheten av appar och tjänster."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Visa inte igen"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vill kunna visa bitar av <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Redigera"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibrerar vid samtal och aviseringar"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogruta för ström"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låsskärm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skärmbild"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Krok till headset"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Tillgänglighetsgenväg på skärmen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Valfunktion för tillgänglighetsgenväg på skärmen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Aktivera tillgänglighet snabbt"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Stäng meddelandepanelen"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Styrkors, upp"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Styrkors, ned"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Styrkors, vänster"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Styrkors, höger"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Styrkors, mitten"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Textningsfält för <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> har placerats i hinken RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tryck för att aktivera"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Inga jobbappar"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Inga privata appar"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Vill du öppna <xliff:g id="APP">%s</xliff:g> i din privata profil?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Vill du öppna <xliff:g id="APP">%s</xliff:g> i din jobbprofil?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Använd privat webbläsare"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Använd jobbwebbläsare"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Pinkod för upplåsning av nätverk för SIM-kort"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> körs i bakgrunden så att batteriet tar slut fortare. Tryck för att granska."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> har körts i bakgrunden under lång tid. Tryck för att granska."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Kontrollera aktiva appar"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index dcbb1ac..02572b0 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Weka mbinu yako ya kufunga skrini ili uendelee"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Kimetambua sehemu ya alama ya kidole"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Imeshindwa kuchakata alama ya kidole. Tafadhali jaribu tena."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Safisha kitambuzi cha alama ya kidole"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Endelea kushikilia kwa muda zaidi"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Kidole kilisogezwa polepole zaidi. Tafadhali jaribu tena."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Jaribu alama nyingine ya kidole"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Inang\'aa mno"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Badilisha mkao wa kidole chako kiasi kila wakati"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Imethibitisha alama ya kidole"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Uso umethibitishwa"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Uso umethibitishwa, tafadhali bonyeza thibitisha"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ruka"</string>
<string name="no_matches" msgid="6472699895759164599">"Hakuna vinavyolingana"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pata kwenye ukurasa"</string>
- <string name="matches_found" msgid="7912910457231705587">"Mechi{count,plural, =1{#}other{# kati ya {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Nimemaliza"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Inafuta hifadhi iliyoshirikiwa…"</string>
<string name="share" msgid="4157615043345227321">"Shiriki"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Washa"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Programu haipatikani"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> haipatikani hivi sasa."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> haipatikani"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Programu hii haiwezi kufikiwa kwenye <xliff:g id="DEVICE">%1$s</xliff:g> kwa muda huu. Badala yake jaribu kwenye kifaa chako cha Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Programu hii haiwezi kufikiwa kwenye <xliff:g id="DEVICE">%1$s</xliff:g> kwa muda huu. Badala yake jaribu kwenye kompyuta kibao yako."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Programu hii haiwezi kufikiwa kwenye <xliff:g id="DEVICE">%1$s</xliff:g> kwa muda huu. Badala yake jaribu kwenye simu yako."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Programu hii iliundwa kwa ajili ya toleo la zamani la Android na huenda isifanye kazi vizuri. Jaribu kuangalia masasisho au uwasiliane na msanidi programu."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Angalia masasisho"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Una ujumbe mpya"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ONDOA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"FUNGUA TU"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Imetambua programu hatari"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Ombi la ufikiaji wa kumbukumbu ya mfumo"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Mara hii pekee"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Usiruhusu"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> huomba kumbukumbu za mfumo ili kutatua hitilafu za utendaji kazi. Kumbukumbu hizi zinaweza kuwa na maelezo ambayo programu na huduma ziliandika kwenye kifaa chako."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Usionyeshe tena"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> inataka kuonyesha vipengee <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Badilisha"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Itatetema arifa ikitumwa au simu ikipigwa"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kidirisha cha Nishati"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrini Iliyofungwa"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Picha ya skrini"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kishika vifaa vya sauti"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Njia ya Mkato ya Ufikivu kwenye Skrini"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Kichagua Njia ya Mkato ya Ufikivu kwenye Skrini"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Njia ya Mkato ya Ufikivu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ondoa Sehemu ya Arifa"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Kitufe cha juu cha Dpad"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Kitufe cha chini cha Dpad"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Kitufe cha kushoto cha Dpad"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Kitufe cha kulia cha Dpad"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Kitufe cha katikati cha Dpad"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Upau wa manukuu wa <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> kimewekwa katika kikundi KILICHODHIBITIWA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Gusa ili uwashe"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Hakuna programu za kazini"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Hakuna programu za binafsi"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Je, unataka kufungua <xliff:g id="APP">%s</xliff:g> katika wasifu wako binafsi?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Je, unataka kufungua <xliff:g id="APP">%s</xliff:g> katika wasifu wako wa kazi?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Tumia kivinjari cha binafsi"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Tumia kivinjari cha kazini"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ya kufungua mtandao wa SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> inatumika chinichini na kumaliza nishati ya betri. Gusa ili ukague."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> inatumika chinichini kwa muda mrefu. Gusa ili ukague."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Angalia programu zinazotumika"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 7a46d45..9acbac6 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"கேலெண்டரை அணுகலாம்"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ஃபைல்கள் & ஆவணங்கள்"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"சாதனத்திலுள்ள ஃபைல்களையும் ஆவணங்களையும் அணுகும்"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"இசை & பிற ஆடியோ"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"உங்கள் சாதனத்திலுள்ள ஆடியோ ஃபைல்களை அணுகும்"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"படங்கள் & வீடியோக்கள்"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"தொடர்வதற்கு உங்கள் திரைப் பூட்டை உள்ளிடுங்கள்"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"பகுதியளவு கைரேகை கண்டறியப்பட்டது"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"கைரேகையைச் செயலாக்க முடியவில்லை. மீண்டும் முயலவும்."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"சென்சாரைச் சுத்தம் செய்யவும்"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"இன்னும் சிறிது நேரம் விரலை வைத்திருங்கள்"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"கைரேகை சென்சாரைச் சுத்தம் செய்துவிட்டு மீண்டும் முயலவும்"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"சென்சாரைச் சுத்தம் செய்துவிட்டு மீண்டும் முயலவும்"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"சென்சாரின் மீது நன்றாக அழுத்தவும்"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"விரலை மிகவும் மெதுவாக நகர்த்திவிட்டீர்கள். மீண்டும் முயற்சிக்கவும்."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"வேறு கைரேகையை முயலவும்"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"அதிக வெளிச்சமாக உள்ளது"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ஒவ்வொரு முறையும் விரலின் நிலையைச் சிறிதளவு மாற்றுங்கள்"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"கைரேகை அங்கீகரிக்கப்படவில்லை"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"சென்சாரின் மீது நன்றாக அழுத்தவும்"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"கைரேகை அங்கீகரிக்கப்பட்டது"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"முகம் அங்கீகரிக்கப்பட்டது"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"முகம் அங்கீகரிக்கப்பட்டது. ’உறுதிப்படுத்துக’ என்பதை அழுத்துக"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"தவிர்"</string>
<string name="no_matches" msgid="6472699895759164599">"பொருத்தம் ஏதுமில்லை"</string>
<string name="find_on_page" msgid="5400537367077438198">"பக்கத்தில் கண்டறி"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# / {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"முடிந்தது"</string>
<string name="progress_erasing" msgid="6891435992721028004">"பகிர்ந்த சேமிப்பகத்தை அழிக்கிறது…"</string>
<string name="share" msgid="4157615043345227321">"பகிர்"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"இயக்கு"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"இந்த ஆப்ஸ் இப்போது கிடைப்பதில்லை"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் இப்போது கிடைப்பதில்லை."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> இல்லை"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"தற்போது உங்கள் <xliff:g id="DEVICE">%1$s</xliff:g> சாதனத்தில் இதை அணுக முடியாது. அதற்குப் பதிலாக Android TV சாதனத்தில் பயன்படுத்திப் பாருங்கள்."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"தற்போது உங்கள் <xliff:g id="DEVICE">%1$s</xliff:g> சாதனத்தில் இதை அணுக முடியாது. அதற்குப் பதிலாக உங்கள் டேப்லெட்டில் பயன்படுத்திப் பாருங்கள்."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"தற்போது உங்கள் <xliff:g id="DEVICE">%1$s</xliff:g> சாதனத்தில் இதை அணுக முடியாது. அதற்குப் பதிலாக உங்கள் மொபைலில் பயன்படுத்திப் பாருங்கள்."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"இந்த ஆப்ஸ் Android இன் பழைய பதிப்புக்காக உருவாக்கப்பட்டதால், சரியாக வேலை செய்யாமல் போகலாம். புதுப்பிப்புகள் ஏதேனும் உள்ளதா எனப் பார்க்கவும் அல்லது டெவெலப்பரைத் தொடர்புகொள்ளவும்."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"புதுப்பிப்பு உள்ளதா எனப் பார்"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"புதிய செய்திகள் வந்துள்ளன"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"நிறுவல் நீக்கு"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"பரவாயில்லை, திற"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"தீங்கிழைக்கும் ஆப்ஸ் உள்ளது"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"சிஸ்டம் பதிவை அணுகுவதற்கான கோரிக்கை"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"இப்போது மட்டும்"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"அனுமதிக்க வேண்டாம்"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"பிழைதிருத்தச் செயல்பாட்டிற்கான சிஸ்டம் பதிவுகளை <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ஆப்ஸ் கோருகிறது. இந்தப் பதிவுகள் உங்கள் சாதனத்தில் ஆப்ஸ் மற்றும் சேவைகளில் உள்ள எழுத்துப்பூர்வமான தகவல்களைக் கொண்டிருக்கக்கூடும்."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"மீண்டும் காட்டாதே"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> ஆப்ஸின் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP_0">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"திருத்து"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு அதிரும்"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ஆன் செய்யத் தட்டுக"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"பணி ஆப்ஸ் எதுவுமில்லை"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"தனிப்பட்ட ஆப்ஸ் எதுவுமில்லை"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"உங்கள் தனிப்பட்ட கணக்கில் <xliff:g id="APP">%s</xliff:g> ஆப்ஸைத் திறக்கவா?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"உங்கள் பணிக் கணக்கில் <xliff:g id="APP">%s</xliff:g> ஆப்ஸைத் திறக்கவா?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"தனிப்பட்ட உலாவியைப் பயன்படுத்து"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"பணி உலாவியைப் பயன்படுத்து"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"சிம் நெட்வொர்க் அன்லாக் பின்"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ் பின்னணியில் இயங்குவதுடன் பேட்டரியை அதிகமாகப் பயன்படுத்துகிறது. பார்க்க தட்டவும்."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ் நீண்ட நேரமாகப் பின்னணியில் இயங்குகிறது. பார்க்க தட்டவும்."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"செயலிலுள்ள ஆப்ஸைப் பாருங்கள்"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 39f36ed..6e4ef59 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"మీ క్యాలెండర్ను యాక్సెస్ చేయడానికి"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS మెసేజ్లను పంపడం, వీక్షించడం"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"ఫైల్స్ & డాక్యుమెంట్లు"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"మీ పరికరంలోని ఫైల్లు, డాక్యుమెంట్లను యాక్సెస్ చేయండి"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"మ్యూజిక్ & ఇతర ఆడియో"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"మీ పరికరంలోని ఆడియో ఫైల్లను యాక్సెస్ చేయండి"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ఫోటోలు & వీడియోలు"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"కొనసాగించడానికి మీ స్క్రీన్ లాక్ను ఎంటర్ చేయండి"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"పాక్షిక వేలిముద్ర గుర్తించబడింది"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"వేలిముద్రను ప్రాసెస్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"సెన్సార్ను శుభ్రం చేయండి"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"కొంచెం ఎక్కువసేపు పట్టుకోండి"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"వేలిముద్ర సెన్సార్ను క్లీన్ చేసి, మళ్లీ ట్రై చేయండి"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"సెన్సార్ను క్లీన్ చేసి, మళ్లీ ట్రై చేయండి"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"సెన్సార్ మీద గట్టిగా నొక్కండి"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"వేలిని చాలా నెమ్మదిగా కదిలించారు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"మరొక వేలిముద్రను ట్రై చేయండి"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"వెలుతురు అధికంగా ఉంది"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ప్రతిసారీ మీ వేళ్ల స్థానాన్ని కొద్దిగా మార్చండి"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"వేలిముద్ర గుర్తించబడలేదు"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"సెన్సార్ మీద గట్టిగా నొక్కండి"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"వేలిముద్ర ప్రమాణీకరించబడింది"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ముఖం ప్రమాణీకరించబడింది"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ముఖం ప్రమాణీకరించబడింది, దయచేసి ధృవీకరించును నొక్కండి"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"దాటవేయి"</string>
<string name="no_matches" msgid="6472699895759164599">"సరిపోలికలు లేవు"</string>
<string name="find_on_page" msgid="5400537367077438198">"పేజీలో కనుగొనండి"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# {total}లో #}other{ మ్యాచ్ }} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"పూర్తయింది"</string>
<string name="progress_erasing" msgid="6891435992721028004">"షేర్ చేసిన నిల్వను తొలగిస్తోంది…"</string>
<string name="share" msgid="4157615043345227321">"షేర్"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"ఆన్ చేయి"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"యాప్ అందుబాటులో లేదు"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ప్రస్తుతం అందుబాటులో లేదు."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> అందుబాటులో లేదు"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"ఈ సమయంలో మీ <xliff:g id="DEVICE">%1$s</xliff:g>లో దీన్ని యాక్సెస్ చేయడం సాధ్యపడదు. బదులుగా మీ Android TV పరికరంలో ట్రై చేయండి."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"ఈ సమయంలో మీ <xliff:g id="DEVICE">%1$s</xliff:g>లో దీన్ని యాక్సెస్ చేయడం సాధ్యపడదు. బదులుగా మీ టాబ్లెట్లో ట్రై చేయండి."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"ఈ సమయంలో మీ <xliff:g id="DEVICE">%1$s</xliff:g>లో దీన్ని యాక్సెస్ చేయడం సాధ్యపడదు. బదులుగా మీ ఫోన్లో ట్రై చేయండి."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"ఈ యాప్ పాత వెర్షన్ Android కోసం రూపొందించబడింది మరియు అది సరిగ్గా పని చేయకపోవచ్చు. అప్డేట్ల కోసం తనిఖీ చేయడానికి ప్రయత్నించండి లేదా డెవలపర్ని సంప్రదించండి."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"అప్డేట్ కోసం తనిఖీ చేయండి"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"మీకు కొత్త మెసేజ్లు ఉన్నాయి"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"అన్ఇన్స్టాల్ చేయండి"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ఏదేమైనా తెరువు"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"హానికరమైన యాప్ గుర్తించబడింది"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"సిస్టమ్ లాగ్ యాక్సెస్ రిక్వెస్ట్"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"ఈ ఒక్కసారి మాత్రమే"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"అనుమతించవద్దు"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"ఫంక్షనల్ డీబగ్గింగ్ కోసం, <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> సిస్టమ్ లాగ్లను రిక్వెస్ట్ చేస్తుంది. ఈ లాగ్లు, మీ పరికరంలోని యాప్లు, సర్వీస్లు రాసిన సమాచారాన్ని కలిగి ఉండవచ్చు."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"మళ్లీ చూపవద్దు"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> స్లైస్లను చూపించాలనుకుంటోంది"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ఎడిట్ చేయండి"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"కాల్స్ మరియు నోటిఫికేషన్లు వైబ్రేట్ అవుతాయి"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ఆన్ చేయడానికి ట్యాప్ చేయి"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"వర్క్ యాప్లు లేవు"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"వ్యక్తిగత యాప్లు లేవు"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g>ను మీ వ్యక్తిగత ప్రొఫైల్లో తెరవాలా?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g>ను మీ వర్క్ ప్రొఫైల్లో తెరవాలా?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"వ్యక్తిగత బ్రౌజర్ను ఉపయోగించు"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"వర్క్ బ్రౌజర్ను ఉపయోగించు"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM నెట్వర్క్ అన్లాక్ పిన్"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> బ్యాక్గ్రౌండ్లో రన్ అవుతోంది, బ్యాటరీని ఎక్కువగా వాడుతోంది. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> చాలా సమయం నుండి బ్యాక్గ్రౌండ్లో రన్ అవుతోంది. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"యాక్టివ్గా ఉన్న యాప్లను చెక్ చేయండి"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-television/config.xml b/core/res/res/values-television/config.xml
index 92bea34..0db08fb 100644
--- a/core/res/res/values-television/config.xml
+++ b/core/res/res/values-television/config.xml
@@ -37,6 +37,18 @@
Currently, this maps to Gravity.BOTTOM | Gravity.RIGHT -->
<integer name="config_defaultPictureInPictureGravity">0x55</integer>
+ <!-- The maximum height of the expanded horizontal picture-in-picture window -->
+ <item name="config_pictureInPictureExpandedHorizontalHeight"
+ format="dimension" type="dimen">110dp</item>
+
+ <!-- The maximum width of the expanded vertical picture-in-picture window -->
+ <item name="config_pictureInPictureExpandedVerticalWidth"
+ format="dimension" type="dimen">110dp</item>
+
+ <!-- The behavior when an activity has not specified a preference to dock big overlays or not.
+ Docking puts the activity side-by-side next to the big overlay windows. -->
+ <bool name="config_dockBigOverlayWindows">true</bool>
+
<!-- Whether the device uses the default focus highlight when focus state isn't specified. -->
<bool name="config_useDefaultFocusHighlight">false</bool>
@@ -49,6 +61,12 @@
com.android.systemui/com.android.systemui.sensorprivacy.television.TvUnblockSensorActivity
</string>
+ <!-- Component name of the activity used to inform a user about a sensory being blocked because
+ of hardware privacy switches. -->
+ <string name="config_sensorUseStartedActivity_hwToggle" translatable="false">
+ com.android.systemui/com.android.systemui.sensorprivacy.television.TvUnblockSensorActivity
+ </string>
+
<!-- Component name of the activity that shows the request for access to a usb device. -->
<string name="config_usbPermissionActivity" translatable="false">
com.android.systemui/com.android.systemui.usb.tv.TvUsbPermissionActivity
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 039c7f7..4b33e95 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"ป้อนข้อมูลการล็อกหน้าจอเพื่อดำเนินการต่อ"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"ตรวจพบลายนิ้วมือบางส่วน"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"ประมวลผลลายนิ้วมือไม่ได้ โปรดลองอีกครั้ง"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"ทำความสะอาดเซ็นเซอร์"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"วางนิ้วให้นานขึ้นอีกนิด"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"นิ้วเคลื่อนที่ช้าเกินไป โปรดลองอีกครั้ง"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ลองลายนิ้วมืออื่น"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"สว่างเกินไป"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"เปลี่ยนตำแหน่งของนิ้วเล็กน้อยไปเรื่อยๆ ทุกครั้ง"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"ตรวจสอบสิทธิ์ลายนิ้วมือแล้ว"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"ตรวจสอบสิทธิ์ใบหน้าแล้ว"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"ตรวจสอบสิทธิ์ใบหน้าแล้ว โปรดกดยืนยัน"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"ข้าม"</string>
<string name="no_matches" msgid="6472699895759164599">"ไม่พบรายการที่ตรงกัน"</string>
<string name="find_on_page" msgid="5400537367077438198">"ค้นหาบนหน้า"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{ตรงกัน # รายการ}other{# จาก {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"เสร็จสิ้น"</string>
<string name="progress_erasing" msgid="6891435992721028004">"กำลังลบพื้นที่เก็บข้อมูลที่แชร์…"</string>
<string name="share" msgid="4157615043345227321">"แชร์"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"เปิด"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"แอปไม่พร้อมใช้งาน"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ไม่พร้อมใช้งานในขณะนี้"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ไม่พร้อมใช้งาน"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"เข้าถึงแอปนี้ใน <xliff:g id="DEVICE">%1$s</xliff:g> ของคุณไม่ได้ในขณะนี้ โปรดลองเข้าถึงในอุปกรณ์ Android TV แทน"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"เข้าถึงแอปนี้ใน <xliff:g id="DEVICE">%1$s</xliff:g> ของคุณไม่ได้ในขณะนี้ โปรดลองเข้าถึงในแท็บเล็ตแทน"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"เข้าถึงแอปนี้ใน <xliff:g id="DEVICE">%1$s</xliff:g> ของคุณไม่ได้ในขณะนี้ โปรดลองเข้าถึงในโทรศัพท์แทน"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"แอปนี้สร้างขึ้นเพื่อ Android เวอร์ชันเก่าและอาจทำงานผิดปกติ โปรดลองตรวจหาการอัปเดตหรือติดต่อนักพัฒนาซอฟต์แวร์"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"ตรวจสอบอัปเดต"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"คุณมีข้อความใหม่"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ถอนการติดตั้ง"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"เปิดต่อไป"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ตรวจพบแอปที่เป็นอันตราย"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"คำขอเข้าถึงบันทึกของระบบ"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"เฉพาะครั้งนี้"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"ไม่อนุญาต"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ขอบันทึกของระบบเพื่อแก้ไขข้อบกพร่องเกี่ยวกับการทำงาน บันทึกเหล่านี้อาจมีข้อมูลที่เขียนโดยแอปและบริการในอุปกรณ์"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"ไม่ต้องแสดงอีก"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ต้องการแสดงส่วนต่างๆ ของ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"แก้ไข"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"สายเรียกเข้าและการแจ้งเตือนจะสั่น"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"กล่องโต้ตอบพลังงาน"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"หน้าจอล็อก"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ภาพหน้าจอ"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Hook ชุดหูฟัง"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ตัวเลือกทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ทางลัดการช่วยเหลือพิเศษ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ปิดหน้าต่างแจ้งเตือน"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ขึ้น"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ลง"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ซ้าย"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ขวา"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad กึ่งกลาง"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"แถบคำบรรยาย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"ใส่ <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ในที่เก็บข้อมูลที่ถูกจำกัดแล้ว"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"แตะเพื่อเปิด"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ไม่มีแอปงาน"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ไม่มีแอปส่วนตัว"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"เปิด <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์ส่วนตัวไหม"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"เปิด <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์งานไหม"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ใช้เบราว์เซอร์ส่วนตัว"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ใช้เบราว์เซอร์งาน"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ปลดล็อกเครือข่ายที่ใช้กับ SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> กำลังทำงานอยู่ในเบื้องหลังและทำให้เปลืองแบตเตอรี่ แตะเพื่อตรวจสอบ"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ทำงานอยู่ในเบื้องหลังเป็นเวลานาน แตะเพื่อตรวจสอบ"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ตรวจสอบแอปที่ใช้งานอยู่"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 0200548..e443676 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Ilagay ang iyong lock ng screen para magpatuloy"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Hindi buo ang natukoy na fingerprint"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Hindi maproseso ang fingerprint. Pakisubukan ulit."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Linisin ang sensor"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"I-hold nang mas matagal nang kaunti"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Masyadong mabagal ang paggalaw ng daliri. Pakisubukan ulit."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Sumubok ng ibang fingerprint"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Masyadong maliwanag"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Bahagyang baguhin ang posisyon ng iyong daliri sa bawat pagkakataon"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Na-authenticate ang fingerprint"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Na-authenticate ang mukha"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Na-authenticate ang mukha, pakipindot ang kumpirmahin"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Laktawan"</string>
<string name="no_matches" msgid="6472699895759164599">"Walang mga tugma"</string>
<string name="find_on_page" msgid="5400537367077438198">"Maghanap sa pahina"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# tugma}one{# sa {total}}other{# sa {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Tapos na"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Binubura ang nakabahaging storage…"</string>
<string name="share" msgid="4157615043345227321">"Ibahagi"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"I-on"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Hindi available ang app"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Hindi available sa ngayon ang <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"Hindi available ang <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Hindi ito maa-access sa iyong <xliff:g id="DEVICE">%1$s</xliff:g> sa ngayon. Subukan na lang sa iyong Android TV device."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Hindi ito maa-access sa iyong <xliff:g id="DEVICE">%1$s</xliff:g> sa ngayon. Subukan na lang sa iyong tablet."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Hindi ito maa-access sa iyong <xliff:g id="DEVICE">%1$s</xliff:g> sa ngayon. Subukan na lang sa iyong telepono."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ang app na ito ay ginawa para sa mas lumang bersyon ng Android at maaaring hindi gumana nang maayos. Subukang tingnan kung may mga update, o makipag-ugnayan sa developer."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Tingnan kung may update"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Mayroon kang mga bagong mensahe"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"I-UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"BUKSAN PA RIN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"May na-detect na mapaminsalang app"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Kahilingan sa access sa log ng system"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Ngayon lang"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Huwag payagan"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Humihiling ang <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ng mga log ng system para sa functional na pag-debug. Posibleng maglaman ang mga log na ito ng impormasyong isinulat ng mga app at serbisyo sa iyong device."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Huwag ipakita ulit"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"Gustong ipakita ng <xliff:g id="APP_0">%1$s</xliff:g> ang mga slice ng <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"I-edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Magva-vibrate ang mga tawag at notification"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog ng Power"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset Hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Shortcut ng Accessibility sa Screen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Tagapili ng Shortcut ng Accessibility sa Screen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Shortcut ng Accessibility"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"I-dismiss ang Notification Shade"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad Up"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad Down"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Left"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Right"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Center"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar ng <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Inilagay ang <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> sa PINAGHIHIGPITANG bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"I-tap para i-on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Walang app para sa trabaho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Walang personal na app"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Buksan ang <xliff:g id="APP">%s</xliff:g> sa iyong personal na profile?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Buksan ang <xliff:g id="APP">%s</xliff:g> sa iyong profile sa trabaho?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gamitin ang personal na browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gamitin ang browser sa trabaho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para sa pag-unlock ng network ng SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Gumagana ang <xliff:g id="APP">%1$s</xliff:g> sa background at gumagamit ito ng baterya I-tap para suriin."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Napakatagal nang gumagana ang <xliff:g id="APP">%1$s</xliff:g> sa background. I-tap para suriin."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Tingnan ang mga aktibong app"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 90a7668..9546de4 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Devam etmek için ekran kilidinizi girin"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Parmak izinin tümü algılanamadı"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Parmak izi işlenemedi. Lütfen tekrar deneyin."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Sensörü temizleyin"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Biraz daha uzun basılı tutun"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Parmak hareketi çok yavaştı. Lütfen tekrar deneyin."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Başka bir parmak izi deneyin"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Çok parlak"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Her defasında parmağınızın konumunu biraz değiştirin"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Parmak izi kimlik doğrulaması yapıldı"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Yüz kimliği doğrulandı"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Yüz kimliği doğrulandı, lütfen onayla\'ya basın"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Atla"</string>
<string name="no_matches" msgid="6472699895759164599">"Eşleşme yok"</string>
<string name="find_on_page" msgid="5400537367077438198">"Sayfada bul"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# eşleşme}other{#/{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Bitti"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Paylaşılan depolama alanı siliniyor…"</string>
<string name="share" msgid="4157615043345227321">"Paylaş"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Aç"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Uygulama kullanılamıyor"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması şu anda kullanılamıyor."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> kullanılamıyor"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Bu uygulamaya şu anda <xliff:g id="DEVICE">%1$s</xliff:g> cihazınızdan erişilemiyor. Bunun yerine Android TV cihazınızı kullanmayı deneyin."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Bu uygulamaya şu anda <xliff:g id="DEVICE">%1$s</xliff:g> cihazınızdan erişilemiyor. Bunun yerine tabletinizi kullanmayı deneyin."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Bu uygulamaya şu anda <xliff:g id="DEVICE">%1$s</xliff:g> cihazınızdan erişilemiyor. Bunun yerine telefonunuzu kullanmayı deneyin."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Bu uygulama Android\'in daha eski bir sürümü için oluşturuldu ve düzgün çalışmayabilir. Güncellemeleri kontrol etmeyi deneyin veya geliştiriciyle iletişime geçin."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Güncellemeleri denetle"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Yeni mesajlarınız var"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"YÜKLEMEYİ KALDIR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"YİNE DE AÇ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zararlı uygulama tespit edildi"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Sistem günlük kayıtlarına erişim isteği"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Yalnız bu sefer"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"İzin verme"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> uygulaması işlevsel hata ayıklama için sistem günlük kayıtlarını istiyor. Bu günlükler, cihazınızdaki uygulama ve hizmetler tarafından yazılan bilgileri içerebilir."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Bir daha gösterme"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> uygulaması, <xliff:g id="APP_2">%2$s</xliff:g> dilimlerini göstermek istiyor"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Düzenle"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Aramalar ve bildirimler titreşim yapacak"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Güç İletişim Kutusu"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilit Ekranı"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekran görüntüsü"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Mikrofonlu Kulaklık Kancası"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekran Erişilebilirlik Kısayolu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekran Erişilebilirlik Kısayol Seçici"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Erişilebilirlik Kısayolu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Bildirim Gölgesini Kapat"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad Yukarı"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad Aşağı"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sol"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağ"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Orta"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının başlık çubuğu."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> KISITLANMIŞ gruba yerleştirildi"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Açmak için dokunun"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş uygulaması yok"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Kişisel uygulama yok"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> uygulaması kişisel profilinizde açılsın mı?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> uygulaması iş profilinizde açılsın mı?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Kişisel tarayıcıyı kullan"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"İş tarayıcısını kullan"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ağ kilidi açma PIN kodu"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> arka planda çalışıyor ve pil tüketiyor. İncelemek için dokunun."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> uzun süredir arka planda çalışıyor. İncelemek için dokunun."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Etkin uygulamaları kontrol edin"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 1b72d96..cc763ad 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -590,8 +590,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Щоб продовжити, введіть дані для розблокування екрана"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Виявлено частковий відбиток пальця"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Не вдалось обробити відбиток пальця. Повторіть спробу."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Очистьте сканер"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Тримайте палець трохи довше"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Ви провели пальцем надто повільно. Повторіть спробу."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Спробуйте інший відбиток пальця"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Надто яскраво"</string>
@@ -599,6 +603,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Щоразу трохи змінюйте положення пальця"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Відбиток пальця автентифіковано"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Обличчя автентифіковано"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Обличчя автентифіковано. Натисніть \"Підтвердити\""</string>
@@ -1502,7 +1510,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Пропустити"</string>
<string name="no_matches" msgid="6472699895759164599">"Немає збігів"</string>
<string name="find_on_page" msgid="5400537367077438198">"Знайти на сторінці"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# збіг}one{# з {total}}few{# з {total}}many{# з {total}}other{# з {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Стирання спільної пам’яті…"</string>
<string name="share" msgid="4157615043345227321">"Надіслати"</string>
@@ -1930,6 +1939,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Увімкнути"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Додаток недоступний"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> зараз недоступний."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"Недоступно: <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Цей додаток зараз недоступний на вашому <xliff:g id="DEVICE">%1$s</xliff:g>. Спробуйте натомість скористатися пристроєм Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Цей додаток зараз недоступний на вашому <xliff:g id="DEVICE">%1$s</xliff:g>. Спробуйте натомість скористатися планшетом."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Цей додаток зараз недоступний на вашому <xliff:g id="DEVICE">%1$s</xliff:g>. Спробуйте натомість скористатися телефоном."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Цей додаток створений для старішої версії Android і може працювати неналежним чином. Спробуйте знайти оновлення або зв’яжіться з розробником."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Шукати оновлення"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"У вас є нові повідомлення"</string>
@@ -2019,16 +2032,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ВИДАЛИТИ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"УСЕ ОДНО ВІДКРИТИ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Виявлено шкідливий додаток"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Запит на доступ до системних журналів"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Лише цього разу"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Не дозволяти"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"Для функціонального налагодження додатку <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> потрібен доступ до системних журналів. Вони можуть містити інформацію, записану додатками й сервісами на вашому пристрої."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Більше не показувати"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> хоче показати фрагменти додатка <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Редагувати"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Вібросигнал для викликів і сповіщень увімкнено"</string>
@@ -2091,22 +2099,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Відкрити вікно"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокувати екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Знімок екрана"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Гачок для гарнітури"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Екранний засіб спеціальних можливостей"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Вибір екранного засобу спеціальних можливостей"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Засіб спеціальних можливостей"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Закрити панель сповіщень"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Кнопка \"вгору\" панелі керування"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Кнопка \"вниз\" панелі керування"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Кнопка \"вліво\" панелі керування"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Кнопка \"вправо\" панелі керування"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Центральна кнопка панелі керування"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Смуга із субтитрами для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" додано в сегмент з обмеженнями"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2127,10 +2129,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Торкніться, щоб увімкнути"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Немає робочих додатків"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Немає особистих додатків"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Відкрити додаток <xliff:g id="APP">%s</xliff:g> в особистому профілі?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Відкрити додаток <xliff:g id="APP">%s</xliff:g> у робочому профілі?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Використати особистий веб-переглядач"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Використати робочий веб-переглядач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код розблокування мережі SIM-карти"</string>
@@ -2265,4 +2265,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Додаток <xliff:g id="APP">%1$s</xliff:g> працює у фоновому режимі та розряджає акумулятор. Натисніть, щоб переглянути."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Додаток <xliff:g id="APP">%1$s</xliff:g> довго працює у фоновому режимі. Натисніть, щоб переглянути."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Перевірте активні додатки"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 6c53d79..8636572 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"اپنے کیلنڈر تک رسائی حاصل کریں"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS پیغامات بھیجیں اور دیکھیں"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"فائلز اور دستاویزات"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"آپ کے آلے پر فائلز اور دستاویزات تک رسائی حاصل کریں"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"موسیقی اور دیگر آڈیو"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"آپ کے آلے پر آڈیو فائلز تک رسائی حاصل کریں"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"تصاویر اور ویڈیوز"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"جاری رکھنے کے لیے اپنا اسکرین لاک درج کریں"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"جزوی فنگر پرنٹ کا پتہ چلا"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"فنگر پرنٹ پر کارروائی نہیں کی جا سکی۔ براہ کرم دوبارہ کوشش کریں۔"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"سینسر صاف کریں"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"تھوڑی دیر دبائے رکھیں"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"فنگر پرنٹ سینسر صاف کریں اور دوبارہ کوشش کریں"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"سینسر صاف کریں اور دوبارہ کوشش کریں"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"سینسر پر اچھی طرح دبائیں"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"انگلی کو بہت آہستہ ہٹایا گیا۔ براہ کرم دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"دوسرا فنگر پرنٹ آزمائیں"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"کافی روشنی ہے"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ہر بار اپنی انگلی کی پوزیشن کو تھوڑا تبدیل کریں"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"فنگر پرنٹ کی شناخت نہیں ہو سکی"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"سینسر پر اچھی طرح دبائیں"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"فنگر پرنٹ کی تصدیق ہو گئی"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"چہرے کی تصدیق ہو گئی"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"چہرے کی تصدیق ہو گئی، براہ کرم \'تصدیق کریں\' کو دبائيں"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"نظر انداز کریں"</string>
<string name="no_matches" msgid="6472699895759164599">"کوئی مماثلتیں نہیں ہیں"</string>
<string name="find_on_page" msgid="5400537367077438198">"صفحہ پر تلاش کریں"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# مماثل کریں}other{# میں سے {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"ہو گیا"</string>
<string name="progress_erasing" msgid="6891435992721028004">"اشتراک کردہ اسٹوریج کو صاف کیا جا رہا ہے…"</string>
<string name="share" msgid="4157615043345227321">"اشتراک کریں"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"آن کریں"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"ایپ دستیاب نہیں ہے"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ابھی دستیاب نہیں ہے۔"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> دستیاب نہیں ہے"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"اس وقت آپ کے <xliff:g id="DEVICE">%1$s</xliff:g> پر اس تک رسائی نہیں مل سکتی۔ اس کے بجائے اپنے Android TV آلے پر کوشش کریں۔"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"اس وقت آپ کے <xliff:g id="DEVICE">%1$s</xliff:g> پر اس تک رسائی نہیں مل سکتی۔ اس کے بجائے اپنے ٹیبلیٹ پر کوشش کریں۔"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"اس وقت آپ کے <xliff:g id="DEVICE">%1$s</xliff:g> پر اس تک رسائی نہیں مل سکتی۔ اس کے بجائے اپنے فون پر کوشش کریں۔"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"یہ ایپ Android کے پرانے ورژن کے لئے بنائی گئی ہے اور ہو سکتا ہے صحیح طور پر کام نہ کرے۔ اپ ڈیٹس چیک کر کے آزمائیں یا ڈویلپر سے رابطہ کریں۔"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"اپ ڈیٹ چیک کریں"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"آپ کے پاس نئے پیغامات ہیں"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"اَن انسٹال کریں"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"بہر صورت کھولیں"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ضرر رساں ایپ کا پتہ چلا"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"سسٹم لاگ تک رسائی کی درخواست"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"صرف اس وقت"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"اجازت نہ دیں"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"فنکشنل ڈیبگنگ کے لیے <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> سسٹم لاگز کی درخواست کر رہی ہے۔ ان لاگز میں آپ کے آلے پر موجود ایپس اور سروسز کی معلومات شامل ہو سکتی ہیں۔"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"دوبارہ نہ دکھائیں"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانا چاہتی ہے"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ترمیم کریں"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"کالز اور اطلاعات پر وائبریٹ کرے گا"</string>
@@ -2119,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"آن کرنے کیلئے تھپتھپائیں"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"کوئی ورک ایپ نہیں"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"کوئی ذاتی ایپ نہیں"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"اپنی ذاتی پروفائل میں <xliff:g id="APP">%s</xliff:g> کھولیں؟"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"اپنی دفتری پروفائل میں <xliff:g id="APP">%s</xliff:g> کھولیں؟"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ذاتی براؤزر استعمال کریں"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ورک براؤزر استعمال کریں"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM نیٹ ورک غیر مقفل کرنے کا PIN"</string>
@@ -2257,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> پس منظر میں چل رہی ہے اور بیٹری ختم ہو رہی ہے۔ جائزے کے لیے تھپتھپائیں۔"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> کافی وقت سے پس منظر میں چل رہی ہے۔ جائزے کے لیے تھپتھپائیں۔"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"فعال ایپس چیک کریں"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index e57c7c8..e09f634 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Ekran qulfini kiritish bilan davom eting"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Barmoq izi qismi aniqlandi"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Barmoq izi aniqlanmadi. Qaytadan urining."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Sensorni tozalang"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Biroz koʻproq bosib turing"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Barmoq juda sekin harakatlandi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Boshqa barmoq izi bilan urining"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Juda yorqin"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Barmoqni har safar biroz surib joylang"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Barmoq izi tekshirildi"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Yuzingiz aniqlandi"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Yuzingiz aniqlandi, tasdiqlash uchun bosing"</string>
@@ -909,7 +917,7 @@
<string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"Qulfni ochish uchun \"Menyu\"ga bosing."</string>
<string name="lockscreen_pattern_instructions" msgid="3169991838169244941">"Qulfni ochish uchun grafik kalitni chizing"</string>
<string name="lockscreen_emergency_call" msgid="7549683825868928636">"Favqulodda chaqiruv"</string>
- <string name="lockscreen_return_to_call" msgid="3156883574692006382">"Qo‘ng‘iroqni qaytarish"</string>
+ <string name="lockscreen_return_to_call" msgid="3156883574692006382">"Chaqiruvga qaytish"</string>
<string name="lockscreen_pattern_correct" msgid="8050630103651508582">"To‘g‘ri!"</string>
<string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"Qaytadan urining"</string>
<string name="lockscreen_password_wrong" msgid="8605355913868947490">"Qaytadan urining"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Tashlab o‘tish"</string>
<string name="no_matches" msgid="6472699895759164599">"Topilmadi"</string>
<string name="find_on_page" msgid="5400537367077438198">"Sahifadan topish"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ta natija}other{# / {total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Tayyor"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Umumiy xotira tozalanmoqda…"</string>
<string name="share" msgid="4157615043345227321">"Yuborish"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Yoqish"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Ilova ishlamayapti"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Ayni vaqtda <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi ishlamayapti."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> kanali ish faoliyatida emas"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Ayni vaqtda bu translatsiya <xliff:g id="DEVICE">%1$s</xliff:g> qurilmangizda ishlamaydi. Android TV qurilmasi orqali urinib koʻring."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Ayni vaqtda bu translatsiya <xliff:g id="DEVICE">%1$s</xliff:g> qurilmangizda ishlamaydi. Planshet orqali urinib koʻring."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Ayni vaqtda bu translatsiya <xliff:g id="DEVICE">%1$s</xliff:g> qurilmangizda ishlamaydi. Telefon orqali urininb koʻring."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Bu ilova eskiroq Android versiyalariga chiqarilgan va xato ishlashi mumkin. Yangilanishlarini tekshiring yoki dasturchi bilan bog‘laning."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Yangilanish borligini tekshirish"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Sizga yangi SMS keldi"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"O‘CHIRIB TASHLASH"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"BARIBIR OCHILSIN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zararli ilova aniqlandi"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Tizim jurnaliga kirish soʻrovi"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Faqat shu safar"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Rad etish"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> funksional nosozliklarni tuzatish uchun tizim jurnallarini soʻramoqda. Bu jurnallarda qurilmangizdagi ilovalar va xizmatlar yozilgan maʼlumotlar boʻlishi mumkin."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Boshqa chiqmasin"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ilovasi <xliff:g id="APP_2">%2$s</xliff:g> ilovasidan fragmentlar ko‘rsatish uchun ruxsat so‘ramoqda"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Tahrirlash"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chaqiruvlar va bildirishnomalar tebranadi"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quvvat muloqot oynasi"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran qulfi"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skrinshot"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Garniturani osib qoʻyish"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranda tezkor ishga tushirish"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekranda tezkor ishga tushirishni tanlagich"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Tezkor ishga tushirish"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Eslatma soyasini yopish"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad – tepaga"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad – pastga"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad – chapga"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad – oʻngga"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – markazga"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> taglavhalar paneli."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> cheklangan turkumga joylandi"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Yoqish uchun bosing"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ishga oid ilovalar topilmadi"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Shaxsiy ilovalar topilmadi"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"<xliff:g id="APP">%s</xliff:g> shaxsiy profilda ochilsinmi?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"<xliff:g id="APP">%s</xliff:g> shaxsiy profilda ochilsinmi?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Shaxsiy brauzerdan foydalanish"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Ishga oid brauzerdan foydalanish"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM kartaning tarmoqdagi qulfini ochish uchun PIN kod"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> orqa fonda ishlamoqda va batareyani ortiqcha sarflamoqda. Tekshirish uchun bosing."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> uzoq vaqt orqa fonda ishlamoqda. Tekshirish uchun bosing."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Faol ilovalarni tekshiring"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 067a12f..329f193 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Hãy nhập phương thức khóa màn hình của bạn để tiếp tục"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Phát hiện thấy một phần vân tay"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Không thể xử lý vân tay. Vui lòng thử lại."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Hãy vệ sinh cảm biến"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Hãy giữ tay lâu hơn một chút"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Di chuyển ngón tay quá chậm. Vui lòng thử lại."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Hãy thử một vân tay khác"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Quá sáng"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Mỗi lần, hãy thay đổi vị trí ngón tay một chút"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Đã xác thực vân tay"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Đã xác thực khuôn mặt"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Đã xác thực khuôn mặt, vui lòng nhấn để xác nhận"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Bỏ qua"</string>
<string name="no_matches" msgid="6472699895759164599">"Không có kết quả nào phù hợp"</string>
<string name="find_on_page" msgid="5400537367077438198">"Tìm kiếm trên trang"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# kết quả phù hợp}other{#/{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Xong"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Đang xóa bộ nhớ dùng chung…"</string>
<string name="share" msgid="4157615043345227321">"Chia sẻ"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Bật"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Ứng dụng này không dùng được"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> hiện không dùng được."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"Không hỗ trợ <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Hiện tại, bạn không thể truy cập vào ứng dụng này trên <xliff:g id="DEVICE">%1$s</xliff:g>. Hãy thử trên thiết bị Android TV."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Hiện tại, bạn không thể truy cập vào ứng dụng này trên <xliff:g id="DEVICE">%1$s</xliff:g>. Hãy thử trên máy tính bảng."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Hiện tại, bạn không thể truy cập vào ứng dụng này trên <xliff:g id="DEVICE">%1$s</xliff:g>. Hãy thử trên điện thoại."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Ứng dụng này được xây dựng cho một phiên bản Android cũ hơn và có thể hoạt động không bình thường. Hãy thử kiểm tra các bản cập nhật hoặc liên hệ với nhà phát triển."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Kiểm tra bản cập nhật"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Bạn có tin nhắn mới"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"GỠ CÀI ĐẶT"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VẪN MỞ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Đã phát hiện ứng dụng độc hại"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Yêu cầu truy cập vào nhật ký hệ thống"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Chỉ lần này"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Không cho phép"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> cần truy cập vào nhật ký hệ thống để gỡ lỗi về chức năng. Những nhật ký này có thể chứa thông tin mà ứng dụng và dịch vụ trên thiết bị của bạn đã ghi lại."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Không hiện lại"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> muốn hiển thị các lát của <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Chỉnh sửa"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Cuộc gọi và thông báo sẽ rung"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Hộp thoại thao tác với nguồn"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khóa màn hình"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Chụp ảnh màn hình"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Giá treo tai nghe"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Phím tắt hỗ trợ tiếp cận trên màn hình"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Bộ chọn phím tắt hỗ trợ tiếp cận trên màn hình"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Phím tắt hỗ trợ tiếp cận"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Đóng Ngăn thông báo"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Chuyển lên trên bằng bàn phím di chuyển"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Chuyển xuống dưới bằng bàn phím di chuyển"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Chuyển sang trái bằng bàn phím di chuyển"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Chuyển sang phải bằng bàn phím di chuyển"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Căn giữa bằng bàn phím di chuyển"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Thanh phụ đề của <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Đã đưa <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> vào bộ chứa BỊ HẠN CHẾ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Nhấn để bật"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Không có ứng dụng công việc"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Không có ứng dụng cá nhân"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Mở <xliff:g id="APP">%s</xliff:g> trong hồ sơ cá nhân của bạn?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Mở <xliff:g id="APP">%s</xliff:g> trong hồ sơ công việc của bạn?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Dùng trình duyệt cá nhân"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Dùng trình duyệt công việc"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Mã PIN mở khóa mạng SIM"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> đang chạy trong nền và làm tiêu hao pin. Nhấn để xem lại."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> đang chạy trong nền trong thời gian dài. Nhấn để xem lại."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Xem các ứng dụng đang hoạt động"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index ff1ed87..dbfef83 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"输入您的屏幕锁定凭据才能继续"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"检测到局部指纹"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"无法处理指纹,请重试。"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"请将传感器擦干净"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"按久一点"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"手指移动太慢,请重试。"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"请试试其他指纹"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"光线太亮"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"请在每次放手指时略微更改手指的位置"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"已验证指纹"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"面孔已验证"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"面孔已验证,请按确认按钮"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"跳过"</string>
<string name="no_matches" msgid="6472699895759164599">"无匹配项"</string>
<string name="find_on_page" msgid="5400537367077438198">"在网页上查找"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 场比赛}other{# 场比赛(共 {total} 场)}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"完成"</string>
<string name="progress_erasing" msgid="6891435992721028004">"正在清空共享的存储空间…"</string>
<string name="share" msgid="4157615043345227321">"分享"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"开启"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"应用无法使用"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g>目前无法使用。"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g>不可用"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"目前无法在您的<xliff:g id="DEVICE">%1$s</xliff:g>上访问此内容。您可以尝试在 Android TV 设备上访问。"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"目前无法在您的<xliff:g id="DEVICE">%1$s</xliff:g>上访问此内容。您可以尝试在平板电脑上访问。"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"目前无法在您的<xliff:g id="DEVICE">%1$s</xliff:g>上访问此内容。您可以尝试在手机上访问。"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"此应用专为旧版 Android 打造,因此可能无法正常运行。请尝试检查更新或与开发者联系。"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"检查更新"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"您有新消息"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"卸载"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"仍然打开"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"检测到有害应用"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"系统日志访问请求"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"仅限这一次"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"不允许"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>请求访问系统日志,以进行功能调试。这些日志可能包含设备上的应用和服务写入的信息。"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"不再显示"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"“<xliff:g id="APP_0">%1$s</xliff:g>”想要显示“<xliff:g id="APP_2">%2$s</xliff:g>”图块"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"编辑"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有来电和通知时会振动"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"电源对话框"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"锁定屏幕"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"屏幕截图"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"耳机挂钩"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"屏幕上的无障碍功能快捷方式"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"屏幕上的无障碍功能快捷方式选择器"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"无障碍功能快捷方式"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"关闭通知栏"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"向上方向键"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"向下方向键"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"向左方向键"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"向右方向键"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"方向键中心"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>的标题栏。"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已被放入受限存储分区"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"点按即可开启"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"没有支持该内容的工作应用"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"没有支持该内容的个人应用"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"要使用个人资料打开 <xliff:g id="APP">%s</xliff:g> 吗?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"要使用工作资料打开 <xliff:g id="APP">%s</xliff:g> 吗?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用个人浏览器"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作浏览器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 网络解锁 PIN 码"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> 正在后台运行,并且消耗了大量电池电量。点按即可查看。"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> 已在后台运行较长时间。点按即可查看。"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"查看使用中的应用"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 52ba4ef..c4fa7a0 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"如要繼續操作,請輸入螢幕鎖定解鎖憑證"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"只偵測到部分指紋"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"無法處理指紋。請再試一次。"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"清潔感應器"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"請按住更長時間"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"手指移動太慢,請重試。"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"改用其他指紋"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"太亮"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"每次掃瞄時請稍微變更手指的位置"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"驗證咗指紋"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"面孔已經驗證"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"面孔已經驗證,請㩒一下 [確認]"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"略過"</string>
<string name="no_matches" msgid="6472699895759164599">"沒有相符的結果"</string>
<string name="find_on_page" msgid="5400537367077438198">"在頁面中尋找"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 個相符的項目}other{# 個相符的項目 (共 {total} 個)}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"完成"</string>
<string name="progress_erasing" msgid="6891435992721028004">"正在清除共用儲存空間資料…"</string>
<string name="share" msgid="4157615043345227321">"分享"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"開啟"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"無法使用應用程式"</string>
<string name="app_blocked_message" msgid="542972921087873023">"目前無法使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」。"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"無法使用「<xliff:g id="ACTIVITY">%1$s</xliff:g>」"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"目前無法在 <xliff:g id="DEVICE">%1$s</xliff:g> 上存取此應用程式,請改用 Android TV 裝置存取。"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"目前無法在 <xliff:g id="DEVICE">%1$s</xliff:g> 上存取此應用程式,請改用平板電腦存取。"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"目前無法在 <xliff:g id="DEVICE">%1$s</xliff:g> 上存取此應用程式,請改用手機存取。"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"此應用程式專為舊版 Android 打造,因此可能無法正常運作。請嘗試檢查更新,或與開發人員聯絡。"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"檢查更新"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"您有新的訊息"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"解除安裝"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"仍要開啟"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"偵測到有害的應用程式"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"系統記錄存取要求"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"僅限這次"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"不允許"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"「<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>」需要系統記錄才能進行功能偵錯。這些記錄可能包含裝置上應用程式和服務寫入的資料。"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"不要再顯示"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"「<xliff:g id="APP_0">%1$s</xliff:g>」想顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"編輯"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有來電和通知時會震動"</string>
@@ -2119,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"輕按即可啟用"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"要在個人設定檔中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"要在工作設定檔中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用個人瀏覽器"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作瀏覽器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 網絡解鎖 PIN"</string>
@@ -2257,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> 正在背景執行並大量耗電。輕按即可查看。"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> 已長時間在背景執行。輕按即可查看。"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"查看使用中的應用程式"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index cad12e3..843c7517 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -588,8 +588,12 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"如要繼續操作,請輸入螢幕鎖定憑證"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"僅偵測到局部指紋"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"無法處理指紋,請再試一次。"</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"清潔感應器"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"按久一點"</string>
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1770676120848224250) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty_alt (9169582140486372897) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (1628459767349116104) -->
+ <skip />
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"手指移動速度過慢,請再試一次。"</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"改用其他指紋"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"太亮"</string>
@@ -597,6 +601,10 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"每次掃描時請稍微變更手指的位置"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- no translation found for fingerprint_error_not_match (4599441812893438961) -->
+ <skip />
+ <!-- no translation found for fingerprint_udfps_error_not_match (4709197752023550709) -->
+ <skip />
<string name="fingerprint_authenticated" msgid="2024862866860283100">"指紋驗證成功"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"臉孔驗證成功"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"臉孔驗證成功,請按下 [確認] 按鈕"</string>
@@ -1500,7 +1508,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"略過"</string>
<string name="no_matches" msgid="6472699895759164599">"沒有相符項目"</string>
<string name="find_on_page" msgid="5400537367077438198">"在頁面中尋找"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 個相符的項目}other{# 個相符的項目 (共 {total} 個)}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"完成"</string>
<string name="progress_erasing" msgid="6891435992721028004">"正在清除共用儲存空間…"</string>
<string name="share" msgid="4157615043345227321">"分享"</string>
@@ -1928,6 +1937,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"開啟"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"應用程式無法使用"</string>
<string name="app_blocked_message" msgid="542972921087873023">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」目前無法使用。"</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"無法存取「<xliff:g id="ACTIVITY">%1$s</xliff:g>」"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"目前無法在 <xliff:g id="DEVICE">%1$s</xliff:g> 上存取這個應用程式,請改用 Android TV 裝置。"</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"目前無法在 <xliff:g id="DEVICE">%1$s</xliff:g> 上存取這個應用程式,請改用平板電腦。"</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"目前無法在 <xliff:g id="DEVICE">%1$s</xliff:g> 上存取這個應用程式,請改用手機。"</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"這個應用程式是專為舊版 Android 所打造,因此可能無法正常運作。請嘗試檢查更新,或是與開發人員聯絡。"</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"檢查更新"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"你有新訊息"</string>
@@ -2017,16 +2030,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"解除安裝"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"仍要開啟"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"偵測到有害應用程式"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"系統記錄存取要求"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"僅允許這一次"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"不允許"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"「<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>」要求存取系統記錄以進行功能偵錯。這些記錄可能包含應用程式和服務在你裝置上寫入的資訊。"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"不要再顯示"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"「<xliff:g id="APP_0">%1$s</xliff:g>」想要顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的區塊"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"編輯"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有來電和通知時會震動"</string>
@@ -2089,22 +2097,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"開啟電源對話方塊"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"螢幕鎖定"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"螢幕截圖"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"耳機掛鉤"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"螢幕上的無障礙捷徑"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"螢幕上的無障礙捷徑選擇器"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"無障礙捷徑"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"關閉通知欄"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad 向上移"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad 向下移"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad 向左移"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad 向右移"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad 置中"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的說明文字列。"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"已將「<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>」移入受限制的值區"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2127,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"輕觸即可啟用"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"要在個人資料夾中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"要在工作資料夾中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用個人瀏覽器"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作瀏覽器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 卡網路解鎖 PIN 碼"</string>
@@ -2263,4 +2263,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"「<xliff:g id="APP">%1$s</xliff:g>」正在背景運作且耗用大量電力。輕觸即可查看。"</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"「<xliff:g id="APP">%1$s</xliff:g>」已長時間在背景運作。輕觸即可查看。"</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"查看使用中的應用程式"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 4b2387a..41cd8b0 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -304,10 +304,8 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"finyelela kukhalenda yakho"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"I-SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"thumela uphinde ubuke imilayezo ye-SMS"</string>
- <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
- <skip />
- <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
- <skip />
+ <string name="permgrouplab_storage" msgid="9173334109512154196">"Amafayela namadokhumenti"</string>
+ <string name="permgroupdesc_storage" msgid="8352226729501080525">"finyelela amafayela namadokhumenti kudivayisi yakho"</string>
<string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Umculo neminye imisindo"</string>
<string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"finyelela amafayela okulalelwayo edivayisini yakho"</string>
<string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Izithombe namavidiyo"</string>
@@ -588,8 +586,9 @@
<string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Faka ukukhiya isikrini kwakho ukuze uqhubeke"</string>
<string name="fingerprint_acquired_partial" msgid="694598777291084823">"Kutholwe ingxenye yesigxivizo somunwe"</string>
<string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Ayikwazanga ukucubungula izigxivizo zeminwe. Sicela uzame futhi."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="5236744087471419479">"Hlanza inzwa"</string>
- <string name="fingerprint_acquired_too_fast" msgid="6038375140739678098">"Bamba isikhashana esingeziwe"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Hlanza inzwa yesigxivizo somunwe bese uzame futhi"</string>
+ <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"Hlanza inzwa bese uzame futhi"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"Cindezela ngokuqinile kunzwa"</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Umnwe uhanjiswe kancane kakhulu. Sicela uzame futhi."</string>
<string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"Zama ezinye izigxivizo zeminwe"</string>
<string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"Kukhanya kakhulu"</string>
@@ -597,6 +596,8 @@
<string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"Shintsha indawo yomunwe wakho kancane isikhathi ngasinye"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_error_not_match" msgid="4599441812893438961">"Isigxivizo somunwe asaziwa"</string>
+ <string name="fingerprint_udfps_error_not_match" msgid="4709197752023550709">"Cindezela ngokuqinile kunzwa"</string>
<string name="fingerprint_authenticated" msgid="2024862866860283100">"Izigxivizo zeminwe zigunyaziwe"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Ubuso bufakazelwe ubuqiniso"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Ukuqinisekiswa kobuso, sicela ucindezele okuthi qinisekisa"</string>
@@ -1500,7 +1501,8 @@
<string name="skip_button_label" msgid="3566599811326688389">"Yeqa"</string>
<string name="no_matches" msgid="6472699895759164599">"Akukho okufanayo"</string>
<string name="find_on_page" msgid="5400537367077438198">"Thola ekhasini"</string>
- <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# okufanayo}one{# kokungu-{total}}other{# kokungu-{total}}} }"</string>
+ <!-- no translation found for matches_found (2296462299979507689) -->
+ <skip />
<string name="action_mode_done" msgid="2536182504764803222">"Kwenziwe"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Isusa isitoreji esabiwe…"</string>
<string name="share" msgid="4157615043345227321">"Yabelana"</string>
@@ -1928,6 +1930,10 @@
<string name="work_mode_turn_on" msgid="3662561662475962285">"Vula"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Uhlelo lokusebenza alutholakali"</string>
<string name="app_blocked_message" msgid="542972921087873023">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayitholakali khona manje."</string>
+ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"okungatholakali <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
+ <string name="app_streaming_blocked_message" product="tv" msgid="4003011766528814377">"Lokhu akukwazi ukufinyelelwa ku-<xliff:g id="DEVICE">%1$s</xliff:g> yakho ngalesi sikhathi. Zama kudivayisi yakho ye-Android TV kunalokho."</string>
+ <string name="app_streaming_blocked_message" product="tablet" msgid="4242053045964946062">"Lokhu akukwazi ukufinyelelwa ku-<xliff:g id="DEVICE">%1$s</xliff:g> yakho ngalesi sikhathi. Zama kuthebhulethi yakho kunalokho."</string>
+ <string name="app_streaming_blocked_message" product="default" msgid="6159168735030739398">"Lokhu akukwazi ukufinyelelwa ku-<xliff:g id="DEVICE">%1$s</xliff:g> yakho ngalesi sikhathi. Zama efonini yakho kunalokho."</string>
<string name="deprecated_target_sdk_message" msgid="5203207875657579953">"Lolu hlelo lokusebenza belakhelwe inguqulo endala ye-Android futhi kungenzeka lungasebenzi kahle. Zama ukuhlolela izibuyekezo, noma uxhumane nonjiniyela."</string>
<string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Hlola izibuyekezo"</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Unemilayezo emisha"</string>
@@ -2017,16 +2023,11 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"KHIPHA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VULA NOMA KUNJALO"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Uhlelo lokusebenza oluyingozi lutholakele"</string>
- <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
- <skip />
- <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
- <skip />
- <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
- <skip />
- <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
- <skip />
- <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
- <skip />
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"Isicelo sokufinyelela ilogu yesistimu"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"Kulokhu kuphela"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Ungavumeli"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"I-<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> icela amalogu wesistimu ukuze alungise iphutha. Lawa malogu angase aqukathe ulwazi olubhalwe ama-app namasevisi kudivayisi yakho."</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ungabonisi futhi"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"I-<xliff:g id="APP_0">%1$s</xliff:g> ifuna ukubonisa izingcezu ze-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Hlela"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Amakholi nezaziso zizodlidliza"</string>
@@ -2089,22 +2090,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Ibhokisi lamandla"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khiya isikrini"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Isithombe-skrini"</string>
- <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
- <skip />
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Ihhuku yama-earphone"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Isinqamuleli sokufinyeleleka kusikrini"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Isikhethi sesinqamuleli sokufinyeleleka kusikrini"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Isinqamuleli sokufinyeleleka"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Cashisa Umthunzi Wesaziso"</string>
- <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
- <skip />
- <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
- <skip />
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Phezulu kwe-Dpad"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Phansi kwe-Dpad"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Ngakwesokunxele se-Dpad"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Ngakwesokudla se-Dpad"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Isikhungo se-Dpad"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ibha yamazwibela we-<xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"I-<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ifakwe kubhakede LOKUKHAWULELWE"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2125,10 +2120,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Thepha ukuze uvule"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Awekho ama-app womsebenzi"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Awekho ama-app womuntu siqu"</string>
- <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
- <skip />
- <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
- <skip />
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"Vula i-<xliff:g id="APP">%s</xliff:g> kwiphrofayela yakho siqu?"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"Vula i-<xliff:g id="APP">%s</xliff:g> kwiphrofayela yakho yomsebenzi?"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Sebenzisa isiphequluli somuntu siqu"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Sebenzisa isiphequluli somsebenzi"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Iphinikhodi yokuvula inethiwekhi ye-SIM"</string>
@@ -2263,4 +2256,6 @@
<string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"I-<xliff:g id="APP">%1$s</xliff:g> isebenza ngemuva futhi idla ibhethri. Thepha ukuze ubuyekeze."</string>
<string name="notification_content_long_running_fgs" msgid="8878031652441570178">"I-<xliff:g id="APP">%1$s</xliff:g> isebenza ngemuva isikhathi eside. Thepha ukuze ubuyekeze."</string>
<string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Hlola ama-app asebenzayo"</string>
+ <!-- no translation found for vdm_camera_access_denied (6345652513729130490) -->
+ <skip />
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index fca2bd1..7150fca 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3364,7 +3364,7 @@
area for the user and that ideally it should not be covered. Setting this is only
appropriate for UI where the user would likely take action to uncover it.
<p>The system will try to respect this, but when not possible will ignore it.
- See {@link android.view.View#setPreferKeepClear}. -->
+ <p>This is equivalent to {@link android.view.View#setPreferKeepClear}.-->
<attr name="preferKeepClear" format="boolean" />
<!-- <p>Whether or not the auto handwriting initiation is enabled in this View.
@@ -3644,6 +3644,14 @@
<attr name="__removed2" format="boolean" />
<!-- Specifies whether the IME supports showing inline suggestions. -->
<attr name="supportsInlineSuggestions" format="boolean" />
+ <!-- Specifies whether the IME supports showing inline suggestions when touch
+ exploration is enabled. This does nothing if supportsInlineSuggestions is false.
+ The default value is false and most IMEs should not set this
+ to true since the older menu-style Autofill works better with touch exploration.
+ This attribute should be set to true in special situations, such as if this is an
+ accessibility-focused IME which blocks user interaction with the app window while the
+ IME is displayed. -->
+ <attr name="supportsInlineSuggestionsWithTouchExploration" format="boolean" />
<!-- Specifies whether the IME suppresses system spell checker.
The default value is false. If an IME sets this attribute to true,
the system spell checker will be disabled while the IME has an
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 6dc975b..0e0c6a3 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -2030,6 +2030,14 @@
-->
<attr name="resetEnabledSettingsOnAppDataCleared" format="boolean" />
<attr name="knownActivityEmbeddingCerts" />
+
+ <!-- If false, {@link android.view.KeyEvent#KEYCODE_BACK KEYCODE_BACK} and
+ {@link android.app.Activity#onBackPressed Activity.onBackPressed()}
+ and related event will be forwarded to the Activities and View, otherwise those events
+ will be replaced by a call to
+ {@link android.view.OnBackInvokedCallback#onBackInvoked
+ OnBackInvokedCallback.onBackInvoked()} on the focused window. -->
+ <attr name="enableOnBackInvokedCallback" format="boolean"/>
</declare-styleable>
<!-- An attribution is a logical part of an app and is identified by a tag.
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 5e6d05a..05894d5 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2902,6 +2902,11 @@
<string name="config_sensorUseStartedActivity" translatable="false"
>com.android.systemui/com.android.systemui.sensorprivacy.SensorUseStartedActivity</string>
+ <!-- Component name of the activity used to inform a user about a sensory being blocked because
+ of hardware privacy switches. -->
+ <string name="config_sensorUseStartedActivity_hwToggle" translatable="false"
+ >com.android.systemui/com.android.systemui.sensorprivacy.SensorUseStartedActivity</string>
+
<!-- Component name of the activity used to ask a user to confirm system language change after
receiving <Set Menu Language> CEC message. -->
<string name="config_hdmiCecSetMenuLanguageActivity"
@@ -3663,6 +3668,9 @@
<!-- Controls whether the navigation bar lets through taps. -->
<bool name="config_navBarTapThrough">false</bool>
+ <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
+ <bool name="config_imeDrawsImeNavBar">false</bool>
+
<!-- Controls whether the side edge gestures can always trigger the transient nav bar to
show. -->
<bool name="config_navBarAlwaysShowOnSideEdgeGesture">false</bool>
@@ -3730,6 +3738,10 @@
must be no less than 3 for back compatibility. -->
<integer name="config_pictureInPictureMaxNumberOfActions">3</integer>
+ <!-- The behavior when an activity has not specified a preference to dock big overlays or not.
+ Docking puts the activity side-by-side next to the big overlay windows. -->
+ <bool name="config_dockBigOverlayWindows">false</bool>
+
<!-- Controls the snap mode for the docked stack divider
0 - 3 snap targets: left/top has 16:9 ratio, 1:1, and right/bottom has 16:9 ratio
1 - 3 snap targets: fixed ratio, 1:1, (1 - fixed ratio)
@@ -5470,10 +5482,16 @@
<!-- On-device package for providing companion device associations. -->
<string name="config_systemCompanionDeviceProvider" translatable="false"></string>
- <!-- Whether this device is supporting the microphone toggle -->
+ <!-- Whether this device is supporting the software microphone toggle -->
<bool name="config_supportsMicToggle">false</bool>
<!-- Whether this device is supporting the camera toggle -->
<bool name="config_supportsCamToggle">false</bool>
+ <!-- Whether this device is supporting the hardware microphone toggle -->
+ <bool name="config_supportsHardwareMicToggle">false</bool>
+ <!-- Whether this device is supporting the hardware camera toggle -->
+ <bool name="config_supportsHardwareCamToggle">false</bool>
+ <!-- Whether a camera intent is launched when the lens cover is toggled -->
+ <bool name="config_launchCameraOnCameraLensCoverToggle">true</bool>
<!-- List containing the allowed install sources for accessibility service. -->
<string-array name="config_accessibility_allowed_install_source" translatable="false"/>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 4874e65..744c3dab 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -991,4 +991,11 @@
<dimen name="secondary_rounded_corner_radius_adjustment">0px</dimen>
<dimen name="secondary_rounded_corner_radius_top_adjustment">0px</dimen>
<dimen name="secondary_rounded_corner_radius_bottom_adjustment">0px</dimen>
+
+ <!-- Default size for user icons (a.k.a. avatar images) -->
+ <dimen name="user_icon_size">190dp</dimen>
+
+ <!-- Dimensions for the translations of the default dialog animation. -->
+ <dimen name="popup_enter_animation_from_y_delta">20dp</dimen>
+ <dimen name="popup_exit_animation_to_y_delta">-10dp</dimen>
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 7bf34a1..3beb4b2 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3279,6 +3279,8 @@
<public name="allowUntrustedActivityEmbedding" />
<public name="knownActivityEmbeddingCerts" />
<public name="intro" />
+ <public name="enableOnBackInvokedCallback" />
+ <public name="supportsInlineSuggestionsWithTouchExploration" />
</staging-public-group>
<staging-public-group type="id" first-id="0x01de0000">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ff1c70a..e7eeecc 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -375,6 +375,7 @@
<java-symbol type="string" name="config_usbConfirmActivity" />
<java-symbol type="string" name="config_usbResolverActivity" />
<java-symbol type="string" name="config_sensorUseStartedActivity" />
+ <java-symbol type="string" name="config_sensorUseStartedActivity_hwToggle" />
<java-symbol type="string" name="config_hdmiCecSetMenuLanguageActivity" />
<java-symbol type="integer" name="config_minNumVisibleRecentTasks_lowRam" />
<java-symbol type="integer" name="config_maxNumVisibleRecentTasks_lowRam" />
@@ -415,6 +416,9 @@
<java-symbol type="dimen" name="config_pictureInPictureMinAspectRatio" />
<java-symbol type="dimen" name="config_pictureInPictureMaxAspectRatio" />
<java-symbol type="integer" name="config_pictureInPictureMaxNumberOfActions" />
+ <java-symbol type="dimen" name="config_pictureInPictureExpandedHorizontalHeight" />
+ <java-symbol type="dimen" name="config_pictureInPictureExpandedVerticalWidth" />
+ <java-symbol type="bool" name="config_dockBigOverlayWindows" />
<java-symbol type="dimen" name="config_closeToSquareDisplayMaxAspectRatio" />
<java-symbol type="integer" name="config_burnInProtectionMinHorizontalOffset" />
<java-symbol type="integer" name="config_burnInProtectionMaxHorizontalOffset" />
@@ -541,6 +545,7 @@
<java-symbol type="dimen" name="immersive_mode_cling_width" />
<java-symbol type="dimen" name="accessibility_magnification_indicator_width" />
<java-symbol type="dimen" name="circular_display_mask_thickness" />
+ <java-symbol type="dimen" name="user_icon_size" />
<java-symbol type="string" name="add_account_button_label" />
<java-symbol type="string" name="addToDictionary" />
@@ -2231,7 +2236,6 @@
<java-symbol type="string" name="config_dreamsDefaultComponent" />
<java-symbol type="array" name="config_supportedDreamComplications" />
<java-symbol type="array" name="config_dreamComplicationsEnabledByDefault" />
- <java-symbol type="drawable" name="default_dream_preview" />
<java-symbol type="array" name="config_disabledDreamComponents" />
<java-symbol type="string" name="config_dozeComponent" />
<java-symbol type="string" name="enable_explore_by_touch_warning_title" />
@@ -2354,6 +2358,10 @@
<java-symbol type="string" name="nas_upgrade_notification_learn_more_action" />
<java-symbol type="string" name="nas_upgrade_notification_learn_more_content" />
<java-symbol type="bool" name="config_settingsHelpLinksEnabled" />
+ <java-symbol type="integer" name="config_activityDefaultDur" />
+ <java-symbol type="integer" name="config_activityShortDur" />
+ <java-symbol type="dimen" name="popup_enter_animation_from_y_delta" />
+ <java-symbol type="dimen" name="popup_exit_animation_to_y_delta" />
<!-- ImfTest -->
<java-symbol type="layout" name="auto_complete_list" />
@@ -2994,6 +3002,7 @@
<java-symbol type="integer" name="config_navBarInteractionMode" />
<java-symbol type="bool" name="config_navBarCanMove" />
<java-symbol type="bool" name="config_navBarTapThrough" />
+ <java-symbol type="bool" name="config_imeDrawsImeNavBar" />
<java-symbol type="bool" name="config_navBarAlwaysShowOnSideEdgeGesture" />
<java-symbol type="bool" name="config_navBarNeedsScrim" />
<java-symbol type="bool" name="config_allowSeamlessRotationDespiteNavBarMoving" />
@@ -4646,6 +4655,9 @@
<java-symbol type="bool" name="config_supportsMicToggle" />
<java-symbol type="bool" name="config_supportsCamToggle" />
+ <java-symbol type="bool" name="config_supportsHardwareMicToggle" />
+ <java-symbol type="bool" name="config_supportsHardwareCamToggle" />
+ <java-symbol type="bool" name="config_launchCameraOnCameraLensCoverToggle" />
<java-symbol type="dimen" name="starting_surface_icon_size" />
<java-symbol type="dimen" name="starting_surface_default_icon_size" />
diff --git a/packages/SystemUI/res/layout/idle_host_view.xml b/core/tests/coretests/res/xml/ime_meta_inline_suggestions_with_touch_exploration.xml
similarity index 64%
rename from packages/SystemUI/res/layout/idle_host_view.xml
rename to core/tests/coretests/res/xml/ime_meta_inline_suggestions_with_touch_exploration.xml
index f407874..3440208 100644
--- a/packages/SystemUI/res/layout/idle_host_view.xml
+++ b/core/tests/coretests/res/xml/ime_meta_inline_suggestions_with_touch_exploration.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
+
<!--
- ~ Copyright (C) 2021 The Android Open Source Project
+ ~ 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.
@@ -15,9 +16,13 @@
~ limitations under the License.
-->
-
-<com.android.systemui.idle.IdleHostView
+<input-method
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/idle_host_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ android:settingsActivity="com.android.inputmethod.latin.settings.SettingsActivity"
+ android:supportsInlineSuggestionsWithTouchExploration="true"
+>
+ <subtype
+ android:label="subtype1"
+ android:imeSubtypeLocale="en_US"
+ android:imeSubtypeMode="keyboard" />
+</input-method>
diff --git a/core/tests/coretests/src/android/app/timedetector/TelephonyTimeSuggestionTest.java b/core/tests/coretests/src/android/app/timedetector/TelephonyTimeSuggestionTest.java
index 4b64dfc..cc75579 100644
--- a/core/tests/coretests/src/android/app/timedetector/TelephonyTimeSuggestionTest.java
+++ b/core/tests/coretests/src/android/app/timedetector/TelephonyTimeSuggestionTest.java
@@ -45,13 +45,13 @@
assertEquals(two, one);
}
- builder1.setUtcTime(new TimestampedValue<>(1111L, 2222L));
+ builder1.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
{
TelephonyTimeSuggestion one = builder1.build();
assertEquals(one, one);
}
- builder2.setUtcTime(new TimestampedValue<>(1111L, 2222L));
+ builder2.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
{
TelephonyTimeSuggestion one = builder1.build();
TelephonyTimeSuggestion two = builder2.build();
@@ -61,7 +61,7 @@
TelephonyTimeSuggestion.Builder builder3 =
new TelephonyTimeSuggestion.Builder(SLOT_INDEX + 1);
- builder3.setUtcTime(new TimestampedValue<>(1111L, 2222L));
+ builder3.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
{
TelephonyTimeSuggestion one = builder1.build();
TelephonyTimeSuggestion three = builder3.build();
@@ -84,7 +84,7 @@
TelephonyTimeSuggestion.Builder builder = new TelephonyTimeSuggestion.Builder(SLOT_INDEX);
assertRoundTripParcelable(builder.build());
- builder.setUtcTime(new TimestampedValue<>(1111L, 2222L));
+ builder.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
assertRoundTripParcelable(builder.build());
// DebugInfo should also be stored (but is not checked by equals()
diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
index 8718b95..e7d7d640 100644
--- a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
@@ -55,11 +55,13 @@
assertThat(imi.supportsSwitchingToNextInputMethod(), is(false));
assertThat(imi.isInlineSuggestionsEnabled(), is(false));
+ assertThat(imi.supportsInlineSuggestionsWithTouchExploration(), is(false));
final InputMethodInfo clone = cloneViaParcel(imi);
assertThat(clone.supportsSwitchingToNextInputMethod(), is(false));
assertThat(imi.isInlineSuggestionsEnabled(), is(false));
+ assertThat(imi.supportsInlineSuggestionsWithTouchExploration(), is(false));
}
@Test
@@ -85,6 +87,18 @@
}
@Test
+ public void testInlineSuggestionsEnabledWithTouchExploration() throws Exception {
+ final InputMethodInfo imi =
+ buildInputMethodForTest(R.xml.ime_meta_inline_suggestions_with_touch_exploration);
+
+ assertThat(imi.supportsInlineSuggestionsWithTouchExploration(), is(true));
+
+ final InputMethodInfo clone = cloneViaParcel(imi);
+
+ assertThat(clone.supportsInlineSuggestionsWithTouchExploration(), is(true));
+ }
+
+ @Test
public void testIsVrOnly() throws Exception {
final InputMethodInfo imi = buildInputMethodForTest(R.xml.ime_meta_vr_only);
diff --git a/core/tests/coretests/src/android/widget/FloatingToolbarUtils.java b/core/tests/coretests/src/android/widget/FloatingToolbarUtils.java
new file mode 100644
index 0000000..c6f5924
--- /dev/null
+++ b/core/tests/coretests/src/android/widget/FloatingToolbarUtils.java
@@ -0,0 +1,102 @@
+/*
+ * 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 android.widget;
+
+import static com.android.internal.widget.floatingtoolbar.FloatingToolbar.FLOATING_TOOLBAR_TAG;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.content.res.Resources;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+
+import androidx.test.InstrumentationRegistry;
+
+import com.android.internal.R;
+
+final class FloatingToolbarUtils {
+
+ private final UiDevice mDevice;
+
+ FloatingToolbarUtils() {
+ mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ }
+
+ void waitForFloatingToolbarPopup() {
+ mDevice.wait(Until.findObject(By.desc(FLOATING_TOOLBAR_TAG)), 500);
+ }
+
+ void assertFloatingToolbarIsDisplayed() {
+ waitForFloatingToolbarPopup();
+ assertThat(mDevice.hasObject(By.desc(FLOATING_TOOLBAR_TAG))).isTrue();
+ }
+
+ void assertFloatingToolbarContainsItem(String itemLabel) {
+ waitForFloatingToolbarPopup();
+ assertWithMessage("Expected to find item labelled [" + itemLabel + "]")
+ .that(mDevice.hasObject(
+ By.desc(FLOATING_TOOLBAR_TAG).hasDescendant(By.text(itemLabel))))
+ .isTrue();
+ }
+
+ void assertFloatingToolbarDoesNotContainItem(String itemLabel) {
+ waitForFloatingToolbarPopup();
+ assertWithMessage("Expected to not find item labelled [" + itemLabel + "]")
+ .that(mDevice.hasObject(
+ By.desc(FLOATING_TOOLBAR_TAG).hasDescendant(By.text(itemLabel))))
+ .isFalse();
+ }
+
+ void assertFloatingToolbarContainsItemAtIndex(String itemLabel, int index) {
+ waitForFloatingToolbarPopup();
+ assertWithMessage("Expected to find item labelled [" + itemLabel + "] at index " + index)
+ .that(mDevice.findObject(By.desc(FLOATING_TOOLBAR_TAG))
+ .findObjects(By.clickable(true))
+ .get(index)
+ .getChildren()
+ .get(1)
+ .getText())
+ .isEqualTo(itemLabel);
+ }
+
+ void clickFloatingToolbarItem(String label) {
+ waitForFloatingToolbarPopup();
+ mDevice.findObject(By.desc(FLOATING_TOOLBAR_TAG))
+ .findObject(By.text(label))
+ .click();
+ }
+
+ void clickFloatingToolbarOverflowItem(String label) {
+ // TODO: There might be a benefit to combining this with "clickFloatingToolbarItem" method.
+ waitForFloatingToolbarPopup();
+ mDevice.findObject(By.desc(FLOATING_TOOLBAR_TAG))
+ .findObject(By.desc(str(R.string.floating_toolbar_open_overflow_description)))
+ .click();
+ mDevice.wait(
+ Until.findObject(By.desc(FLOATING_TOOLBAR_TAG).hasDescendant(By.text(label))),
+ 1000);
+ mDevice.findObject(By.desc(FLOATING_TOOLBAR_TAG))
+ .findObject(By.text(label))
+ .click();
+ }
+
+ private static String str(int id) {
+ return Resources.getSystem().getString(id);
+ }
+}
diff --git a/core/tests/coretests/src/android/widget/OWNERS b/core/tests/coretests/src/android/widget/OWNERS
new file mode 100644
index 0000000..5a9aed3
--- /dev/null
+++ b/core/tests/coretests/src/android/widget/OWNERS
@@ -0,0 +1,5 @@
+include /core/java/android/widget/OWNERS
+
+per-file *SuggestionsPopup* = file:/core/java/android/text/OWNERS
+
+per-file *FloatingToolbar*, *SelectionToolbar* = file:/core/java/android/view/textclassifier/OWNERS
\ No newline at end of file
diff --git a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java
index 28f9ccc..90844ea 100644
--- a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java
+++ b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java
@@ -17,9 +17,6 @@
package android.widget;
import static android.widget.espresso.DragHandleUtils.onHandleView;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup;
import static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupContainsItem;
import static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupIsDisplayed;
import static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupIsNotDisplayed;
@@ -72,6 +69,7 @@
@Rule
public final ActivityTestRule<TextViewActivity> mActivityRule =
new ActivityTestRule<>(TextViewActivity.class);
+ private final FloatingToolbarUtils mToolbar = new FloatingToolbarUtils();
private TextViewActivity getActivity() {
return mActivityRule.getActivity();
@@ -118,22 +116,19 @@
setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('e')));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.replace));
- sleepForFloatingToolbarPopup();
- clickFloatingToolbarItem(
+ mToolbar.clickFloatingToolbarOverflowItem(
getActivity().getString(com.android.internal.R.string.replace));
assertSuggestionsPopupIsDisplayed();
}
@Test
- public void testInsertionActionMode() {
+ public void testInsertionActionMode() throws Throwable {
final String text = "abc def ghi";
onView(withId(R.id.textview)).perform(click());
onView(withId(R.id.textview)).perform(replaceText(text));
+ Thread.sleep(500);
final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(),
new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION);
@@ -141,10 +136,7 @@
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e')));
onHandleView(com.android.internal.R.id.insertion_handle).perform(click());
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.replace));
- clickFloatingToolbarItem(
+ mToolbar.clickFloatingToolbarItem(
getActivity().getString(com.android.internal.R.string.replace));
assertSuggestionsPopupIsDisplayed();
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 152992c..659cd98 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -16,15 +16,10 @@
package android.widget;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates;
import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles;
import static android.widget.espresso.DragHandleUtils.onHandleView;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup;
import static android.widget.espresso.TextViewActions.Handle;
import static android.widget.espresso.TextViewActions.clickOnTextAtIndex;
import static android.widget.espresso.TextViewActions.doubleClickOnTextAtIndex;
@@ -64,10 +59,17 @@
import android.app.Activity;
import android.app.Instrumentation;
+import android.app.PendingIntent;
+import android.app.RemoteAction;
import android.content.ClipData;
import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
import android.os.Bundle;
+import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
import android.text.InputType;
import android.text.Selection;
import android.text.Spannable;
@@ -79,6 +81,7 @@
import android.view.MenuItem;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.textclassifier.SelectionEvent;
+import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
@@ -102,6 +105,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
* Tests the TextView widget from an Activity
@@ -116,11 +120,16 @@
private Activity mActivity;
private Instrumentation mInstrumentation;
+ private UiDevice mDevice;
+ private FloatingToolbarUtils mToolbar;
@Before
- public void setUp() {
+ public void setUp() throws Exception {
mActivity = mActivityRule.getActivity();
mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mDevice = UiDevice.getInstance(mInstrumentation);
+ mDevice.wakeUp();
+ mToolbar = new FloatingToolbarUtils();
TextClassificationManager tcm = mActivity.getSystemService(
TextClassificationManager.class);
tcm.setTextClassifier(TextClassifier.NO_OP);
@@ -132,14 +141,14 @@
final String helloWorld = "Hello world!";
// We use replaceText instead of typeTextIntoFocusedView to input text to avoid
// unintentional interactions with software keyboard.
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).check(matches(withText(helloWorld)));
}
@Test
public void testPositionCursorAtTextAtIndex() {
final String helloWorld = "Hello world!";
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(helloWorld.indexOf("world")));
// Delete text at specified index and see if we got the right one.
@@ -152,7 +161,7 @@
// Arabic text. The expected cursorable boundary is
// | \u0623 \u064F | \u067A | \u0633 \u0652 |
final String text = "\u0623\u064F\u067A\u0633\u0652";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(0));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(0));
@@ -172,7 +181,7 @@
public void testPositionCursorAtTextAtIndex_devanagari() {
// Devanagari text. The expected cursorable boundary is | \u0915 \u093E |
final String text = "\u0915\u093E";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(0));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(0));
@@ -186,7 +195,7 @@
public void testLongPressToSelect() {
final String helloWorld = "Hello Kirk!";
onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).perform(
longPressOnTextAtIndex(helloWorld.indexOf("Kirk")));
@@ -196,7 +205,7 @@
@Test
public void testLongPressEmptySpace() {
final String helloWorld = "Hello big round sun!";
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
// Move cursor somewhere else
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(helloWorld.indexOf("big")));
// Long-press at end of line.
@@ -210,7 +219,7 @@
@Test
public void testLongPressAndDragToSelect() {
final String helloWorld = "Hello little handsome boy!";
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).perform(
longPressAndDragOnText(helloWorld.indexOf("little"), helloWorld.indexOf(" boy!")));
@@ -220,7 +229,7 @@
@Test
public void testLongPressAndDragToSelect_emoji() {
final String text = "\uD83D\uDE00\uD83D\uDE01\uD83D\uDE02\uD83D\uDE03";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressAndDragOnText(4, 6));
onView(withId(R.id.textview)).check(hasSelection("\uD83D\uDE02"));
@@ -234,7 +243,7 @@
@Test
public void testDragAndDrop() {
final String text = "abc def ghi.";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("e")));
onView(withId(R.id.textview)).perform(
@@ -254,7 +263,7 @@
@Test
public void testDoubleTapToSelect() {
final String helloWorld = "Hello SuetYi!";
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).perform(
doubleClickOnTextAtIndex(helloWorld.indexOf("SuetYi")));
@@ -265,7 +274,7 @@
@Test
public void testDoubleTapAndDragToSelect() {
final String helloWorld = "Hello young beautiful person!";
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).perform(doubleTapAndDragOnText(helloWorld.indexOf("young"),
helloWorld.indexOf(" person!")));
@@ -275,7 +284,7 @@
@Test
public void testDoubleTapAndDragToSelect_multiLine() {
final String helloWorld = "abcd\n" + "efg\n" + "hijklm\n" + "nop";
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).perform(
doubleTapAndDragOnText(helloWorld.indexOf("m"), helloWorld.indexOf("a")));
onView(withId(R.id.textview)).check(hasSelection("abcd\nefg\nhijklm"));
@@ -284,7 +293,7 @@
@Test
public void testSelectBackwordsByTouch() {
final String helloWorld = "Hello king of the Jungle!";
- onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+ setText(helloWorld);
onView(withId(R.id.textview)).perform(
doubleTapAndDragOnText(helloWorld.indexOf(" Jungle!"), helloWorld.indexOf("king")));
@@ -294,12 +303,11 @@
@Test
public void testToolbarAppearsAfterSelection() {
final String text = "Toolbar appears after selection.";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(
longPressOnTextAtIndex(text.indexOf("appears")));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
}
@Test
@@ -317,13 +325,12 @@
});
mInstrumentation.waitForIdleSync();
- onView(withId(R.id.textview)).perform(replaceText("test"));
+ setText("test");
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(1));
- clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.cut));
+ mToolbar.clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.cut));
onView(withId(R.id.textview)).perform(longClick());
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
}
@Test
@@ -331,8 +338,7 @@
TextLinks.TextLink textLink = addLinkifiedTextToTextView(R.id.textview);
int position = (textLink.getStart() + textLink.getEnd()) / 2;
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(position));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
}
@Test
@@ -342,23 +348,20 @@
final int position = (textLink.getStart() + textLink.getEnd()) / 2;
onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
assertTrue(textView.hasSelection());
// toggle
onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position));
- sleepForFloatingToolbarPopup();
+ mToolbar.waitForFloatingToolbarPopup();
assertFalse(textView.hasSelection());
onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
assertTrue(textView.hasSelection());
// click outside
onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(0));
- sleepForFloatingToolbarPopup();
assertFalse(textView.hasSelection());
}
@@ -372,8 +375,7 @@
});
mInstrumentation.waitForIdleSync();
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
}
@Test
@@ -385,7 +387,7 @@
final TextView textView = mActivity.findViewById(R.id.textview);
textView.setText(text);
textView.setCustomSelectionActionModeCallback(
- new ActionMode.Callback() {
+ new ActionModeCallbackAdapter() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
menu.clear();
@@ -398,29 +400,19 @@
clickedItem[0] = item;
return true;
}
-
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- return true;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode mode) {}
});
});
mInstrumentation.waitForIdleSync();
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("f")));
- sleepForFloatingToolbarPopup();
// Change the selection so that the menu items are refreshed.
final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, 0));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
- clickFloatingToolbarItem("Item");
+ mToolbar.clickFloatingToolbarItem("Item");
mInstrumentation.waitForIdleSync();
assertEquals(latestItem[0], clickedItem[0]);
@@ -469,13 +461,11 @@
mActivityRule.runOnUiThread(() -> textView.setFocusableInTouchMode(true));
onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
assertTrue(textView.hasSelection());
mActivityRule.runOnUiThread(() -> textView.clearFocus());
mInstrumentation.waitForIdleSync();
- sleepForFloatingToolbarPopup();
assertFalse(textView.hasSelection());
}
@@ -488,14 +478,12 @@
onView(withId(R.id.nonselectable_textview))
.perform(clickOnTextAtIndex(nonselectablePosition));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
assertTrue(nonselectableTextView.hasSelection());
- UiDevice device = UiDevice.getInstance(mInstrumentation);
- device.openNotification();
+ mDevice.openNotification();
Thread.sleep(2000);
- device.pressBack();
+ mDevice.pressBack();
Thread.sleep(2000);
assertFalse(nonselectableTextView.hasSelection());
@@ -528,62 +516,58 @@
}
@Test
- public void testToolbarAndInsertionHandle() {
+ public void testToolbarAndInsertionHandle() throws Throwable {
final String text = "text";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
+ Thread.sleep(500);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onHandleView(com.android.internal.R.id.insertion_handle).perform(click());
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.selectAll));
- assertFloatingToolbarDoesNotContainItem(
+ mToolbar.assertFloatingToolbarDoesNotContainItem(
mActivity.getString(com.android.internal.R.string.copy));
- assertFloatingToolbarDoesNotContainItem(
+ mToolbar.assertFloatingToolbarDoesNotContainItem(
mActivity.getString(com.android.internal.R.string.cut));
}
@Test
public void testToolbarAndSelectionHandle() {
final String text = "abcd efg hijk";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("f")));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.selectAll));
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.copy));
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.cut));
final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('a')));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
onHandleView(com.android.internal.R.id.selection_end_handle)
.perform(dragHandle(textView, Handle.SELECTION_END, text.length()));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
- assertFloatingToolbarDoesNotContainItem(
+ mToolbar.assertFloatingToolbarDoesNotContainItem(
mActivity.getString(com.android.internal.R.string.selectAll));
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.copy));
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.cut));
}
@Test
public void testInsertionHandle() {
final String text = "abcd efg hijk ";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
@@ -602,7 +586,7 @@
@Test
public void testInsertionHandle_multiLine() {
final String text = "abcd\n" + "efg\n" + "hijk\n" + "lmn\n";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
@@ -640,7 +624,7 @@
final TextView textView = mActivity.findViewById(R.id.textview);
final String text = "hello the world";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
@@ -654,7 +638,7 @@
enableFlagsForInsertionHandleGestures();
final TextView textView = mActivity.findViewById(R.id.textview);
final String text = "hello the world";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
@@ -670,7 +654,7 @@
final TextView textView = mActivity.findViewById(R.id.textview);
final String text = "hello the world";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
@@ -685,7 +669,7 @@
final TextView textView = mActivity.findViewById(R.id.textview);
final String text = "hello the world";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
@@ -698,7 +682,7 @@
@Test
public void testSelectionHandles() {
final String text = "abcd efg hijk lmn";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('f')));
@@ -720,7 +704,7 @@
@Test
public void testSelectionHandles_bidi() {
final String text = "abc \u0621\u0622\u0623 def";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('\u0622')));
@@ -762,7 +746,7 @@
@Test
public void testSelectionHandles_multiLine() {
final String text = "abcd\n" + "efg\n" + "hijk\n" + "lmn\n" + "opqr";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i')));
final TextView textView = mActivity.findViewById(R.id.textview);
@@ -790,7 +774,7 @@
final String text = "\u062A\u062B\u062C\n" + "\u062D\u062E\u062F\n"
+ "\u0630\u0631\u0632\n" + "\u0633\u0634\u0635\n" + "\u0636\u0637\u0638\n"
+ "\u0639\u063A\u063B";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('\u0634')));
final TextView textView = mActivity.findViewById(R.id.textview);
@@ -817,7 +801,7 @@
@Test
public void testSelectionHandles_doesNotPassAnotherHandle() {
final String text = "abcd efg hijk lmn";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('f')));
final TextView textView = mActivity.findViewById(R.id.textview);
@@ -834,7 +818,7 @@
@Test
public void testSelectionHandles_doesNotPassAnotherHandle_multiLine() {
final String text = "abcd\n" + "efg\n" + "hijk\n" + "lmn\n" + "opqr";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i')));
final TextView textView = mActivity.findViewById(R.id.textview);
@@ -851,7 +835,7 @@
@Test
public void testSelectionHandles_snapToWordBoundary() {
final String text = "abcd efg hijk lmn opqr";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i')));
final TextView textView = mActivity.findViewById(R.id.textview);
@@ -904,7 +888,7 @@
@Test
public void testSelectionHandles_snapToWordBoundary_multiLine() {
final String text = "abcd efg\n" + "hijk lmn\n" + "opqr stu";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('m')));
final TextView textView = mActivity.findViewById(R.id.textview);
@@ -939,7 +923,7 @@
@Test
public void testSelectionHandles_visibleEvenWithEmptyMenu() {
((TextView) mActivity.findViewById(R.id.textview)).setCustomSelectionActionModeCallback(
- new ActionMode.Callback() {
+ new ActionModeCallbackAdapter() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.clear();
@@ -951,17 +935,9 @@
menu.clear();
return true;
}
-
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- return false;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode mode) {}
});
final String text = "abcd efg hijk lmn";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('f')));
@@ -982,7 +958,7 @@
textView.setCustomSelectionActionModeCallback(amCallback);
final String text = "abc def";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
mActivityRule.runOnUiThread(
() -> Selection.setSelection((Spannable) textView.getText(), 0, 3));
mInstrumentation.waitForIdleSync();
@@ -991,15 +967,13 @@
// Make sure that "Select All" is included in the selection action mode when the entire text
// is not selected.
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('e')));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
// Changing the selection range by API should not interrupt the selection action mode.
mActivityRule.runOnUiThread(
() -> Selection.setSelection((Spannable) textView.getText(), 0, 3));
mInstrumentation.waitForIdleSync();
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.selectAll));
// Make sure that "Select All" is no longer included when the entire text is selected by
// API.
@@ -1007,9 +981,8 @@
() -> Selection.setSelection((Spannable) textView.getText(), 0, text.length()));
mInstrumentation.waitForIdleSync();
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
- assertFloatingToolbarDoesNotContainItem(
+ mToolbar.assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarDoesNotContainItem(
mActivity.getString(com.android.internal.R.string.selectAll));
// Make sure that shrinking the selection range to cursor (an empty range) by API
// terminates selection action mode and does not trigger the insertion action mode.
@@ -1020,17 +993,15 @@
// Make sure that user click can trigger the insertion action mode.
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onHandleView(com.android.internal.R.id.insertion_handle).perform(click());
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarIsDisplayed();
// Make sure that an existing insertion action mode keeps alive after the insertion point is
// moved by API.
mActivityRule.runOnUiThread(
() -> Selection.setSelection((Spannable) textView.getText(), 0));
mInstrumentation.waitForIdleSync();
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
- assertFloatingToolbarDoesNotContainItem(
+ mToolbar.assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarDoesNotContainItem(
mActivity.getString(com.android.internal.R.string.copy));
// Make sure that selection action mode is started after selection is created by API when
// insertion action mode is active.
@@ -1038,16 +1009,15 @@
() -> Selection.setSelection((Spannable) textView.getText(), 1, text.length()));
mInstrumentation.waitForIdleSync();
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarIsDisplayed();
- assertFloatingToolbarContainsItem(
+ mToolbar.assertFloatingToolbarIsDisplayed();
+ mToolbar.assertFloatingToolbarContainsItem(
mActivity.getString(com.android.internal.R.string.copy));
}
@Test
public void testTransientState() throws Throwable {
final String text = "abc def";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
final TextView textView = mActivity.findViewById(R.id.textview);
assertFalse(textView.hasTransientState());
@@ -1068,58 +1038,43 @@
@Test
public void testResetMenuItemTitle() throws Throwable {
- mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null);
+ mActivity.getSystemService(TextClassificationManager.class)
+ .setTextClassifier(TextClassifier.NO_OP);
final TextView textView = mActivity.findViewById(R.id.textview);
final int itemId = 1;
- final String title1 = " AFIGBO";
- final int index = title1.indexOf('I');
- final String title2 = title1.substring(index);
+ final String title1 = "@AFIGBO";
+ final int index = 3;
+ final String title2 = "IGBO";
final String[] title = new String[]{title1};
mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback(
- new ActionMode.Callback() {
- @Override
- public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
- return true;
- }
-
+ new ActionModeCallbackAdapter() {
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
- menu.removeItem(itemId);
+ menu.clear();
menu.add(Menu.NONE /* group */, itemId, 0 /* order */, title[0]);
return true;
}
-
- @Override
- public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
- return false;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode actionMode) {
- }
}));
mInstrumentation.waitForIdleSync();
- onView(withId(R.id.textview)).perform(replaceText(title1));
+ setText(title1);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(index));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarContainsItem(title1);
+ mToolbar.assertFloatingToolbarContainsItem(title1);
// Change the menu item title.
title[0] = title2;
// Change the selection to invalidate the action mode without restarting it.
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, index));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarContainsItem(title2);
+ mToolbar.assertFloatingToolbarContainsItem(title2);
}
@Test
public void testAssistItemIsAtIndexZero() throws Throwable {
- useSystemDefaultTextClassifier();
+ final SingleActionTextClassifier tc = useSingleActionTextClassifier();
final TextView textView = mActivity.findViewById(R.id.textview);
mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback(
- new ActionMode.Callback() {
+ new ActionModeCallbackAdapter() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
// Create another item at order position 0 to confirm that it will never be
@@ -1127,33 +1082,19 @@
menu.add(Menu.NONE, 0 /* id */, 0 /* order */, "Test");
return true;
}
-
- @Override
- public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
- return true;
- }
-
- @Override
- public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
- return false;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode actionMode) {
- }
}));
mInstrumentation.waitForIdleSync();
final String text = "droid@android.com";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('@')));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarItemIndex(android.R.id.textAssist, 0);
+ mToolbar.assertFloatingToolbarContainsItemAtIndex(tc.getActionLabel(), 0);
}
@Test
public void testNoAssistItemForPasswordField() throws Throwable {
- useSystemDefaultTextClassifier();
+ final SingleActionTextClassifier tc = useSingleActionTextClassifier();
+
final TextView textView = mActivity.findViewById(R.id.textview);
mActivityRule.runOnUiThread(() -> {
textView.setInputType(
@@ -1162,23 +1103,22 @@
mInstrumentation.waitForIdleSync();
final String password = "afigbo@android.com";
- onView(withId(R.id.textview)).perform(replaceText(password));
+ setText(password);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(password.indexOf('@')));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarDoesNotContainItem(android.R.id.textAssist);
+ mToolbar.assertFloatingToolbarDoesNotContainItem(tc.getActionLabel());
}
@Test
public void testNoAssistItemForTextFieldWithUnsupportedCharacters() throws Throwable {
- useSystemDefaultTextClassifier();
+ // NOTE: This test addresses a security bug.
+ final SingleActionTextClassifier tc = useSingleActionTextClassifier();
final String text = "\u202Emoc.diordna.com";
final TextView textView = mActivity.findViewById(R.id.textview);
mActivityRule.runOnUiThread(() -> textView.setText(text));
mInstrumentation.waitForIdleSync();
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('.')));
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarDoesNotContainItem(android.R.id.textAssist);
+ mToolbar.assertFloatingToolbarDoesNotContainItem(tc.getActionLabel());
}
@Test
@@ -1195,10 +1135,9 @@
mInstrumentation.waitForIdleSync();
final String text = "andyroid@android.com";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('@')));
- sleepForFloatingToolbarPopup();
- clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.copy));
+ mToolbar.clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.copy));
mInstrumentation.waitForIdleSync();
final SelectionEvent lastEvent = selectionEvents.get(selectionEvents.size() - 1);
@@ -1214,9 +1153,8 @@
final String text = "My number is 987654321";
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('9')));
- sleepForFloatingToolbarPopup();
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(0));
mInstrumentation.waitForIdleSync();
@@ -1247,9 +1185,8 @@
final String text = "My number is 987654321";
// Long press to trigger selection
- onView(withId(R.id.textview)).perform(replaceText(text));
+ setText(text);
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('9')));
- sleepForFloatingToolbarPopup();
// Type over the selection
onView(withId(R.id.textview)).perform(pressKey(KeyEvent.KEYCODE_A));
@@ -1291,16 +1228,14 @@
});
// Long press to trigger selection
- onView(withId(R.id.textview)).perform(replaceText("android.com"));
+ setText("android.com");
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(0));
- sleepForFloatingToolbarPopup();
// Click "Copy" to dismiss the selection.
- clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.copy));
+ mToolbar.clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.copy));
// Long press to trigger another selection
- onView(withId(R.id.textview)).perform(replaceText("android@android.com"));
+ setText("android@android.com");
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(0));
- sleepForFloatingToolbarPopup();
// suggestSelection should be called in two different TextClassifier sessions.
assertEquals(2, testableTextClassifiers.size());
@@ -1312,10 +1247,9 @@
public void testPastePlainText_menuAction() {
initializeClipboardWithText(TextStyle.STYLED);
- onView(withId(R.id.textview)).perform(replaceText(""));
+ setText("");
onView(withId(R.id.textview)).perform(longClick());
- sleepForFloatingToolbarPopup();
- clickFloatingToolbarItem(
+ mToolbar.clickFloatingToolbarItem(
mActivity.getString(com.android.internal.R.string.paste_as_plain_text));
mInstrumentation.waitForIdleSync();
@@ -1327,18 +1261,33 @@
public void testPastePlainText_noMenuItemForPlainText() {
initializeClipboardWithText(TextStyle.PLAIN);
- onView(withId(R.id.textview)).perform(replaceText(""));
+ setText("");
onView(withId(R.id.textview)).perform(longClick());
- sleepForFloatingToolbarPopup();
- assertFloatingToolbarDoesNotContainItem(
+ mToolbar.assertFloatingToolbarDoesNotContainItem(
mActivity.getString(com.android.internal.R.string.paste_as_plain_text));
}
+ private void setText(String text) {
+ onView(withId(R.id.textview)).perform(replaceText(text));
+ mDevice.wait(Until.findObject(By.text(text)), 1000);
+ mInstrumentation.waitForIdleSync();
+ }
+
private void useSystemDefaultTextClassifier() {
mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null);
}
+ private SingleActionTextClassifier useSingleActionTextClassifier() {
+ useSystemDefaultTextClassifier();
+ final TextClassificationManager tcm =
+ mActivity.getSystemService(TextClassificationManager.class);
+ final SingleActionTextClassifier oneActionTC =
+ new SingleActionTextClassifier(mActivity, tcm.getTextClassifier());
+ tcm.setTextClassifier(oneActionTC);
+ return oneActionTC;
+ }
+
private void initializeClipboardWithText(TextStyle textStyle) {
final ClipData clip;
switch (textStyle) {
@@ -1360,7 +1309,7 @@
PLAIN, STYLED
}
- private final class TestableTextClassifier implements TextClassifier {
+ private static final class TestableTextClassifier implements TextClassifier {
final List<SelectionEvent> mSelectionEvents = new ArrayList<>();
final List<TextSelection.Request> mTextSelectionRequests = new ArrayList<>();
@@ -1385,4 +1334,54 @@
return mTextSelectionRequests;
}
}
+
+ private static final class SingleActionTextClassifier implements TextClassifier {
+
+ private final RemoteAction mAction;
+ private final TextClassifier mOriginal;
+ private final TextClassification mClassificationResult;
+
+ SingleActionTextClassifier(Context context, TextClassifier original) {
+ mAction = new RemoteAction(
+ Icon.createWithResource(context, android.R.drawable.btn_star),
+ "assist",
+ "assist",
+ PendingIntent.getActivity(context, 0, new Intent(), FLAG_IMMUTABLE));
+ mClassificationResult = new TextClassification.Builder().addAction(mAction).build();
+ mOriginal = Objects.requireNonNull(original);
+ }
+
+ public String getActionLabel() {
+ return mAction.getTitle().toString();
+ }
+
+ @Override
+ public TextSelection suggestSelection(TextSelection.Request request) {
+ final TextSelection sel = mOriginal.suggestSelection(request);
+ return new TextSelection.Builder(
+ sel.getSelectionStartIndex(), sel.getSelectionEndIndex())
+ .setTextClassification(mClassificationResult)
+ .build();
+ }
+ }
+
+ private static class ActionModeCallbackAdapter implements ActionMode.Callback {
+ @Override
+ public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
+ return true;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
+ return true;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode actionMode) {}
+ }
}
diff --git a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java b/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
deleted file mode 100644
index 4f95cb8..0000000
--- a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.widget.espresso;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.action.ViewActions.click;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.RootMatchers.isPlatformPopup;
-import static androidx.test.espresso.matcher.RootMatchers.withDecorView;
-import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
-import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static androidx.test.espresso.matcher.ViewMatchers.withTagValue;
-import static androidx.test.espresso.matcher.ViewMatchers.withText;
-
-import static com.android.internal.widget.floatingtoolbar.LocalFloatingToolbarPopup.MenuItemRepr;
-
-import static org.hamcrest.Matchers.allOf;
-import static org.hamcrest.Matchers.is;
-
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.test.espresso.NoMatchingRootException;
-import androidx.test.espresso.NoMatchingViewException;
-import androidx.test.espresso.UiController;
-import androidx.test.espresso.ViewAction;
-import androidx.test.espresso.ViewInteraction;
-
-import com.android.internal.widget.floatingtoolbar.FloatingToolbar;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * Espresso utility methods for the floating toolbar.
- */
-public class FloatingToolbarEspressoUtils {
- private final static Object TAG = FloatingToolbar.FLOATING_TOOLBAR_TAG;
-
- private FloatingToolbarEspressoUtils() {}
-
- private static ViewInteraction onFloatingToolBar() {
- return onView(withTagValue(is(TAG)))
- .inRoot(allOf(
- isPlatformPopup(),
- withDecorView(hasDescendant(withTagValue(is(TAG))))));
- }
-
- /**
- * Creates a {@link ViewInteraction} for the floating bar menu item with the given matcher.
- *
- * @param matcher The matcher for the menu item.
- */
- public static ViewInteraction onFloatingToolBarItem(Matcher<View> matcher) {
- return onView(matcher)
- .inRoot(withDecorView(hasDescendant(withTagValue(is(TAG)))));
- }
-
- /**
- * Asserts that the floating toolbar is displayed on screen.
- *
- * @throws AssertionError if the assertion fails
- */
- public static void assertFloatingToolbarIsDisplayed() {
- onFloatingToolBar().check(matches(isDisplayed()));
- }
-
- /**
- * Asserts that the floating toolbar is not displayed on screen.
- *
- * @throws AssertionError if the assertion fails
- * @deprecated Negative assertions are taking too long to timeout in Espresso.
- */
- @Deprecated
- public static void assertFloatingToolbarIsNotDisplayed() {
- try {
- onFloatingToolBar().check(matches(isDisplayed()));
- } catch (NoMatchingRootException | NoMatchingViewException | AssertionError e) {
- return;
- }
- throw new AssertionError("Floating toolbar is displayed");
- }
-
- private static void toggleOverflow() {
- final int id = com.android.internal.R.id.overflow;
- onView(allOf(withId(id), isDisplayed()))
- .inRoot(withDecorView(hasDescendant(withId(id))))
- .perform(click());
- onView(isRoot()).perform(SLEEP);
- }
-
- public static void sleepForFloatingToolbarPopup() {
- onView(isRoot()).perform(SLEEP);
- }
-
- /**
- * Asserts that the floating toolbar contains the specified item.
- *
- * @param itemLabel label of the item.
- * @throws AssertionError if the assertion fails
- */
- public static void assertFloatingToolbarContainsItem(String itemLabel) {
- try{
- onFloatingToolBar().check(matches(hasDescendant(withText(itemLabel))));
- } catch (AssertionError e) {
- try{
- toggleOverflow();
- } catch (NoMatchingViewException | NoMatchingRootException e2) {
- // No overflow items.
- throw e;
- }
- try{
- onFloatingToolBar().check(matches(hasDescendant(withText(itemLabel))));
- } finally {
- toggleOverflow();
- }
- }
- }
-
- /**
- * Asserts that the floating toolbar contains a specified item at a specified index.
- *
- * @param menuItemId id of the menu item
- * @param index expected index of the menu item in the floating toolbar
- * @throws AssertionError if the assertion fails
- */
- public static void assertFloatingToolbarItemIndex(final int menuItemId, final int index) {
- onFloatingToolBar().check(matches(new TypeSafeMatcher<View>() {
- private List<Integer> menuItemIds = new ArrayList<>();
-
- @Override
- public boolean matchesSafely(View view) {
- collectMenuItemIds(view);
- return menuItemIds.size() > index && menuItemIds.get(index) == menuItemId;
- }
-
- @Override
- public void describeTo(Description description) {}
-
- private void collectMenuItemIds(View view) {
- if (view.getTag() instanceof MenuItemRepr) {
- menuItemIds.add(((MenuItemRepr) view.getTag()).itemId);
- } else if (view instanceof ViewGroup) {
- ViewGroup viewGroup = (ViewGroup) view;
- for (int i = 0; i < viewGroup.getChildCount(); i++) {
- collectMenuItemIds(viewGroup.getChildAt(i));
- }
- }
- }
- }));
- }
-
- /**
- * Asserts that the floating toolbar doesn't contain the specified item.
- *
- * @param itemLabel label of the item.
- * @throws AssertionError if the assertion fails
- */
- public static void assertFloatingToolbarDoesNotContainItem(String itemLabel) {
- final Predicate<View> hasMenuItemLabel = view ->
- view.getTag() instanceof MenuItemRepr
- && itemLabel.equals(((MenuItemRepr) view.getTag()).title);
- assertFloatingToolbarMenuItem(hasMenuItemLabel, false);
- }
-
- /**
- * Asserts that the floating toolbar does not contain a menu item with the specified id.
- *
- * @param menuItemId id of the menu item
- * @throws AssertionError if the assertion fails
- */
- public static void assertFloatingToolbarDoesNotContainItem(final int menuItemId) {
- final Predicate<View> hasMenuItemId = view ->
- view.getTag() instanceof MenuItemRepr
- && ((MenuItemRepr) view.getTag()).itemId == menuItemId;
- assertFloatingToolbarMenuItem(hasMenuItemId, false);
- }
-
- private static void assertFloatingToolbarMenuItem(
- final Predicate<View> predicate, final boolean positiveAssertion) {
- onFloatingToolBar().check(matches(new TypeSafeMatcher<View>() {
- @Override
- public boolean matchesSafely(View view) {
- return positiveAssertion == containsItem(view);
- }
-
- @Override
- public void describeTo(Description description) {}
-
- private boolean containsItem(View view) {
- if (predicate.test(view)) {
- return true;
- } else if (view instanceof ViewGroup) {
- ViewGroup viewGroup = (ViewGroup) view;
- for (int i = 0; i < viewGroup.getChildCount(); i++) {
- if (containsItem(viewGroup.getChildAt(i))) {
- return true;
- }
- }
- }
- return false;
- }
- }));
- }
-
- /**
- * Click specified item on the floating tool bar.
- *
- * @param itemLabel label of the item.
- */
- public static void clickFloatingToolbarItem(String itemLabel) {
- try{
- onFloatingToolBarItem(withText(itemLabel)).check(matches(isDisplayed()));
- } catch (AssertionError e) {
- // Try to find the item in the overflow menu.
- toggleOverflow();
- }
- onFloatingToolBarItem(withText(itemLabel)).perform(click());
- }
-
- /**
- * ViewAction to sleep to wait floating toolbar's animation.
- */
- private static final ViewAction SLEEP = new ViewAction() {
- private static final long SLEEP_DURATION = 400;
-
- @Override
- public Matcher<View> getConstraints() {
- return isDisplayed();
- }
-
- @Override
- public String getDescription() {
- return "Sleep " + SLEEP_DURATION + " ms.";
- }
-
- @Override
- public void perform(UiController uiController, View view) {
- uiController.loopMainThreadForAtLeast(SLEEP_DURATION);
- }
- };
-}
diff --git a/core/tests/coretests/src/android/window/TaskFpsCallbackTest.java b/core/tests/coretests/src/android/window/TaskFpsCallbackTest.java
index bf508db..2dadb20 100644
--- a/core/tests/coretests/src/android/window/TaskFpsCallbackTest.java
+++ b/core/tests/coretests/src/android/window/TaskFpsCallbackTest.java
@@ -53,14 +53,15 @@
@Test
public void testRegisterAndUnregister() {
- final TaskFpsCallback.OnFpsCallbackListener listener = fps -> {
- // Ignore
+ final TaskFpsCallback callback = new TaskFpsCallback() {
+ @Override
+ public void onFpsReported(float fps) {
+ // Ignore
+ }
};
- final TaskFpsCallback callback = new TaskFpsCallback(Runnable::run, listener);
-
final List<ActivityManager.RunningTaskInfo> tasks = mActivityTaskManager.getTasks(1);
assertEquals(tasks.size(), 1);
- mWindowManager.registerTaskFpsCallback(tasks.get(0).taskId, callback);
+ mWindowManager.registerTaskFpsCallback(tasks.get(0).taskId, Runnable::run, callback);
mWindowManager.unregisterTaskFpsCallback(callback);
}
}
diff --git a/core/tests/coretests/src/android/window/WindowContextControllerTest.java b/core/tests/coretests/src/android/window/WindowContextControllerTest.java
index 52cb9f3..a52d2e8 100644
--- a/core/tests/coretests/src/android/window/WindowContextControllerTest.java
+++ b/core/tests/coretests/src/android/window/WindowContextControllerTest.java
@@ -86,11 +86,13 @@
mController.attachToDisplayArea(TYPE_APPLICATION_OVERLAY, DEFAULT_DISPLAY,
null /* options */);
- assertThat(mController.mAttachedToDisplayArea).isTrue();
+ assertThat(mController.mAttachedToDisplayArea).isEqualTo(
+ WindowContextController.AttachStatus.STATUS_ATTACHED);
mController.detachIfNeeded();
- assertThat(mController.mAttachedToDisplayArea).isFalse();
+ assertThat(mController.mAttachedToDisplayArea).isEqualTo(
+ WindowContextController.AttachStatus.STATUS_DETACHED);
}
@Test(expected = IllegalStateException.class)
diff --git a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
index a1a1e20..1f2bcfb 100644
--- a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
+++ b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
@@ -83,8 +83,10 @@
mDispatcher.registerOnBackInvokedCallback(
mCallback2, OnBackInvokedDispatcher.PRIORITY_DEFAULT);
- verify(mWindowSession, times(2))
- .setOnBackInvokedCallback(Mockito.eq(mWindow), captor.capture());
+ verify(mWindowSession, times(2)).setOnBackInvokedCallback(
+ Mockito.eq(mWindow),
+ captor.capture(),
+ Mockito.eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT));
captor.getAllValues().get(0).onBackStarted();
waitForIdle();
verify(mCallback1).onBackStarted();
@@ -106,8 +108,9 @@
mDispatcher.registerOnBackInvokedCallback(
mCallback2, OnBackInvokedDispatcher.PRIORITY_DEFAULT);
- verify(mWindowSession)
- .setOnBackInvokedCallback(Mockito.eq(mWindow), captor.capture());
+ verify(mWindowSession).setOnBackInvokedCallback(
+ Mockito.eq(mWindow), captor.capture(),
+ Mockito.eq(OnBackInvokedDispatcher.PRIORITY_OVERLAY));
verifyNoMoreInteractions(mWindowSession);
captor.getValue().onBackStarted();
waitForIdle();
@@ -126,7 +129,10 @@
verifyZeroInteractions(mWindowSession);
mDispatcher.unregisterOnBackInvokedCallback(mCallback2);
- verify(mWindowSession).setOnBackInvokedCallback(Mockito.eq(mWindow), isNull());
+ verify(mWindowSession).setOnBackInvokedCallback(
+ Mockito.eq(mWindow),
+ isNull(),
+ Mockito.eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT));
}
@@ -145,8 +151,10 @@
reset(mWindowSession);
mDispatcher.registerOnBackInvokedCallback(
mCallback2, OnBackInvokedDispatcher.PRIORITY_OVERLAY);
- verify(mWindowSession)
- .setOnBackInvokedCallback(Mockito.eq(mWindow), captor.capture());
+ verify(mWindowSession).setOnBackInvokedCallback(
+ Mockito.eq(mWindow),
+ captor.capture(),
+ Mockito.eq(OnBackInvokedDispatcher.PRIORITY_OVERLAY));
captor.getValue().onBackStarted();
waitForIdle();
verify(mCallback2).onBackStarted();
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index cd42a34..23ec3ea 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -2020,6 +2020,7 @@
.check(matches(isDisplayed()));
}
+ @Ignore // b/220067877
@Test
public void testWorkTab_xProfileOff_noAppsAvailable_workOff_xProfileOffEmptyStateShown() {
// enable the work tab feature flag
@@ -2304,6 +2305,7 @@
assertThat(logger.numCalls(), is(5));
}
+ @Ignore // b/220067877
@Test
public void testCopyTextToClipboardLogging() throws Exception {
Intent sendIntent = createSendTextIntent();
diff --git a/core/tests/coretests/src/com/android/internal/infra/AndroidFutureTest.java b/core/tests/coretests/src/com/android/internal/infra/AndroidFutureTest.java
index a2bc77a..3a27225 100644
--- a/core/tests/coretests/src/com/android/internal/infra/AndroidFutureTest.java
+++ b/core/tests/coretests/src/com/android/internal/infra/AndroidFutureTest.java
@@ -29,6 +29,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
+import java.util.function.BiFunction;
/**
* Unit test for {@link AndroidFuture}.
@@ -154,4 +155,35 @@
expectThrows(ExecutionException.class, future1::get);
assertThat(executionException.getCause()).isInstanceOf(UnsupportedOperationException.class);
}
+
+ @Test
+ public void testThenCombine() throws Exception {
+ String nearFutureString = "near future comes";
+ AndroidFuture<String> nearFuture = AndroidFuture.supply(() -> nearFutureString);
+ String farFutureString = " before far future.";
+ AndroidFuture<String> farFuture = AndroidFuture.supply(() -> farFutureString);
+ AndroidFuture<String> combinedFuture =
+ nearFuture.thenCombine(farFuture, ((s1, s2) -> s1 + s2));
+
+ assertThat(combinedFuture.get()).isEqualTo(nearFutureString + farFutureString);
+ }
+
+ @Test
+ public void testThenCombine_functionThrowingException() throws Exception {
+ String nearFutureString = "near future comes";
+ AndroidFuture<String> nearFuture = AndroidFuture.supply(() -> nearFutureString);
+ String farFutureString = " before far future.";
+ AndroidFuture<String> farFuture = AndroidFuture.supply(() -> farFutureString);
+ UnsupportedOperationException exception = new UnsupportedOperationException(
+ "Unsupported operation exception thrown!");
+ BiFunction<String, String, String> throwingFunction = (s1, s2) -> {
+ throw exception;
+ };
+ AndroidFuture<String> combinedFuture = nearFuture.thenCombine(farFuture, throwingFunction);
+
+ ExecutionException thrown = expectThrows(ExecutionException.class,
+ () -> combinedFuture.get());
+
+ assertThat(thrown.getCause()).isSameInstanceAs(exception);
+ }
}
diff --git a/data/etc/Android.bp b/data/etc/Android.bp
index 88228f2..2a82d8e 100644
--- a/data/etc/Android.bp
+++ b/data/etc/Android.bp
@@ -1,4 +1,4 @@
-// Copyright (C} 2018 The Android Open Source Project
+// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License"};
// you may not use this file except in compliance with the License.
@@ -140,13 +140,6 @@
}
prebuilt_etc {
- name: "privapp_whitelist_com.android.networkstack.tethering",
- sub_dir: "permissions",
- src: "com.android.networkstack.tethering.xml",
- filename_from_src: true,
-}
-
-prebuilt_etc {
name: "privapp_whitelist_com.android.provision",
system_ext_specific: true,
sub_dir: "permissions",
diff --git a/data/etc/com.android.networkstack.tethering.xml b/data/etc/com.android.networkstack.tethering.xml
deleted file mode 100644
index f26a961..0000000
--- a/data/etc/com.android.networkstack.tethering.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
--->
-
-<permissions>
- <privapp-permissions package="com.android.networkstack.tethering">
- <permission name="android.permission.BLUETOOTH_PRIVILEGED" />
- <permission name="android.permission.MANAGE_USB"/>
- <permission name="android.permission.MODIFY_PHONE_STATE"/>
- <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
- <permission name="android.permission.TETHER_PRIVILEGED"/>
- <permission name="android.permission.UPDATE_APP_OPS_STATS"/>
- <permission name="android.permission.UPDATE_DEVICE_STATS"/>
- </privapp-permissions>
-</permissions>
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index ac5daf0..21b2cb0 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -481,6 +481,9 @@
<permission name="android.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS" />
<permission name="android.permission.NEARBY_WIFI_DEVICES" />
<permission name="android.permission.OVERRIDE_WIFI_CONFIG" />
+ <!-- Permission needed for CTS test - ConcurrencyTest#testP2pExternalApprover
+ P2P external approver API sets require MANAGE_WIFI_AUTO_JOIN permission. -->
+ <permission name="android.permission.MANAGE_WIFI_AUTO_JOIN" />
<!-- Permission required for CTS test CarrierMessagingServiceWrapperTest -->
<permission name="android.permission.BIND_CARRIER_SERVICES"/>
<!-- Permission required for CTS test - MusicRecognitionManagerTest -->
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index f2a875c7..1779655 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -1567,6 +1567,12 @@
"group": "WM_DEBUG_STATES",
"at": "com\/android\/server\/wm\/RootWindowContainer.java"
},
+ "-432881038": {
+ "message": "startBackNavigation task=%s, topRunningActivity=%s, applicationBackCallback=%s, systemBackCallback=%s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_BACK_PREVIEW",
+ "at": "com\/android\/server\/wm\/BackNavigationController.java"
+ },
"-415865166": {
"message": "findFocusedWindow: Found new focus @ %s",
"level": "VERBOSE",
@@ -2647,6 +2653,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "664667685": {
+ "message": "Activity %s: enableOnBackInvokedCallback=false. Returning null BackNavigationInfo.",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_BACK_PREVIEW",
+ "at": "com\/android\/server\/wm\/BackNavigationController.java"
+ },
"665256544": {
"message": "All windows drawn!",
"level": "DEBUG",
@@ -3691,12 +3703,6 @@
"group": "WM_DEBUG_REMOTE_ANIMATIONS",
"at": "com\/android\/server\/wm\/RemoteAnimationController.java"
},
- "1898905572": {
- "message": "startBackNavigation task=%s, topRunningActivity=%s, topWindow=%s backCallback=%s",
- "level": "DEBUG",
- "group": "WM_DEBUG_BACK_PREVIEW",
- "at": "com\/android\/server\/wm\/BackNavigationController.java"
- },
"1903353011": {
"message": "notifyAppStopped: %s",
"level": "VERBOSE",
diff --git a/graphics/java/android/graphics/text/MeasuredText.java b/graphics/java/android/graphics/text/MeasuredText.java
index 6d691c1..3f7f088 100644
--- a/graphics/java/android/graphics/text/MeasuredText.java
+++ b/graphics/java/android/graphics/text/MeasuredText.java
@@ -34,6 +34,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
/**
* Result of text shaping of the single paragraph string.
@@ -56,18 +57,22 @@
public class MeasuredText {
private static final String TAG = "MeasuredText";
- private long mNativePtr;
- private boolean mComputeHyphenation;
- private boolean mComputeLayout;
- private @NonNull char[] mChars;
+ private final long mNativePtr;
+ private final boolean mComputeHyphenation;
+ private final boolean mComputeLayout;
+ @NonNull private final char[] mChars;
+ private final int mTop;
+ private final int mBottom;
// Use builder instead.
private MeasuredText(long ptr, @NonNull char[] chars, boolean computeHyphenation,
- boolean computeLayout) {
+ boolean computeLayout, int top, int bottom) {
mNativePtr = ptr;
mChars = chars;
mComputeHyphenation = computeHyphenation;
mComputeLayout = computeLayout;
+ mTop = top;
+ mBottom = bottom;
}
/**
@@ -124,6 +129,30 @@
}
/**
+ * Retrieves the font metrics of the given range
+ *
+ * @param start an inclusive start index of the range
+ * @param end an exclusive end index of the range
+ * @param outMetrics an output metrics object
+ */
+ public void getFontMetricsInt(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
+ @NonNull Paint.FontMetricsInt outMetrics) {
+ Preconditions.checkArgument(0 <= start && start <= mChars.length,
+ "start(%d) must be 0 <= start <= %d", start, mChars.length);
+ Preconditions.checkArgument(0 <= end && end <= mChars.length,
+ "end(%d) must be 0 <= end <= %d", end, mChars.length);
+ Preconditions.checkArgument(start <= end,
+ "start(%d) is larger than end(%d)", start, end);
+ Objects.requireNonNull(outMetrics);
+
+ long packed = nGetExtent(mNativePtr, mChars, start, end);
+ outMetrics.ascent = (int) (packed >> 32);
+ outMetrics.descent = (int) (packed & 0xFFFFFFFF);
+ outMetrics.top = Math.min(outMetrics.ascent, mTop);
+ outMetrics.bottom = Math.max(outMetrics.descent, mBottom);
+ }
+
+ /**
* Returns the width of the character at the given offset.
*
* @param offset an offset of the character.
@@ -160,6 +189,8 @@
@CriticalNative
private static native float nGetCharWidthAt(long nativePtr, int offset);
+ private static native long nGetExtent(long nativePtr, char[] buf, int start, int end);
+
/**
* Helper class for creating a {@link MeasuredText}.
* <p>
@@ -189,6 +220,9 @@
private boolean mFastHyphenation = false;
private int mCurrentOffset = 0;
private @Nullable MeasuredText mHintMt = null;
+ private int mTop = 0;
+ private int mBottom = 0;
+ private Paint.FontMetricsInt mCachedMetrics = new Paint.FontMetricsInt();
/**
* Construct a builder.
@@ -269,6 +303,10 @@
nAddStyleRun(mNativePtr, paint.getNativeInstance(), lbStyle, lbWordStyle,
mCurrentOffset, end, isRtl);
mCurrentOffset = end;
+
+ paint.getFontMetricsInt(mCachedMetrics);
+ mTop = Math.min(mTop, mCachedMetrics.top);
+ mBottom = Math.max(mBottom, mCachedMetrics.bottom);
return this;
}
@@ -419,7 +457,7 @@
long ptr = nBuildMeasuredText(mNativePtr, hintPtr, mText, mComputeHyphenation,
mComputeLayout, mFastHyphenation);
final MeasuredText res = new MeasuredText(ptr, mText, mComputeHyphenation,
- mComputeLayout);
+ mComputeLayout, mTop, mBottom);
sRegistry.registerNativeAllocation(res, ptr);
return res;
} finally {
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
index d35ecbd..0bf078d 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
@@ -833,8 +833,8 @@
if (shouldExpand(null, intent, getSplitRules())) {
setLaunchingInExpandedContainer(launchingActivity, options);
- } else if (!setLaunchingToSideContainer(launchingActivity, intent, options)) {
- setLaunchingInSameContainer(launchingActivity, intent, options);
+ } else if (!splitWithLaunchingActivity(launchingActivity, intent, options)) {
+ setLaunchingInSameSideContainer(launchingActivity, intent, options);
}
return super.onStartActivity(who, intent, options);
@@ -853,9 +853,9 @@
/**
* Returns {@code true} if the activity that is going to be started via the
* {@code intent} should be paired with the {@code launchingActivity} and is set to be
- * launched in an empty side container.
+ * launched in the side container.
*/
- private boolean setLaunchingToSideContainer(Activity launchingActivity, Intent intent,
+ private boolean splitWithLaunchingActivity(Activity launchingActivity, Intent intent,
Bundle options) {
final SplitPairRule splitPairRule = getSplitRule(launchingActivity, intent,
getSplitRules());
@@ -863,9 +863,14 @@
return false;
}
- // Create a new split with an empty side container
- final TaskFragmentContainer secondaryContainer = mPresenter
- .createNewSplitWithEmptySideContainer(launchingActivity, splitPairRule);
+ // Check if there is any existing side container to launch into.
+ TaskFragmentContainer secondaryContainer = findSideContainerForNewLaunch(
+ launchingActivity, splitPairRule);
+ if (secondaryContainer == null) {
+ // Create a new split with an empty side container.
+ secondaryContainer = mPresenter
+ .createNewSplitWithEmptySideContainer(launchingActivity, splitPairRule);
+ }
// Amend the request to let the WM know that the activity should be placed in the
// dedicated container.
@@ -875,12 +880,39 @@
}
/**
+ * Finds if there is an existing split side {@link TaskFragmentContainer} that can be used
+ * for the new rule.
+ */
+ @Nullable
+ private TaskFragmentContainer findSideContainerForNewLaunch(Activity launchingActivity,
+ SplitPairRule splitPairRule) {
+ final TaskFragmentContainer launchingContainer = getContainerWithActivity(
+ launchingActivity.getActivityToken());
+ if (launchingContainer == null) {
+ return null;
+ }
+
+ // We only check if the launching activity is the primary of the split. We will check
+ // if the launching activity is the secondary in #setLaunchingInSameSideContainer.
+ final SplitContainer splitContainer = getActiveSplitForContainer(launchingContainer);
+ if (splitContainer == null
+ || splitContainer.getPrimaryContainer() != launchingContainer) {
+ return null;
+ }
+
+ if (canReuseContainer(splitPairRule, splitContainer.getSplitRule())) {
+ return splitContainer.getSecondaryContainer();
+ }
+ return null;
+ }
+
+ /**
* Checks if the activity that is going to be started via the {@code intent} should be
* paired with the existing top activity which is currently paired with the
- * {@code launchingActivity}. If so, set the activity to be launched in the same
+ * {@code launchingActivity}. If so, set the activity to be launched in the same side
* container of the {@code launchingActivity}.
*/
- private void setLaunchingInSameContainer(Activity launchingActivity, Intent intent,
+ private void setLaunchingInSameSideContainer(Activity launchingActivity, Intent intent,
Bundle options) {
final TaskFragmentContainer launchingContainer = getContainerWithActivity(
launchingActivity.getActivityToken());
@@ -911,6 +943,11 @@
return;
}
+ // Can only launch in the same container if the rules share the same presentation.
+ if (!canReuseContainer(splitPairRule, splitContainer.getSplitRule())) {
+ return;
+ }
+
// Amend the request to let the WM know that the activity should be placed in the
// dedicated container. This is necessary for the case that the activity is started
// into a new Task, or new Task will be escaped from the current host Task and be
@@ -928,4 +965,31 @@
public boolean isActivityEmbedded(@NonNull Activity activity) {
return mPresenter.isActivityEmbedded(activity.getActivityToken());
}
+
+ /**
+ * If the two rules have the same presentation, we can reuse the same {@link SplitContainer} if
+ * there is any.
+ */
+ private static boolean canReuseContainer(SplitRule rule1, SplitRule rule2) {
+ if (!isContainerReusableRule(rule1) || !isContainerReusableRule(rule2)) {
+ return false;
+ }
+ return rule1.getSplitRatio() == rule2.getSplitRatio()
+ && rule1.getLayoutDirection() == rule2.getLayoutDirection();
+ }
+
+ /**
+ * Whether it is ok for other rule to reuse the {@link TaskFragmentContainer} of the given
+ * rule.
+ */
+ private static boolean isContainerReusableRule(SplitRule rule) {
+ // We don't expect to reuse the placeholder rule.
+ if (!(rule instanceof SplitPairRule)) {
+ return false;
+ }
+ final SplitPairRule pairRule = (SplitPairRule) rule;
+
+ // Not reuse if it needs to destroy the existing.
+ return !pairRule.shouldClearTop();
+ }
}
diff --git a/core/res/res/drawable/default_dream_preview.xml b/libs/WindowManager/Shell/res/drawable/pip_ic_collapse.xml
similarity index 61%
copy from core/res/res/drawable/default_dream_preview.xml
copy to libs/WindowManager/Shell/res/drawable/pip_ic_collapse.xml
index bf4a04b..63e2a40 100644
--- a/core/res/res/drawable/default_dream_preview.xml
+++ b/libs/WindowManager/Shell/res/drawable/pip_ic_collapse.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
@@ -15,6 +14,12 @@
~ limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
- <solid android:color="@android:color/white"/>
-</shape>
\ No newline at end of file
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/tv_pip_menu_focus_border"
+ android:pathData="M12,12V4h2v4.6L20.6,2 22,3.4 15.4,10H20v2zM3.4,22L2,20.6 8.6,14H4v-2h8v8h-2v-4.6z"/>
+</vector>
diff --git a/core/res/res/drawable/default_dream_preview.xml b/libs/WindowManager/Shell/res/drawable/pip_ic_expand.xml
similarity index 63%
copy from core/res/res/drawable/default_dream_preview.xml
copy to libs/WindowManager/Shell/res/drawable/pip_ic_expand.xml
index bf4a04b..758b92c 100644
--- a/core/res/res/drawable/default_dream_preview.xml
+++ b/libs/WindowManager/Shell/res/drawable/pip_ic_expand.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
@@ -15,6 +14,12 @@
~ limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
- <solid android:color="@android:color/white"/>
-</shape>
\ No newline at end of file
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/tv_pip_menu_focus_border"
+ android:pathData="M3,21v-8h2v4.6L17.6,5H13V3h8v8h-2V6.4L6.4,19H11v2z"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
index 5beaa87..9592376 100644
--- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
+++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
@@ -22,81 +22,101 @@
<!-- The background of the top-level layout acts as the background dim. -->
- <!-- Setting the alpha of the dialog container to 0, since it shouldn't be visible until the
+ <!-- Vertical margin will be set dynamically since it depends on task bounds.
+ Setting the alpha of the dialog container to 0, since it shouldn't be visible until the
enter animation starts. -->
- <LinearLayout
+ <FrameLayout
android:id="@+id/letterbox_education_dialog_container"
- android:layout_width="wrap_content"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center_horizontal"
- android:orientation="vertical"
+ android:layout_marginHorizontal="@dimen/letterbox_education_dialog_margin"
android:background="@drawable/letterbox_education_dialog_background"
- android:padding="24dp"
- android:alpha="0">
+ android:alpha="0"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintWidth_max="@dimen/letterbox_education_dialog_width"
+ app:layout_constrainedHeight="true">
- <ImageView
- android:id="@+id/letterbox_education_icon"
- android:layout_width="@dimen/letterbox_education_dialog_icon_size"
- android:layout_height="@dimen/letterbox_education_dialog_icon_size"
- android:layout_marginBottom="12dp"
- android:src="@drawable/letterbox_education_ic_letterboxed_app"/>
-
- <TextView
- android:id="@+id/letterbox_education_dialog_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:maxWidth="@dimen/letterbox_education_dialog_title_max_width"
- android:lineSpacingExtra="4sp"
- android:text="@string/letterbox_education_dialog_title"
- android:textAlignment="center"
- android:textColor="@color/compat_controls_text"
- android:textSize="24sp"/>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
- android:maxWidth="@dimen/letterbox_education_dialog_title_max_width"
- android:lineSpacingExtra="4sp"
- android:text="@string/letterbox_education_dialog_subtext"
- android:textAlignment="center"
- android:textColor="@color/letterbox_education_text_secondary"
- android:textSize="14sp"/>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="top"
- android:orientation="horizontal"
- android:paddingTop="48dp">
-
- <com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogActionLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:icon="@drawable/letterbox_education_ic_screen_rotation"
- app:text="@string/letterbox_education_screen_rotation_text"/>
-
- <com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogActionLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/letterbox_education_dialog_space_between_actions"
- app:icon="@drawable/letterbox_education_ic_reposition"
- app:text="@string/letterbox_education_reposition_text"/>
-
- </LinearLayout>
-
- <Button
- android:id="@+id/letterbox_education_dialog_dismiss_button"
+ <!-- The ScrollView should only wrap the content of the dialog, otherwise the background
+ corner radius will be cut off when scrolling to the top/bottom. -->
+ <ScrollView
android:layout_width="match_parent"
- android:layout_height="56dp"
- android:layout_marginTop="48dp"
- android:background="@drawable/letterbox_education_dismiss_button_background_ripple"
- android:text="@string/letterbox_education_got_it"
- android:textColor="@android:color/system_neutral1_900"
- android:textAlignment="center"
- android:contentDescription="@string/letterbox_education_got_it"/>
+ android:layout_height="wrap_content">
- </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:orientation="vertical"
+ android:padding="24dp">
+
+ <ImageView
+ android:layout_width="@dimen/letterbox_education_dialog_icon_size"
+ android:layout_height="@dimen/letterbox_education_dialog_icon_size"
+ android:layout_marginBottom="12dp"
+ android:src="@drawable/letterbox_education_ic_letterboxed_app"/>
+
+ <TextView
+ android:id="@+id/letterbox_education_dialog_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:lineSpacingExtra="4sp"
+ android:text="@string/letterbox_education_dialog_title"
+ android:textAlignment="center"
+ android:textColor="@color/compat_controls_text"
+ android:textSize="24sp"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:lineSpacingExtra="4sp"
+ android:text="@string/letterbox_education_dialog_subtext"
+ android:textAlignment="center"
+ android:textColor="@color/letterbox_education_text_secondary"
+ android:textSize="14sp"/>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="top"
+ android:orientation="horizontal"
+ android:paddingTop="48dp">
+
+ <com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogActionLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:icon="@drawable/letterbox_education_ic_screen_rotation"
+ app:text="@string/letterbox_education_screen_rotation_text"/>
+
+ <com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogActionLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart=
+ "@dimen/letterbox_education_dialog_space_between_actions"
+ app:icon="@drawable/letterbox_education_ic_reposition"
+ app:text="@string/letterbox_education_reposition_text"/>
+
+ </LinearLayout>
+
+ <Button
+ android:id="@+id/letterbox_education_dialog_dismiss_button"
+ android:layout_width="match_parent"
+ android:layout_height="56dp"
+ android:layout_marginTop="48dp"
+ android:background=
+ "@drawable/letterbox_education_dismiss_button_background_ripple"
+ android:text="@string/letterbox_education_got_it"
+ android:textColor="@android:color/system_neutral1_900"
+ android:textAlignment="center"
+ android:contentDescription="@string/letterbox_education_got_it"/>
+
+ </LinearLayout>
+
+ </ScrollView>
+
+ </FrameLayout>
</com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogLayout>
diff --git a/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml b/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml
index b56b114..b826d03 100644
--- a/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml
@@ -20,25 +20,36 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <HorizontalScrollView
+ <ScrollView
+ android:id="@+id/tv_pip_menu_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_centerHorizontal="true"
- android:gravity="center"
+ android:gravity="center_horizontal"
android:scrollbars="none"
- android:layout_centerInParent="true"
+ android:layout_margin="@dimen/pip_menu_outer_space"
+ android:visibility="gone"/>
+
+ <HorizontalScrollView
+ android:id="@+id/tv_pip_menu_horizontal_scroll"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:scrollbars="none"
android:layout_margin="@dimen/pip_menu_outer_space">
<LinearLayout
android:id="@+id/tv_pip_menu_action_buttons"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:paddingStart="@dimen/pip_menu_button_wrapper_margin"
- android:paddingEnd="@dimen/pip_menu_button_wrapper_margin"
android:gravity="center"
+ android:layout_gravity="center"
android:orientation="horizontal"
android:alpha="0">
+ <Space
+ android:layout_width="@dimen/pip_menu_button_wrapper_margin"
+ android:layout_height="@dimen/pip_menu_button_wrapper_margin"/>
+
<com.android.wm.shell.pip.tv.TvPipMenuActionButton
android:id="@+id/tv_pip_menu_fullscreen_button"
android:layout_width="wrap_content"
@@ -54,6 +65,14 @@
android:text="@String/pip_move" />
<com.android.wm.shell.pip.tv.TvPipMenuActionButton
+ android:id="@+id/tv_pip_menu_expand_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/pip_ic_collapse"
+ android:visibility="gone"
+ android:text="@string/pip_collapse" />
+
+ <com.android.wm.shell.pip.tv.TvPipMenuActionButton
android:id="@+id/tv_pip_menu_close_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -62,6 +81,10 @@
<!-- More TvPipMenuActionButtons may be added here at runtime. -->
+ <Space
+ android:layout_width="@dimen/pip_menu_button_wrapper_margin"
+ android:layout_height="@dimen/pip_menu_button_wrapper_margin"/>
+
</LinearLayout>
</HorizontalScrollView>
diff --git a/libs/WindowManager/Shell/res/layout/tv_pip_menu_action_button.xml b/libs/WindowManager/Shell/res/layout/tv_pip_menu_action_button.xml
index f9d0968..a86a145 100644
--- a/libs/WindowManager/Shell/res/layout/tv_pip_menu_action_button.xml
+++ b/libs/WindowManager/Shell/res/layout/tv_pip_menu_action_button.xml
@@ -20,8 +20,7 @@
android:id="@+id/button"
android:layout_width="@dimen/pip_menu_button_size"
android:layout_height="@dimen/pip_menu_button_size"
- android:layout_marginStart="@dimen/pip_menu_button_margin"
- android:layout_marginEnd="@dimen/pip_menu_button_margin"
+ android:layout_margin="@dimen/pip_menu_button_margin"
android:background="@drawable/tv_pip_button_bg"
android:focusable="true">
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index e45e409..88382d7 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerakwessies?\nTik om aan te pas"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nie opgelos nie?\nTik om terug te stel"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen kamerakwessies nie? Tik om toe te maak."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Kry die meeste uit <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Draai jou skerm na portret"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Draai jou skerm na landskap"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Sleep nog \'n program in om verdeelde skerm te gebruik"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dubbeltik om te herposisioneer"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Het dit"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 3a1f619..20d081f 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"የካሜራ ችግሮች አሉ?\nዳግም ለማበጀት መታ ያድርጉ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"አልተስተካከለም?\nለማህደር መታ ያድርጉ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ከ<xliff:g id="APP_NAME">%s</xliff:g> ማግኘት የሚችሉትን ያግኙ"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"የቁመት አቀማመጥ ለማድረግ ማያ ገጽዎን ያሽከርክሩት"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"የአግድም አቀማመጥ ለማድረግ ማያ ገጽዎን ያሽከርክሩት"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"የተከፈለ ማያ ገጽ ለመጠቀም ሌላ መተግበሪያ ይጎትቱ"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ቦታ ለመቀየር ሁለቴ መታ ያድርጉ"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ገባኝ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index 1b890f5..b41e642 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"هل هناك مشاكل في الكاميرا؟\nانقر لإعادة الضبط."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ألم يتم حل المشكلة؟\nانقر للعودة"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"أليس هناك مشاكل في الكاميرا؟ انقر للإغلاق."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"الاستفادة إلى أقصى حدّ من <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"تدوير الشاشة للوضع العمودي"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"تدوير الشاشة إلى الوضع الأفقي"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"اسحب تطبيقًا آخر لاستخدام وضع تقسيم الشاشة"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"انقر مرتين لتغيير الموضع"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"حسنًا"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml
index a700fbf..663691f 100644
--- a/libs/WindowManager/Shell/res/values-as/strings.xml
+++ b/libs/WindowManager/Shell/res/values-as/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"কেমেৰাৰ কোনো সমস্যা হৈছে নেকি?\nপুনৰ খাপ খোৱাবলৈ টিপক"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এইটো সমাধান কৰা নাই নেকি?\nপূৰ্বাৱস্থালৈ নিবলৈ টিপক"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"কেমেৰাৰ কোনো সমস্যা নাই নেকি? অগ্ৰাহ্য কৰিবলৈ টিপক।"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>পাৰ্যমানে ব্যৱহাৰ কৰক"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"প’ৰ্ট্ৰেইট কৰিবলৈ স্ক্ৰীনখন ঘূৰাওক"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"লেণ্ডস্কেইপ কৰিবলৈ স্ক্ৰীনখন ঘূৰাওক"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰিবলৈ অন্য এটা এপ্ ইয়ালৈ টানি আনি এৰক"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"স্থান সলনি কৰিবলৈ দুবাৰ টিপক"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"বুজি পালোঁ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index 0dba934..646aba8 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera problemi var?\nBərpa etmək üçün toxunun"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Düzəltməmisiniz?\nGeri qaytarmaq üçün toxunun"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera problemi yoxdur? Qapatmaq üçün toxunun."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> tətbiqindən maksimum faydalanın"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ekranı fırladaraq portret rejiminə keçin"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ekranı fırladaraq albom rejiminə keçin"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Bölünmüş ekrandan istifadə etmək üçün başqa tətbiqə sürüşdürün"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Yerini dəyişdirmək üçün iki dəfə toxunun"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Anladım"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
index afe411b..2ebdf92 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Imate problema sa kamerom?\nDodirnite da biste ponovo uklopili"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije rešen?\nDodirnite da biste vratili"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema sa kamerom? Dodirnite da biste odbacili."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Iskoristite aplikaciju <xliff:g id="APP_NAME">%s</xliff:g> na najbolji način"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotirajte ekran u uspravni položaj"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotirajte ekran u vodoravni položaj"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Prevucite drugu aplikaciju da biste koristili podeljeni ekran"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvaput dodirnite radi premeštanja"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Važi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml
index ef692c2..157e168 100644
--- a/libs/WindowManager/Shell/res/values-be/strings.xml
+++ b/libs/WindowManager/Shell/res/values-be/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Праблемы з камерай?\nНацісніце, каб пераабсталяваць"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не ўдалося выправіць?\nНацісніце, каб аднавіць"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ніякіх праблем з камерай? Націсніце, каб адхіліць."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Выкарыстоўвайце ўсе магчымасці праграмы \"<xliff:g id="APP_NAME">%s</xliff:g>\""</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Павярніце экран у кніжную арыентацыю"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Павярніце экран у альбомную арыентацыю"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Перацягніце іншую праграму, каб выкарыстоўваць падзелены экран"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Двойчы націсніце, каб перасунуць"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Зразумела"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index 4ca46b5..4ed8672 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблеми с камерата?\nДокоснете за ремонтиране"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблемът не се отстрани?\nДокоснете за връщане в предишното състояние"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нямате проблеми с камерата? Докоснете, за да отхвърлите."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Използване на <xliff:g id="APP_NAME">%s</xliff:g> в пълна степен"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Завъртете екрана си вертикално"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Завъртете екрана си хоризонтално"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Преместете друго приложение с плъзгане, за да използвате режима за разделен екран"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Докоснете два пъти за промяна на позицията"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Разбрах"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index fa62bba..7579fac 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ক্যামেরা সংক্রান্ত সমস্যা?\nরিফিট করতে ট্যাপ করুন"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এখনও সমাধান হয়নি?\nরিভার্ট করার জন্য ট্যাপ করুন"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ক্যামেরা সংক্রান্ত সমস্যা নেই? বাতিল করতে ট্যাপ করুন।"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>-এর সবচেয়ে বেশি সুবিধা নিন"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"আপনার স্ক্রিন ঘুরিয়ে পোর্ট্রেট করুন"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"আপনার স্ক্রিন ঘুরিয়ে ল্যান্ডস্কেপ করুন"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"স্প্লিট স্ক্রিন ফিচার ব্যবহার করতে অন্য অ্যাপে টেনে আনুন"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"জায়গা পরিবর্তন করতে ডবল ট্যাপ করুন"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"বুঝেছি"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index 043a309..7b08d03 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s kamerom?\nDodirnite da ponovo namjestite"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nije popravljeno?\nDodirnite da vratite"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nema problema s kamerom? Dodirnite da odbacite."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Iskoristite sve prednosti aplikacije <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zarotirajte ekran u uspravni položaj"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zarotirajte ekran u vodoravni položaj"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Prevucite još jednu aplikaciju da koristite podijeljeni ekran"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dodirnite dvaput da premjestite"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Razumijem"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index 3ee8a23..44429cc 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tens problemes amb la càmera?\nToca per resoldre\'ls"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"El problema no s\'ha resolt?\nToca per desfer els canvis"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No tens cap problema amb la càmera? Toca per ignorar."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Treu el màxim profit de l\'aplicació <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gira la pantalla per posar-la en vertical"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gira la pantalla per posar-la en horitzontal"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrossega una altra aplicació per utilitzar la pantalla dividida"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Fes doble toc per canviar la posició"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Entesos"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index 00e5827..d6e7136 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s fotoaparátem?\nKlepnutím vyřešíte"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepomohlo to?\nKlepnutím se vrátíte"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Žádné problémy s fotoaparátem? Klepnutím zavřete."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Využijte <xliff:g id="APP_NAME">%s</xliff:g> na maximum"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Otočením obrazovky přejdete do zobrazení na výšku"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Otočením obrazovky přejdete do zobrazení na šířku"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Přetáhnutím druhé aplikace použijete rozdělenou obrazovku"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvojitým klepnutím změníte umístění"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml
index bdcb6d8..e7b8e73 100644
--- a/libs/WindowManager/Shell/res/values-da/strings.xml
+++ b/libs/WindowManager/Shell/res/values-da/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du problemer med dit kamera?\nTryk for at gendanne det oprindelige format"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Løste det ikke problemet?\nTryk for at fortryde"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen problemer med dit kamera? Tryk for at afvise."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Få mest muligt ud af <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Roter din skærm til stående format"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Roter din skærm til liggende format"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Træk en anden app hertil for at bruge opdelt skærm"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Tryk to gange for at flytte"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index 472e941..57af696c 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Probleme mit der Kamera?\nZum Anpassen tippen."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Das Problem ist nicht behoben?\nZum Rückgängigmachen tippen."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Keine Probleme mit der Kamera? Zum Schließen tippen."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> optimal nutzen"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Display ins Hochformat drehen"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Display ins Querformat drehen"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Weitere App hierher ziehen, um den Bildschirm zu teilen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Doppeltippen, um Position anzupassen"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Ok"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index 53edf1e..873b329 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Προβλήματα με την κάμερα;\nΠατήστε για επιδιόρθωση."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Δεν διορθώθηκε;\nΠατήστε για επαναφορά."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Δεν αντιμετωπίζετε προβλήματα με την κάμερα; Πατήστε για παράβλεψη."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Αξιοποιήστε όλες τις δυνατότητες του <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Περιστροφή της οθόνης σε προσανατολισμό πορτρέτου"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Περιστροφή της οθόνης σε οριζόντιο προσανατολισμό"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Σύρετε σε μια άλλη εφαρμογή για να χρησιμοποιήσετε τον διαχωρισμό οθόνης"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Διπλό πάτημα για επανατοποθέτηση"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Το κατάλαβα"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index eb806a7..da4933b 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
index eb806a7..da4933b 100644
--- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index eb806a7..da4933b 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index eb806a7..da4933b 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
index 62123eb..5c3d0f6 100644
--- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
@@ -76,10 +76,9 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <string name="letterbox_education_dialog_title" msgid="6688664582871779215">"Some apps work best in portrait"</string>
+ <string name="letterbox_education_dialog_subtext" msgid="4853542518367719562">"Try one of these options to make the most of your space"</string>
+ <string name="letterbox_education_screen_rotation_text" msgid="5085786687366339027">"Rotate your device to go full screen"</string>
+ <string name="letterbox_education_reposition_text" msgid="1068293354123934727">"Double-tap next to an app to reposition it"</string>
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
index 6db0975..154c7ab 100644
--- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Tienes problemas con la cámara?\nPresiona para reajustarla"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se resolvió?\nPresiona para revertir los cambios"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No tienes problemas con la cámara? Presionar para descartar."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Aprovecha <xliff:g id="APP_NAME">%s</xliff:g> al máximo"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rota la pantalla al modo vertical"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rota la pantalla al modo horizontal"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrastra otra app para usar la pantalla dividida"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Presiona dos veces para cambiar la posición"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index 4356dc8..e2fa3a0 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Problemas con la cámara?\nToca para reajustar"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Saca el máximo partido de <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gira la pantalla para ponerla en el modo de vista vertical"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gira la pantalla para ponerla en el modo de vista horizontal"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrastra otra aplicación para usar la pantalla dividida"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toca dos veces para cambiar de posición"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml
index 3dba8cc..da33f4d 100644
--- a/libs/WindowManager/Shell/res/values-et/strings.xml
+++ b/libs/WindowManager/Shell/res/values-et/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kas teil on kaameraprobleeme?\nPuudutage ümberpaigutamiseks."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Kas probleemi ei lahendatud?\nPuudutage ennistamiseks."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kas kaameraprobleeme pole? Puudutage loobumiseks."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Kasutage <xliff:g id="APP_NAME">%s</xliff:g> võimalusi"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Pöörake ekraan vertikaalpaigutusse"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Pöörake ekraan horisontaalpaigutusse"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Lohistage muusse rakendusse, et jagatud ekraanikuva kasutada"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Topeltpuudutage ümberpaigutamiseks"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Selge"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index ab70b3a..e0dd3ca2 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Arazoak dauzkazu kamerarekin?\nBerriro doitzeko, sakatu hau."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ez al da konpondu?\nLeheneratzeko, sakatu hau."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ez daukazu arazorik kamerarekin? Baztertzeko, sakatu hau."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Atera ahalik eta etekin handiena <xliff:g id="APP_NAME">%s</xliff:g> aplikazioari"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Edukia bertikalki ikusteko, biratu pantaila"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Edukia horizontalki ikusteko, biratu pantaila"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Pantaila zatituta ikusteko, arrastatu beste aplikazio bat"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Aplikazioaren posizioa aldatzeko, saka ezazu birritan"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Ados"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml
index bef49d3..6fcb5ee 100644
--- a/libs/WindowManager/Shell/res/values-fa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fa/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"دوربین مشکل دارد؟\nبرای تنظیم مجدد اندازه ضربه بزنید"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"مشکل برطرف نشد؟\nبرای برگرداندن ضربه بزنید"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"دوربین مشکلی ندارد؟ برای بستن ضربه بزنید."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"بیشترین بهره را از <xliff:g id="APP_NAME">%s</xliff:g> ببرید"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"صفحهنمایش را در جهت عمودی بچرخانید"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"صفحهنمایش را در جهت افقی بچرخانید"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"برای استفاده از صفحهٔ دونیمه، در برنامهای دیگر بکشید"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"برای تغییر مکان، دوضربه بزنید"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"متوجهام"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index c5b9ece..fc51ad4 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Onko kameran kanssa ongelmia?\nKorjaa napauttamalla"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Eikö ongelma ratkennut?\nKumoa napauttamalla"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ei ongelmia kameran kanssa? Hylkää napauttamalla."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> niin kuin se on tarkoitettu"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Vaihda pystysuuntaan kääntämällä näyttöä"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Vaihda vaakasuuntaan kääntämällä näyttöä"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Käytä jaettua näyttöä vetämällä tähän toinen sovellus"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Sijoita uudelleen kaksoisnapauttamalla"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index 5689b59..43fad3a 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo?\nTouchez pour réajuster"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu?\nTouchez pour rétablir"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo? Touchez pour ignorer."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Profitez de toutes les possibilités de <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Faites pivoter votre écran pour passer en mode portrait"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Faites pivoter votre écran pour passer en mode paysage"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Faites glisser une autre application pour utiliser l\'écran partagé"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Touchez deux fois pour repositionner"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index 670a242..8b8cc09 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo ?\nAppuyez pour réajuster"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu ?\nAppuyez pour rétablir"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo ? Appuyez pour ignorer."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Tirez le meilleur parti de <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Faites pivoter votre écran en mode Portrait"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Faites pivoter votre écran en mode Paysage"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Faites glisser une autre application pour utiliser l\'écran partagé"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Appuyez deux fois pour repositionner"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml
index 0559838..9bc9d93 100644
--- a/libs/WindowManager/Shell/res/values-gl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gl/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tes problemas coa cámara?\nToca para reaxustala"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Non se solucionaron os problemas?\nToca para reverter o seu tratamento"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Non hai problemas coa cámara? Tocar para ignorar."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Sácalle o máximo partido a <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Xira a pantalla para poñela en modo vertical"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Xira a pantalla para poñela en modo horizontal"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrastra outra aplicación para usar a pantalla dividida"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toca dúas veces para cambiar a posición"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index ec3093a..032b591 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"કૅમેરામાં સમસ્યાઓ છે?\nફરીથી ફિટ કરવા માટે ટૅપ કરો"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"સુધારો નથી થયો?\nપહેલાંના પર પાછું ફેરવવા માટે ટૅપ કરો"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"કૅમેરામાં કોઈ સમસ્યા નથી? છોડી દેવા માટે ટૅપ કરો."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>નો સૌથી વધુ લાભ મેળવો"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"પોર્ટ્રેટ સ્થિતિ માટે તમારી સ્ક્રીનને ફેરવો"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"લૅન્ડસ્કેપ સ્થિતિ માટે તમારી સ્ક્રીનને ફેરવો"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"સ્ક્રીન વિભાજનનો ઉપયોગ કરવા કોઈ અન્ય ઍપમાં ખેંચો"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"સ્થાનમાં ફેરફાર કરવા માટે બે વાર ટૅપ કરો"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"સમજાઈ ગયું"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index d1776d8..72fd65c 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्या कैमरे से जुड़ी कोई समस्या है?\nफिर से फ़िट करने के लिए टैप करें"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"क्या समस्या ठीक नहीं हुई?\nपहले जैसा करने के लिए टैप करें"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्या कैमरे से जुड़ी कोई समस्या नहीं है? खारिज करने के लिए टैप करें."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> का ज़्यादा से ज़्यादा फ़ायदा पाएं"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"अपनी स्क्रीन को घुमाकर, पोर्ट्रेट मोड में लाएं"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"अपनी स्क्रीन को घुमाकर, लैंडस्केप मोड में लाएं"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"स्प्लिट स्क्रीन का इस्तेमाल करने के लिए, दूसरे ऐप्लिकेशन को खींचें और छोड़ें"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ऐप्लिकेशन की जगह बदलने के लिए, दो बार टैप करें"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ठीक है"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml
index 0986090..5315558 100644
--- a/libs/WindowManager/Shell/res/values-hr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hr/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s fotoaparatom?\nDodirnite za popravak"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije riješen?\nDodirnite za vraćanje"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema s fotoaparatom? Dodirnite za odbacivanje."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Iskoristite sve prednosti aplikacije <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zakrenite zaslon u okomiti položaj"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zakrenite zaslon u vodoravni položaj"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Povucite drugu aplikaciju da biste upotrebljavali podijeljeni zaslon"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvaput dodirnite za premještanje"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Shvaćam"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index f4027fb..01671c9 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerával kapcsolatos problémába ütközött?\nKoppintson a megoldáshoz."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nem sikerült a hiba kijavítása?\nKoppintson a visszaállításhoz."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nincsenek problémái kamerával? Koppintson az elvetéshez."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Használja ki a(z) <xliff:g id="APP_NAME">%s</xliff:g> minden előnyét"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Képernyő elforgatása álló módba"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Képernyő elforgatása fekvő módba"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Húzzon ide egy másik alkalmazást az osztott képernyő használatához"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Koppintson duplán az áthelyezéshez"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Értem"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index c934695..459cd0a 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Տեսախցիկի հետ կապված խնդիրնե՞ր կան։\nՀպեք՝ վերակարգավորելու համար։"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Չհաջողվե՞ց շտկել։\nՀպեք՝ փոփոխությունները չեղարկելու համար։"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Տեսախցիկի հետ կապված խնդիրներ չկա՞ն։ Փակելու համար հպեք։"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Օգտվեք <xliff:g id="APP_NAME">%s</xliff:g>-ի բոլոր հնարավորություններից"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Պտտեք էկրանը ուղղաձիգ դիրքի"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Պտտեք էկրանը հորիզոնական դիրքի"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Քաշեք մյուս հավելվածի մեջ՝ էկրանի տրոհումն օգտագործելու համար"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Կրկնակի հպեք՝ դիրքը փոխելու համար"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Եղավ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index 5976fe1..e5b7421 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Masalah kamera?\nKetuk untuk memperbaiki"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tidak dapat diperbaiki?\nKetuk untuk mengembalikan"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tidak ada masalah kamera? Ketuk untuk menutup."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Optimalkan penggunaan <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Putar layar ke mode potret"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Putar layar ke mode lanskap"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Tarik aplikasi lain untuk menggunakan layar terpisah"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ketuk dua kali untuk mengubah posisi"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Oke"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml
index ee9940a..1bfec2b 100644
--- a/libs/WindowManager/Shell/res/values-is/strings.xml
+++ b/libs/WindowManager/Shell/res/values-is/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Myndavélavesen?\nÝttu til að breyta stærð"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ennþá vesen?\nÝttu til að afturkalla"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ekkert myndavélavesen? Ýttu til að hunsa."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Nýttu <xliff:g id="APP_NAME">%s</xliff:g> sem best"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Snúðu skjánum í skammsnið"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Snúðu skjánum í langsnið"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Dragðu annað forrit inn til að nota skjáskiptingu"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ýttu tvisvar til að breyta staðsetningu"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Ég skil"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml
index f12289e..ebdf44b 100644
--- a/libs/WindowManager/Shell/res/values-it/strings.xml
+++ b/libs/WindowManager/Shell/res/values-it/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi con la fotocamera?\nTocca per risolverli"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Usa al meglio l\'app <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ruota lo schermo in verticale"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ruota lo schermo in orizzontale"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Trascina in un\'altra app per usare lo schermo diviso"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Tocca due volte per riposizionare"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index eb63a21..3a0f72b 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"בעיות במצלמה?\nאפשר להקיש כדי לבצע התאמה מחדש"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"הבעיה לא נפתרה?\nאפשר להקיש כדי לחזור לגרסה הקודמת"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"אין בעיות במצלמה? אפשר להקיש כדי לסגור."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"להפיק את המרב מ-<xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"מסובבים את המסך כדי להציג לאורך"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"מסובבים את המסך כדי להציג לרוחב"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"גוררים אפליקציה אחרת כדי להשתמש במסך מפוצל"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"מקישים הקשה כפולה כדי למקם מחדש"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"הבנתי"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml
index c6399e3..7b3ad24 100644
--- a/libs/WindowManager/Shell/res/values-ja/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ja/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"カメラに関する問題の場合は、\nタップすると修正できます"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"修正されなかった場合は、\nタップすると元に戻ります"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"カメラに関する問題でない場合は、タップすると閉じます。"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> の活用法"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"縦向きにするには画面を回転します"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"横向きにするには画面を回転します"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"分割画面を使用するにはもう 1 つのアプリをドラッグします"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"位置を変更するにはダブルタップします"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index 4155236..07ee0f9 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"კამერად პრობლემები აქვს?\nშეეხეთ გამოსასწორებლად"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"არ გამოსწორდა?\nშეეხეთ წინა ვერსიის დასაბრუნებლად"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"კამერას პრობლემები არ აქვს? შეეხეთ უარყოფისთვის."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"მაქსიმალურად გამოიყენეთ <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"პორტრეტის რეჟიმზე გადასასვლელად შეატრიალეთ თქვენი ეკრანი"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ლანდშაფტის რეჟიმზე გადასასვლელად შეატრიალეთ თქვენი ეკრანი"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ეკრანის გასაყოფად ჩავლებით გადაიტანეთ სხვა აპში"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"პოზიციის შესაცვლელად ორჯერ შეეხეთ"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"გასაგებია"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index f93dab5..bdaa03e 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада қателер шықты ма?\nЖөндеу үшін түртіңіз."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Жөнделмеді ме?\nҚайтару үшін түртіңіз."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада қателер шықпады ма? Жабу үшін түртіңіз."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> мүмкіндіктерін барынша пайдаланыңыз"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Көлденеңінен ашу үшін экранды бұрыңыз."</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Тігінен ашу үшін экранды бұрыңыз."</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Экранды бөлу үшін басқа қолданбаға өтіңіз."</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Қалпын өзгерту үшін екі рет түртіңіз."</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Түсінікті"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml
index 3fedb24..2654765 100644
--- a/libs/WindowManager/Shell/res/values-km/strings.xml
+++ b/libs/WindowManager/Shell/res/values-km/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"មានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាឬ?\nចុចដើម្បីដោះស្រាយ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"មិនបានដោះស្រាយបញ្ហានេះទេឬ?\nចុចដើម្បីត្រឡប់"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"មិនមានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាទេឬ? ចុចដើម្បីច្រានចោល។"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ទទួលបានអត្ថប្រយោជន៍ច្រើនបំផុតពី <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"បង្វិលអេក្រង់របស់អ្នកទៅទិសដៅបញ្ឈរ"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"បង្វិលអេក្រង់របស់អ្នកទៅទិសដៅផ្ដេក"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"អូសនៅក្នុងកម្មវិធីផ្សេងទៀត ដើម្បីប្រើមុខងារបំបែកអេក្រង់"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ចុចពីរដង ដើម្បីប្ដូរទីតាំង"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"យល់ហើយ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml
index 49203e5..6edbf13 100644
--- a/libs/WindowManager/Shell/res/values-kn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kn/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿವೆಯೇ?\nಮರುಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ಅದನ್ನು ಸರಿಪಡಿಸಲಿಲ್ಲವೇ?\nಹಿಂತಿರುಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿಲ್ಲವೇ? ವಜಾಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ನಿಂದ ಹೆಚ್ಚಿನ ಪ್ರಯೋಜನವನ್ನು ಪಡೆದುಕೊಳ್ಳಿ"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಪೋರ್ಟ್ರೇಟ್ಗೆ ತಿರುಗಿಸಿ"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್ಗೆ ತಿರುಗಿಸಿ"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಬಳಸಲು ಬೇರೊಂದು ಆ್ಯಪ್ ಅನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ಸರಿಹೊಂದಿಸಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ಸರಿ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index 6164ed9..1f8d0b0 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"카메라 문제가 있나요?\n해결하려면 탭하세요."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> 최대한 활용하기"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"세로 모드로 화면을 회전합니다."</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"가로 모드로 화면을 회전합니다."</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"화면 분할을 사용하려면 다른 앱에 드래그합니다."</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"두 번 탭하여 위치를 조정합니다."</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"확인"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index 29091fb..81eb2d7 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада маселелер келип чыктыбы?\nОңдоо үчүн таптаңыз"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Оңдолгон жокпу?\nАртка кайтаруу үчүн таптаңыз"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада маселе жокпу? Этибарга албоо үчүн таптаңыз."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> колдонмосунун бардык мүмкүнчүлүктөрүн колдонуңуз"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Экранды тигинен буруңуз"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Экранды туурасынан буруңуз"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Экранды бөлүү үчүн башка колдонмого сүйрөңүз"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ракурсту өзгөртүү үчүн эки жолу басыңыз"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Түшүндүм"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index 20b15ee..3252130 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ?\nແຕະເພື່ອປັບໃໝ່"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ບໍ່ໄດ້ແກ້ໄຂມັນບໍ?\nແຕະເພື່ອແປງກັບຄືນ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ບໍ່ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ? ແຕະເພື່ອປິດໄວ້."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ໃຊ້ປະໂຫຍດສູງສຸດຈາກ <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ໝຸນໜ້າຈໍຂອງທ່ານເປັນລວງຕັ້ງ"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ໝຸນໜ້າຈໍຂອງທ່ານເປັນລວງນອນ"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ລາກແອັບອື່ນເຂົ້າມາເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ແຕະສອງເທື່ອເພື່ອປ່ຽນຕຳແໜ່ງ"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ເຂົ້າໃຈແລ້ວ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml
index 80f2815..70654c7 100644
--- a/libs/WindowManager/Shell/res/values-lt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lt/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Iškilo problemų dėl kameros?\nPalieskite, kad pritaikytumėte iš naujo"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepavyko pataisyti?\nPalieskite, kad grąžintumėte"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nėra jokių problemų dėl kameros? Palieskite, kad atsisakytumėte."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Išnaudokite visas „<xliff:g id="APP_NAME">%s</xliff:g>“ galimybes"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Pasukite ekraną stačiai"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Pasukite ekraną gulsčiai"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Vilkite kitoje programoje, kad galėtumėte naudoti išskaidyto ekrano režimą"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Keiskite vietą dukart paliesdami"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Supratau"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index a66b29e..74d1b3f 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Vai ir problēmas ar kameru?\nPieskarieties, lai tās novērstu."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Vai problēma netika novērsta?\nPieskarieties, lai atjaunotu."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Vai nav problēmu ar kameru? Pieskarieties, lai nerādītu."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Izmantojiet visas lietotnes <xliff:g id="APP_NAME">%s</xliff:g> sniegtās iespējas"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Pagrieziet ekrānu, lai iestatītu portreta režīmu"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Pagrieziet ekrānu, lai iestatītu ainavas režīmu"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Velciet uz citu lietotni, lai izmantotu dalītu ekrānu"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Veiciet dubultskārienu, lai mainītu pozīciju"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Labi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index 9502a89..be6ed4d 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми со камерата?\nДопрете за да се совпадне повторно"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не се поправи?\nДопрете за враќање"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нема проблеми со камерата? Допрете за отфрлање."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Извлечете го максимумот од <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ротирајте го екранот во портрет"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ротирајте го екранот во пејзаж"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Повлечете друга апликација за да користите поделен екран"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Допрете двапати за да преместите"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Сфатив"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml
index 7f2c977..14a341b 100644
--- a/libs/WindowManager/Shell/res/values-ml/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ml/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ക്യാമറ പ്രശ്നങ്ങളുണ്ടോ?\nശരിയാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"അത് പരിഹരിച്ചില്ലേ?\nപുനഃസ്ഥാപിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ക്യാമറാ പ്രശ്നങ്ങളൊന്നുമില്ലേ? നിരസിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> പരമാവധി പ്രയോജനപ്പെടുത്തുക"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"പോർട്രെയ്റ്റിന് നിങ്ങളുടെ സ്ക്രീൻ റൊട്ടേറ്റ് ചെയ്യുക"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ലാൻഡ്സ്കേപ്പിന് നിങ്ങളുടെ സ്ക്രീൻ റൊട്ടേറ്റ് ചെയ്യുക"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കാൻ മറ്റൊരു ആപ്പിൽ വലിച്ചിടുക"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"സ്ഥാനം മാറ്റാൻ ഡബിൾ ടാപ്പ് ചെയ്യുക"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"മനസ്സിലായി"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index ce4f4e1..b59f282 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерын асуудал гарсан уу?\nДахин тааруулахын тулд товшино уу"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Үүнийг засаагүй юу?\nБуцаахын тулд товшино уу"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерын асуудал байхгүй юу? Хаахын тулд товшино уу."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>-г бүрэн ашиглаарай"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Дэлгэцээ босоо байрлал руу эргүүлнэ үү"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Дэлгэцээ хөндлөн байрлал руу эргүүлнэ үү"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Дэлгэц хуваахыг ашиглахын тулд өөр аппыг чирнэ үү"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Дахин байрлуулахын тулд хоёр товшино уу"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Ойлголоо"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index 2a7ecbe..3d2d6a3 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"कॅमेराशी संबंधित काही समस्या आहेत का?\nपुन्हा फिट करण्यासाठी टॅप करा"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"निराकरण झाले नाही?\nरिव्हर्ट करण्यासाठी कृपया टॅप करा"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"कॅमेराशी संबंधित कोणत्याही समस्या नाहीत का? डिसमिस करण्यासाठी टॅप करा."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> चा पुरेपूर वापर करा"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"तुमची स्क्रीन पोर्ट्रेटवर फिरवा"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"तुमची स्क्रीन लॅंडस्केपवर फिरवा"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"स्प्लिट स्क्रीन वापरण्यासाठी दुसऱ्या ॲपमध्ये ड्रॅग करा"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"जागा बदलण्यासाठी दोनदा टॅप करा"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"समजले"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml
index c1ec74f..4e9a7e9 100644
--- a/libs/WindowManager/Shell/res/values-ms/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ms/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Isu kamera?\nKetik untuk memuatkan semula"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Isu tidak dibetulkan?\nKetik untuk kembali"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tiada isu kamera? Ketik untuk mengetepikan."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Manfaatkan <xliff:g id="APP_NAME">%s</xliff:g> sepenuhnya"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Putar skrin anda kepada potret"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Putar skrin anda kepada landskap"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Seret ke dalam apl lain untuk menggunakan skrin pisah"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ketik dua kali untuk menempatkan semula"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index fc1868f..449e502 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ကင်မရာပြဿနာလား။\nပြင်ဆင်ရန် တို့ပါ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ကောင်းမသွားဘူးလား။\nပြန်ပြောင်းရန် တို့ပါ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ကင်မရာပြဿနာ မရှိဘူးလား။ ပယ်ရန် တို့ပါ။"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ကို အကောင်းဆုံးအသုံးချခြင်း"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"သင့်စခရင်ကို ဒေါင်လိုက်လှည့်နိုင်သည်"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"သင့်စခရင်ကို အလျားလိုက်လှည့်နိုင်သည်"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းသုံးရန် အက်ပ်နောက်တစ်ခုကို ဖိဆွဲနိုင်သည်"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"နေရာပြန်ချရန် နှစ်ချက်တို့နိုင်သည်"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ရပြီ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index 3eda48a..2172cc5 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du kameraproblemer?\nTrykk for å tilpasse"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ble ikke problemet løst?\nTrykk for å gå tilbake"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen kameraproblemer? Trykk for å lukke."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Få mest mulig ut av <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Roter skjermen til stående format"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Roter skjermen til liggende format"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Dra inn en annen app for å bruke delt skjerm"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dobbelttrykk for å flytte"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Greit"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index 25db78e..ff01dcd 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्यामेरासम्बन्धी समस्या देखियो?\nसमस्या हल गर्न ट्याप गर्नुहोस्"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"समस्या हल भएन?\nपहिलेको जस्तै बनाउन ट्याप गर्नुहोस्"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्यामेरासम्बन्धी कुनै पनि समस्या छैन? खारेज गर्न ट्याप गर्नुहोस्।"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> बाट बढीभन्दा बढी फाइदा लिनुहोस्"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"आफ्नो स्क्रिन पोर्ट्रेट मोडमा रोटेट गर्नुहोस्"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"आफ्नो स्क्रिन ल्यान्डस्केप मोडमा रोटेट गर्नुहोस्"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"तपाईं स्प्लिट स्क्रिन मोड प्रयोग गर्न चाहनुहुन्छ भने अर्को एप ड्रयाग एन्ड ड्रप गर्नुहोस्"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"एप यताउता सार्न डबल ट्याप गर्नुहोस्"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"बुझेँ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
index 8f74258..428cb3f 100644
--- a/libs/WindowManager/Shell/res/values-nl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Cameraproblemen?\nTik om opnieuw passend te maken."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Is dit geen oplossing?\nTik om terug te zetten."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen cameraproblemen? Tik om te sluiten."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Haal het maximale uit <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Draai je scherm naar de staande stand"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Draai je scherm naar de liggende stand"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Sleep een andere app hier naartoe om het scherm te splitsen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dubbeltik om te herpositioneren"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index a709297..f9668a1 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"କ୍ୟାମେରାରେ ସମସ୍ୟା ଅଛି?\nପୁଣି ଫିଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ଏହାର ସମାଧାନ ହୋଇନାହିଁ?\nଫେରିଯିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"କ୍ୟାମେରାରେ କିଛି ସମସ୍ୟା ନାହିଁ? ଖାରଜ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>ରୁ ସବୁଠାରୁ ଅଧିକ ସୁବିଧା ପାଆନ୍ତୁ"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ପୋଟ୍ରେଟ ସ୍ଥିତି ପାଇଁ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ରୋଟେଟ କରନ୍ତୁ"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ଲ୍ୟାଣ୍ଡସ୍କେପ ସ୍ଥିତି ପାଇଁ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ରୋଟେଟ କରନ୍ତୁ"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନ୍ୟ ଏକ ଆପକୁ ଡ୍ରାଗ କରନ୍ତୁ"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ରିପୋଜିସନ ପାଇଁ ଦୁଇଥର ଟାପ କରନ୍ତୁ"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ବୁଝିଗଲି"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml
index 8c15678..7132597 100644
--- a/libs/WindowManager/Shell/res/values-pa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pa/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ?\nਮੁੜ-ਫਿੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ਕੀ ਇਹ ਠੀਕ ਨਹੀਂ ਹੋਈ?\nਵਾਪਸ ਉਹੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ? ਖਾਰਜ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਲਾਹਾ ਲਓ"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ਪੋਰਟਰੇਟ ਕਰਨ ਲਈ ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਓ"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ਲੈਂਡਸਕੇਪ ਕਰਨ ਲਈ ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਓ"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਕਿਸੇ ਹੋਰ ਐਪ ਵਿੱਚ ਘਸੀਟੋ"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ਜਗ੍ਹਾ ਬਦਲਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ਸਮਝ ਲਿਆ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index 8097995..f7f97ef 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemy z aparatem?\nKliknij, aby dopasować"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Naprawa się nie udała?\nKliknij, aby cofnąć"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Brak problemów z aparatem? Kliknij, aby zamknąć"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Wykorzystaj wszystkie możliwości aplikacji <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Obróć ekran do orientacji pionowej"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Obróć ekran do orientacji poziomej"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Przeciągnij drugą aplikację, aby podzielić ekran"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Kliknij dwukrotnie, aby zmienić położenie"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index 644e80e..a3d2ab0 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Aproveite o app <xliff:g id="APP_NAME">%s</xliff:g> ao máximo"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gire a tela para o modo retrato"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gire a tela para o modo paisagem"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arraste outro app para usar a tela dividida"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toque duas vezes para reposicionar"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
index fac38a5..86872c8 100644
--- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmara?\nToque aqui para reajustar"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Não foi corrigido?\nToque para reverter"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nenhum problema com a câmara? Toque para ignorar."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Tire o máximo partido da app <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rode o ecrã para vertical"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rode o ecrã para horizontal"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arraste para utilizar o ecrã dividido"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toque duas vezes para reposicionar"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index 644e80e..a3d2ab0 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Aproveite o app <xliff:g id="APP_NAME">%s</xliff:g> ao máximo"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gire a tela para o modo retrato"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gire a tela para o modo paisagem"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arraste outro app para usar a tela dividida"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toque duas vezes para reposicionar"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index e7d96cb..5448e45 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Aveți probleme cu camera foto?\nAtingeți pentru a reîncadra"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nu ați remediat problema?\nAtingeți pentru a reveni"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nu aveți probleme cu camera foto? Atingeți pentru a închide."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Beneficiați de toate avantajele <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotiți ecranul în orientarea portret"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotiți ecranul în orientarea peisaj"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Trageți în altă aplicație pentru a folosi ecranul împărțit"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Atingeți de două ori pentru a repoziționa"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml
index 046497d..64e74a2 100644
--- a/libs/WindowManager/Shell/res/values-ru/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ru/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблемы с камерой?\nНажмите, чтобы исправить."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не помогло?\nНажмите, чтобы отменить изменения."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нет проблем с камерой? Нажмите, чтобы закрыть."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Используйте все возможности приложения \"<xliff:g id="APP_NAME">%s</xliff:g>\""</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Поверните экран в вертикальное положение."</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Поверните экран в горизонтальное положение."</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Перетащите сюда другое приложение, чтобы использовать разделение экрана."</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Нажмите дважды, чтобы переместить окно."</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ОК"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml
index 0c604ff..3cdaa72 100644
--- a/libs/WindowManager/Shell/res/values-si/strings.xml
+++ b/libs/WindowManager/Shell/res/values-si/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"කැමරා ගැටලුද?\nයළි සවි කිරීමට තට්ටු කරන්න"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"එය විසඳුවේ නැතිද?\nප්රතිවර්තනය කිරීමට තට්ටු කරන්න"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"කැමරා ගැටලු නොමැතිද? ඉවත දැමීමට තට්ටු කරන්න"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> වෙතින් උපරිම ප්රයෝජන ගන්න"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ඔබගේ තිරය ප්රතිමූර්තියට කරකවන්න"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ඔබගේ තිරය භූදර්ශනයට කරකවන්න"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"බෙදුම් තිරය භාවිත කිරීමට තවත් යෙදුමක් මෙතැනට අදින්න"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"නැවත ස්ථානගත කිරීමට දෙවරක් තට්ටු කරන්න"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"තේරුණා"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml
index f651080..daa2021 100644
--- a/libs/WindowManager/Shell/res/values-sk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sk/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s kamerou?\nKlepnutím znova upravte."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nevyriešilo sa to?\nKlepnutím sa vráťte."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemáte problémy s kamerou? Klepnutím zatvoríte."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Využívajte aplikáciu <xliff:g id="APP_NAME">%s</xliff:g> naplno"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Otočenie obrazovky na výšku"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Otočenie obrazovky na šírku"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Ak chcete použiť rozdelenú obrazovku, presuňte do inej aplikácie"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvojitým klepnutím premiestníte"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Dobre"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml
index 104b9a5..b4c7b95 100644
--- a/libs/WindowManager/Shell/res/values-sl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sl/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Težave s fotoaparatom?\nDotaknite se za vnovično prilagoditev"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"To ni odpravilo težave?\nDotaknite se za povrnitev"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nimate težav s fotoaparatom? Dotaknite se za opustitev."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Izkoristite aplikacijo <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zasuk zaslona v pokončni položaj"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zasuk zaslona v ležeči položaj"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Za razdeljeni zaslon povlecite sem še eno aplikacijo."</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvakrat se dotaknite za prestavljanje."</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"V redu"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index d0d485a..5051351 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ka probleme me kamerën?\nTrokit për ta ripërshtatur"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nuk u rregullua?\nTrokit për ta rikthyer"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nuk ka probleme me kamerën? Trokit për ta shpërfillur."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Përfito sa më shumë nga <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rrotulloje ekranin vertikalisht"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rrotulloje ekranin horizontalisht"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Zvarrite në një aplikacion tjetër për të përdorur ekranin e ndarë"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Trokit dy herë për ta risistemuar"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"E kuptova"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index 3b44181..96bb48a 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблема са камером?\nДодирните да бисте поново уклопили"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблем није решен?\nДодирните да бисте вратили"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немате проблема са камером? Додирните да бисте одбацили."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Искористите апликацију <xliff:g id="APP_NAME">%s</xliff:g> на најбољи начин"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ротирајте екран у усправни положај"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ротирајте екран у водоравни положај"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Превуците другу апликацију да бисте користили подељени екран"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Двапут додирните ради премештања"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Важи"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index b066c9f..9fa5c19 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problem med kameran?\nTryck för att anpassa på nytt"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Löstes inte problemet?\nTryck för att återställa"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Inga problem med kameran? Tryck för att ignorera."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Få ut mesta möjliga av <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotera skärmen till stående läge"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotera skärmen till liggande läge"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Dra en annan app hit för att dela upp skärmen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Tryck snabbt två gånger för att flytta"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index ea9d885..8c026f9 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Je, kuna hitilafu za kamera?\nGusa ili urekebishe"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Umeshindwa kurekebisha?\nGusa ili urejeshe nakala ya awali"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Je, hakuna hitilafu za kamera? Gusa ili uondoe."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Nufaika zaidi na <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zungusha skrini iwe wima"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zungusha skrini yako iwe mlalo"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Buruta ndani programu nyingine ili utumie skrini iliyogawanyika"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Gusa mara mbili ili uweke kwenye nafasi yake"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Nimeelewa"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index 30b9813..cb3d138 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"கேமரா தொடர்பான சிக்கல்களா?\nமீண்டும் பொருத்த தட்டவும்"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"சிக்கல்கள் சரிசெய்யப்படவில்லையா?\nமாற்றியமைக்க தட்டவும்"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"கேமரா தொடர்பான சிக்கல்கள் எதுவும் இல்லையா? நிராகரிக்க தட்டவும்."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ஆப்ஸில் அதிகப் பலன்களைப் பெறுங்கள்"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"திரையைப் போர்ட்ரெய்ட் பயன்முறைக்குச் சுழற்றலாம்"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"திரையை லேண்ட்ஸ்கேப் பயன்முறைக்குச் சுழற்றலாம்"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"திரைப் பிரிப்பைப் பயன்படுத்த மற்றொரு ஆப்ஸை இழுக்கலாம்"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"இடம் மாற்ற இருமுறை தட்டலாம்"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"சரி"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index fc4ab39..7589e70 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"కెమెరా సమస్యలు ఉన్నాయా?\nరీఫిట్ చేయడానికి ట్యాప్ చేయండి"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"దాని సమస్యను పరిష్కరించలేదా?\nపూర్వస్థితికి మార్చడానికి ట్యాప్ చేయండి"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"కెమెరా సమస్యలు లేవా? తీసివేయడానికి ట్యాప్ చేయండి."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> నుండి మరిన్ని పొందండి"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"మీ స్క్రీన్ను పోర్ట్రెయిట్కు తిప్పండి"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"మీ స్క్రీన్ను ల్యాండ్స్కేప్కు తిప్పండి"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"స్ప్లిట్ స్క్రీన్ను ఉపయోగించడానికి మరొక యాప్లోకి లాగండి"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"స్థానాన్ని మార్చడానికి రెండుసార్లు నొక్కండి"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"అర్థమైంది"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml
index be0d61b..d8a33ff 100644
--- a/libs/WindowManager/Shell/res/values-th/strings.xml
+++ b/libs/WindowManager/Shell/res/values-th/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"หากพบปัญหากับกล้อง\nแตะเพื่อแก้ไข"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"หากไม่ได้แก้ไข\nแตะเพื่อเปลี่ยนกลับ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"หากไม่พบปัญหากับกล้อง แตะเพื่อปิด"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ใช้ประโยชน์สูงสุดจาก <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"หมุนหน้าจอเป็นแนวตั้ง"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"หมุนหน้าจอเป็นแนวนอน"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ลากไปไว้ในแอปอื่นเพื่อใช้การแบ่งหน้าจอ"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"แตะสองครั้งเพื่อเปลี่ยนตำแหน่ง"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"รับทราบ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml
index cb8bb1d..35a58b3 100644
--- a/libs/WindowManager/Shell/res/values-tl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tl/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"May mga isyu sa camera?\nI-tap para i-refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Hindi ito naayos?\nI-tap para i-revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Walang isyu sa camera? I-tap para i-dismiss."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Sulitin ang <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"I-rotate sa portrait ang iyong screen"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"I-rotate sa landscape ang iyong screen"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Mag-drag ng ibang app para gamitin ang split screen"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"I-double tap para baguhin ang puwesto"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index 7f78fe9..8a9fb75 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kameranızda sorun mu var?\nDüzeltmek için dokunun"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bu işlem sorunu düzeltmedi mi?\nİşlemi geri almak için dokunun"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kameranızda sorun yok mu? Kapatmak için dokunun."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> uygulamasından en iyi şekilde yararlanma"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Dikey görüntüleme için ekranınızı döndürün"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Yatay görüntüleme için ekranınızı döndürün"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Bölünmüş ekran kullanmak için başka bir uygulamayı sürükleyin"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Yeniden konumlandırmak için iki kez dokunun"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Anladım"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index 08fc023..aac9031 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми з камерою?\nНатисніть, щоб пристосувати"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблему не вирішено?\nНатисніть, щоб скасувати зміни"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немає проблем із камерою? Торкніться, щоб закрити."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Використовуйте всі можливості додатка <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Змініть орієнтацію екрана на портретну"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Змініть орієнтацію екрана на альбомну"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Щоб перейти в режим розділення екрана, перетягніть інший додаток"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Двічі торкніться, щоб перемістити"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ОK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index cea12e5..e3bab32 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"کیمرے کے مسائل؟\nدوبارہ فٹ کرنے کیلئے تھپتھپائیں"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"یہ حل نہیں ہوا؟\nلوٹانے کیلئے تھپتھپائیں"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"کوئی کیمرے کا مسئلہ نہیں ہے؟ برخاست کرنے کیلئے تھپتھپائیں۔"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> سے بھر پور فائدہ حاصل کریں"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"اپنی سکرین کو پورٹریٹ میں گھمائيں"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"اپنی اسکرین کو لینڈ اسکیپ میں گھمائیں"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"اسپلٹ اسکرین استعمال کرنے کے ليے دوسری ایپ میں گھسیٹیں"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"پوزیشن تبدیل کرنے کے ليے دو بار تھپتھپائیں"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"سمجھ آ گئی"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml
index 980e46e..54ec89a 100644
--- a/libs/WindowManager/Shell/res/values-uz/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uz/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera nosozmi?\nQayta moslash uchun bosing"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tuzatilmadimi?\nQaytarish uchun bosing"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera muammosizmi? Yopish uchun bosing."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ilovasidan unumli foydalaning"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Boʻyiga koʻrishuchun ekranni buring"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Eniga koʻrish uchun ekranni buring"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Ekranni boʻlish xususiyatidan foydalanish uchun boshqa ilovani bu yerga torting"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Joyini oʻzgartirish uchun ikki marta bosing"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index 2f33799..b683702 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Có vấn đề với máy ảnh?\nHãy nhấn để sửa lỗi"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bạn chưa khắc phục vấn đề?\nHãy nhấn để hủy bỏ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Không có vấn đề với máy ảnh? Hãy nhấn để đóng."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Khai thác tối đa <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Xoay màn hình sang chế độ dọc"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Xoay màn hình sang chế độ ngang"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Kéo vào một ứng dụng khác để dùng chế độ chia đôi màn hình"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Nhấn đúp để thay đổi vị trí"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index 48465c3..811d860 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相机有问题?\n点按即可整修"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"没有解决此问题?\n点按即可恢复"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相机没有问题?点按即可忽略。"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"充分利用 <xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"将屏幕旋转成纵向模式"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"将屏幕旋转成横向模式"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"拖入另一个应用,即可使用分屏模式"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"点按两次即可调整位置"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"知道了"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index 18f7fa2..2a01714 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題?\n輕按即可修正"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未能修正問題?\n輕按即可還原"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機冇問題?㩒一下就可以即可閂咗佢。"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"充分善用「<xliff:g id="APP_NAME">%s</xliff:g>」"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"將螢幕旋轉為直向"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"將螢幕旋轉為橫向"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"拖入另一個應用程式即可使用分割螢幕"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"輕按兩下即可調整位置"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"知道了"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index 7bc48ae..292a439 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題嗎?\n輕觸即可修正"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未修正問題嗎?\n輕觸即可還原"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機沒問題嗎?輕觸即可關閉。"</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"充分發揮「<xliff:g id="APP_NAME">%s</xliff:g>」的各項功能"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"將螢幕轉成直向"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"將螢幕轉成橫向"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"拖進另一個應用程式即可使用分割畫面"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"輕觸兩下即可調整位置"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"我知道了"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index 5da9fa1..389eb08 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -76,10 +76,13 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Izinkinga zekhamera?\nThepha ukuze uyilinganise kabusha"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Akuyilungisanga?\nThepha ukuze ubuyele"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Azikho izinkinga zekhamera? Thepha ukuze ucashise."</string>
- <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Thola okuningi ku-<xliff:g id="APP_NAME">%s</xliff:g>"</string>
- <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zungezisa isikrini sakho sime ngobude"</string>
- <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zungezisa isikrini sakho sibe sime ngokuvundla"</string>
- <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Hudula kwenye i-app ukuze usebenzise isikrini esihlukanisiwe"</string>
- <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Thepha kabili ukuze ubeke kabusha"</string>
+ <!-- no translation found for letterbox_education_dialog_title (6688664582871779215) -->
+ <skip />
+ <!-- no translation found for letterbox_education_dialog_subtext (4853542518367719562) -->
+ <skip />
+ <!-- no translation found for letterbox_education_screen_rotation_text (5085786687366339027) -->
+ <skip />
+ <!-- no translation found for letterbox_education_reposition_text (1068293354123934727) -->
+ <skip />
<string name="letterbox_education_got_it" msgid="4057634570866051177">"Ngiyezwa"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 7a398c5..8a8231d 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -225,15 +225,18 @@
<!-- The size of an icon in the letterbox education dialog. -->
<dimen name="letterbox_education_dialog_icon_size">48dp</dimen>
+ <!-- The fixed width of the dialog if there is enough space in the parent. -->
+ <dimen name="letterbox_education_dialog_width">472dp</dimen>
+
+ <!-- The margin between the dialog container and its parent. -->
+ <dimen name="letterbox_education_dialog_margin">16dp</dimen>
+
<!-- The width of each action container in the letterbox education dialog -->
<dimen name="letterbox_education_dialog_action_width">140dp</dimen>
<!-- The space between two actions in the letterbox education dialog -->
<dimen name="letterbox_education_dialog_space_between_actions">24dp</dimen>
- <!-- The maximum width of the title and subtitle in the letterbox education dialog. -->
- <dimen name="letterbox_education_dialog_title_max_width">444dp</dimen>
-
<!-- The width of the brand image on staring surface. -->
<dimen name="starting_surface_brand_image_width">200dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings_tv.xml b/libs/WindowManager/Shell/res/values/strings_tv.xml
index 730d808..c7b8a13 100644
--- a/libs/WindowManager/Shell/res/values/strings_tv.xml
+++ b/libs/WindowManager/Shell/res/values/strings_tv.xml
@@ -33,5 +33,11 @@
<!-- Button to move picture-in-picture (PIP) via DPAD in the PIP menu [CHAR LIMIT=30] -->
<string name="pip_move">Move PIP</string>
+
+ <!-- Button to expand the picture-in-picture (PIP) window [CHAR LIMIT=30] -->
+ <string name="pip_expand">Expand PIP</string>
+
+ <!-- Button to collapse/shrink the picture-in-picture (PIP) window [CHAR LIMIT=30] -->
+ <string name="pip_collapse">Collapse PIP</string>
</resources>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
index 4c505f6..7cf3597 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
@@ -43,4 +43,11 @@
default IBackAnimation createExternalInterface() {
return null;
}
+
+ /**
+ * Sets the threshold values that defining edge swipe behavior.
+ * @param triggerThreshold the min threshold to trigger back.
+ * @param progressThreshold the max threshold to keep progressing back animation.
+ */
+ void setSwipeThresholds(float triggerThreshold, float progressThreshold);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
index 32ac43d..9b41468 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
@@ -35,6 +35,7 @@
import android.os.SystemProperties;
import android.util.Log;
import android.view.MotionEvent;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.window.BackEvent;
import android.window.BackNavigationInfo;
@@ -51,9 +52,10 @@
*/
public class BackAnimationController implements RemoteCallable<BackAnimationController> {
- private static final String BACK_PREDICTABILITY_PROP = "persist.debug.back_predictability";
- public static final boolean IS_ENABLED = SystemProperties
- .getInt(BACK_PREDICTABILITY_PROP, 0) > 0;
+ private static final String BACK_PREDICTABILITY_PROGRESS_THRESHOLD_PROP =
+ "persist.debug.back_predictability_progress_threshold";
+ private static final int PROGRESS_THRESHOLD = SystemProperties
+ .getInt(BACK_PREDICTABILITY_PROGRESS_THRESHOLD_PROP, -1);
private static final String TAG = "BackAnimationController";
/**
@@ -80,6 +82,8 @@
private final Context mContext;
@Nullable
private IOnBackInvokedCallback mBackToLauncherCallback;
+ private float mTriggerThreshold;
+ private float mProgressThreshold;
public BackAnimationController(
@ShellMainThread ShellExecutor shellExecutor,
@@ -136,6 +140,12 @@
public void setTriggerBack(boolean triggerBack) {
mShellExecutor.execute(() -> BackAnimationController.this.setTriggerBack(triggerBack));
}
+
+ @Override
+ public void setSwipeThresholds(float triggerThreshold, float progressThreshold) {
+ mShellExecutor.execute(() -> BackAnimationController.this.setSwipeThresholds(
+ triggerThreshold, progressThreshold));
+ }
}
private static class IBackAnimationImpl extends IBackAnimation.Stub {
@@ -168,7 +178,8 @@
}
}
- private void setBackToLauncherCallback(IOnBackInvokedCallback callback) {
+ @VisibleForTesting
+ void setBackToLauncherCallback(IOnBackInvokedCallback callback) {
mBackToLauncherCallback = callback;
}
@@ -177,6 +188,14 @@
}
private void onBackToLauncherAnimationFinished() {
+ if (mBackNavigationInfo != null) {
+ IOnBackInvokedCallback callback = mBackNavigationInfo.getOnBackInvokedCallback();
+ if (mTriggerBack) {
+ dispatchOnBackInvoked(callback);
+ } else {
+ dispatchOnBackCancelled(callback);
+ }
+ }
finishAnimation();
}
@@ -218,19 +237,27 @@
}
private void onBackNavigationInfoReceived(@Nullable BackNavigationInfo backNavigationInfo) {
- if (backNavigationInfo == null
- || backNavigationInfo.getDepartingWindowContainer() == null) {
+ ProtoLog.d(WM_SHELL_BACK_PREVIEW, "Received backNavigationInfo:%s", backNavigationInfo);
+ if (backNavigationInfo == null) {
Log.e(TAG, "Received BackNavigationInfo is null.");
finishAnimation();
return;
}
-
- HardwareBuffer hardwareBuffer = backNavigationInfo.getScreenshotHardwareBuffer();
- if (hardwareBuffer != null) {
- displayTargetScreenshot(hardwareBuffer,
- backNavigationInfo.getTaskWindowConfiguration());
+ int backType = backNavigationInfo.getType();
+ IOnBackInvokedCallback targetCallback = null;
+ if (backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY) {
+ HardwareBuffer hardwareBuffer = backNavigationInfo.getScreenshotHardwareBuffer();
+ if (hardwareBuffer != null) {
+ displayTargetScreenshot(hardwareBuffer,
+ backNavigationInfo.getTaskWindowConfiguration());
+ }
+ mTransaction.apply();
+ } else if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME) {
+ targetCallback = mBackToLauncherCallback;
+ } else if (backType == BackNavigationInfo.TYPE_CALLBACK) {
+ targetCallback = mBackNavigationInfo.getOnBackInvokedCallback();
}
- mTransaction.apply();
+ dispatchOnBackStarted(targetCallback);
}
/**
@@ -272,23 +299,103 @@
int deltaX = Math.round(event.getX() - mInitTouchLocation.x);
int deltaY = Math.round(event.getY() - mInitTouchLocation.y);
ProtoLog.v(WM_SHELL_BACK_PREVIEW, "Runner move: %d %d", deltaX, deltaY);
- SurfaceControl topWindowLeash = mBackNavigationInfo.getDepartingWindowContainer();
- mTransaction.setPosition(topWindowLeash, deltaX, deltaY);
- mTouchEventDelta.set(deltaX, deltaY);
- mTransaction.apply();
+ float progressThreshold = PROGRESS_THRESHOLD >= 0 ? PROGRESS_THRESHOLD : mProgressThreshold;
+ float progress = Math.min(Math.max(Math.abs(deltaX) / progressThreshold, 0), 1);
+ int backType = mBackNavigationInfo.getType();
+ RemoteAnimationTarget animationTarget = mBackNavigationInfo.getDepartingAnimationTarget();
+
+ BackEvent backEvent = new BackEvent(0, 0, progress, swipeEdge, animationTarget);
+ IOnBackInvokedCallback targetCallback = null;
+ if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME) {
+ targetCallback = mBackToLauncherCallback;
+ } else if (backType == BackNavigationInfo.TYPE_CROSS_TASK
+ || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY) {
+ if (animationTarget != null) {
+ mTransaction.setPosition(animationTarget.leash, deltaX, deltaY);
+ mTouchEventDelta.set(deltaX, deltaY);
+ mTransaction.apply();
+ }
+ } else if (backType == BackNavigationInfo.TYPE_CALLBACK) {
+ targetCallback = mBackNavigationInfo.getOnBackInvokedCallback();
+ }
+ dispatchOnBackProgressed(targetCallback, backEvent);
}
private void onGestureFinished() {
ProtoLog.d(WM_SHELL_BACK_PREVIEW, "onGestureFinished() mTriggerBack == %s", mTriggerBack);
- if (mBackGestureStarted) {
+ if (!mBackGestureStarted || mBackNavigationInfo == null) {
+ return;
+ }
+ int backType = mBackNavigationInfo.getType();
+ boolean shouldDispatchToLauncher = backType == BackNavigationInfo.TYPE_RETURN_TO_HOME
+ && mBackToLauncherCallback != null;
+ IOnBackInvokedCallback targetCallback = shouldDispatchToLauncher
+ ? mBackToLauncherCallback
+ : mBackNavigationInfo.getOnBackInvokedCallback();
+ if (mTriggerBack) {
+ dispatchOnBackInvoked(targetCallback);
+ } else {
+ dispatchOnBackCancelled(targetCallback);
+ }
+ if (backType == BackNavigationInfo.TYPE_CALLBACK) {
+ finishAnimation();
+ } else if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME
+ && !shouldDispatchToLauncher) {
+ // Launcher callback missing. Simply finish animation.
+ finishAnimation();
+ } else if (backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY
+ || backType == BackNavigationInfo.TYPE_CROSS_TASK) {
if (mTriggerBack) {
prepareTransition();
} else {
resetPositionAnimated();
}
}
- mBackGestureStarted = false;
- mTriggerBack = false;
+ }
+
+ private static void dispatchOnBackStarted(IOnBackInvokedCallback callback) {
+ if (callback == null) {
+ return;
+ }
+ try {
+ callback.onBackStarted();
+ } catch (RemoteException e) {
+ Log.e(TAG, "dispatchOnBackStarted error: ", e);
+ }
+ }
+
+ private static void dispatchOnBackInvoked(IOnBackInvokedCallback callback) {
+ if (callback == null) {
+ return;
+ }
+ try {
+ callback.onBackInvoked();
+ } catch (RemoteException e) {
+ Log.e(TAG, "dispatchOnBackInvoked error: ", e);
+ }
+ }
+
+ private static void dispatchOnBackCancelled(IOnBackInvokedCallback callback) {
+ if (callback == null) {
+ return;
+ }
+ try {
+ callback.onBackCancelled();
+ } catch (RemoteException e) {
+ Log.e(TAG, "dispatchOnBackCancelled error: ", e);
+ }
+ }
+
+ private static void dispatchOnBackProgressed(
+ IOnBackInvokedCallback callback, BackEvent backEvent) {
+ if (callback == null) {
+ return;
+ }
+ try {
+ callback.onBackProgressed(backEvent);
+ } catch (RemoteException e) {
+ Log.e(TAG, "dispatchOnBackProgressed error: ", e);
+ }
}
/**
@@ -309,9 +416,12 @@
float fraction = animation1.getAnimatedFraction();
int deltaX = Math.round(mTouchEventDelta.x - (mTouchEventDelta.x * fraction));
int deltaY = Math.round(mTouchEventDelta.y - (mTouchEventDelta.y * fraction));
- mTransaction.setPosition(mBackNavigationInfo.getDepartingWindowContainer(),
- deltaX, deltaY);
- mTransaction.apply();
+ RemoteAnimationTarget animationTarget =
+ mBackNavigationInfo.getDepartingAnimationTarget();
+ if (animationTarget != null) {
+ mTransaction.setPosition(animationTarget.leash, deltaX, deltaY);
+ mTransaction.apply();
+ }
});
animation.addListener(new AnimatorListenerAdapter() {
@@ -337,25 +447,34 @@
mTriggerBack = triggerBack;
}
+ private void setSwipeThresholds(float triggerThreshold, float progressThreshold) {
+ mProgressThreshold = progressThreshold;
+ mTriggerThreshold = triggerThreshold;
+ }
+
private void finishAnimation() {
ProtoLog.d(WM_SHELL_BACK_PREVIEW, "BackAnimationController: finishAnimation()");
mBackGestureStarted = false;
mTouchEventDelta.set(0, 0);
mInitTouchLocation.set(0, 0);
BackNavigationInfo backNavigationInfo = mBackNavigationInfo;
+ boolean triggerBack = mTriggerBack;
mBackNavigationInfo = null;
+ mTriggerBack = false;
if (backNavigationInfo == null) {
return;
}
- SurfaceControl topWindowLeash = backNavigationInfo.getDepartingWindowContainer();
- if (topWindowLeash != null && topWindowLeash.isValid()) {
- mTransaction.remove(topWindowLeash);
+ RemoteAnimationTarget animationTarget = backNavigationInfo.getDepartingAnimationTarget();
+ if (animationTarget != null && mTriggerBack) {
+ if (animationTarget.leash != null && animationTarget.leash.isValid()) {
+ mTransaction.remove(animationTarget.leash);
+ }
}
SurfaceControl screenshotSurface = backNavigationInfo.getScreenshotSurface();
if (screenshotSurface != null && screenshotSurface.isValid()) {
mTransaction.remove(screenshotSurface);
}
mTransaction.apply();
- backNavigationInfo.onBackNavigationFinished();
+ backNavigationInfo.onBackNavigationFinished(triggerBack);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index 6ffcf10..241f1a7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -423,7 +423,6 @@
WindowContainerTransaction t) {
// This is triggered right before the rotation is applied
if (fromRotation != toRotation) {
- mBubblePositioner.setRotation(toRotation);
if (mStackView != null) {
// Layout listener set on stackView will update the positioner
// once the rotation is applied
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
index 127d5a8..75b19fb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
@@ -20,6 +20,7 @@
import android.annotation.IntDef;
import android.content.Context;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Insets;
import android.graphics.PointF;
@@ -112,10 +113,6 @@
update();
}
- public void setRotation(int rotation) {
- mRotation = rotation;
- }
-
/**
* Available space and inset information. Call this when config changes
* occur or when added to a window.
@@ -273,7 +270,8 @@
/** @return whether the device is in landscape orientation. */
public boolean isLandscape() {
- return mRotation == Surface.ROTATION_90 || mRotation == Surface.ROTATION_270;
+ return mContext.getResources().getConfiguration().orientation
+ == Configuration.ORIENTATION_LANDSCAPE;
}
/** @return whether the screen is considered large. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 9219baa..c6a68dc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -1237,7 +1237,7 @@
b.getExpandedView().updateFontSize();
}
}
- if (mBubbleOverflow != null) {
+ if (mBubbleOverflow != null && mBubbleOverflow.getExpandedView() != null) {
mBubbleOverflow.getExpandedView().updateFontSize();
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
index 656dae3..79a24b7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
@@ -40,6 +40,7 @@
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.compatui.CompatUIWindowManager.CompatUIHintsState;
import com.android.wm.shell.compatui.letterboxedu.LetterboxEduWindowManager;
import java.lang.ref.WeakReference;
@@ -105,9 +106,8 @@
private CompatUICallback mCallback;
- // Only show once automatically in the process life.
- private boolean mHasShownSizeCompatHint;
- private boolean mHasShownCameraCompatHint;
+ // Only show each hint once automatically in the process life.
+ private final CompatUIHintsState mCompatUIHintsState;
// Indicates if the keyguard is currently occluded, in which case compat UIs shouldn't
// be shown.
@@ -127,6 +127,7 @@
mMainExecutor = mainExecutor;
mDisplayController.addDisplayWindowListener(this);
mImeController.addPositionProcessor(this);
+ mCompatUIHintsState = new CompatUIHintsState();
}
/** Returns implementation of {@link CompatUI}. */
@@ -259,19 +260,9 @@
@VisibleForTesting
CompatUIWindowManager createCompatUiWindowManager(Context context, TaskInfo taskInfo,
ShellTaskOrganizer.TaskListener taskListener) {
- final CompatUIWindowManager compatUIWindowManager = new CompatUIWindowManager(context,
+ return new CompatUIWindowManager(context,
taskInfo, mSyncQueue, mCallback, taskListener,
- mDisplayController.getDisplayLayout(taskInfo.displayId), mHasShownSizeCompatHint,
- mHasShownCameraCompatHint);
- // TODO(b/218304113): updates values only if hints are actually shown to the user.
- // Only show hints for the first time.
- if (taskInfo.topActivityInSizeCompat) {
- mHasShownSizeCompatHint = true;
- }
- if (taskInfo.hasCameraCompatControl()) {
- mHasShownCameraCompatHint = true;
- }
- return compatUIWindowManager;
+ mDisplayController.getDisplayLayout(taskInfo.displayId), mCompatUIHintsState);
}
private void createOrUpdateLetterboxEduLayout(TaskInfo taskInfo,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
index 3a37b5e..bce3ec4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
@@ -59,9 +59,7 @@
int mCameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN;
@VisibleForTesting
- boolean mShouldShowSizeCompatHint;
- @VisibleForTesting
- boolean mShouldShowCameraCompatHint;
+ CompatUIHintsState mCompatUIHintsState;
@Nullable
@VisibleForTesting
@@ -70,13 +68,12 @@
CompatUIWindowManager(Context context, TaskInfo taskInfo,
SyncTransactionQueue syncQueue, CompatUICallback callback,
ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout,
- boolean hasShownSizeCompatHint, boolean hasShownCameraCompatHint) {
+ CompatUIHintsState compatUIHintsState) {
super(context, taskInfo, syncQueue, taskListener, displayLayout);
mCallback = callback;
mHasSizeCompat = taskInfo.topActivityInSizeCompat;
mCameraCompatControlState = taskInfo.cameraCompatControlState;
- mShouldShowSizeCompatHint = !hasShownSizeCompatHint;
- mShouldShowCameraCompatHint = !hasShownCameraCompatHint;
+ mCompatUIHintsState = compatUIHintsState;
}
@Override
@@ -189,15 +186,18 @@
}
@Override
- protected void updateSurfacePosition(Rect taskBounds, Rect stableBounds) {
+ @VisibleForTesting
+ public void updateSurfacePosition() {
if (mLayout == null) {
return;
}
// Position of the button in the container coordinate.
+ final Rect taskBounds = getTaskBounds();
+ final Rect taskStableBounds = getTaskStableBounds();
final int positionX = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
- ? stableBounds.left - taskBounds.left
- : stableBounds.right - taskBounds.left - mLayout.getMeasuredWidth();
- final int positionY = stableBounds.bottom - taskBounds.top
+ ? taskStableBounds.left - taskBounds.left
+ : taskStableBounds.right - taskBounds.left - mLayout.getMeasuredWidth();
+ final int positionY = taskStableBounds.bottom - taskBounds.top
- mLayout.getMeasuredHeight();
updateSurfacePosition(positionX, positionY);
@@ -209,18 +209,18 @@
}
// Size Compat mode restart button.
mLayout.setRestartButtonVisibility(mHasSizeCompat);
- if (mHasSizeCompat && mShouldShowSizeCompatHint) {
+ // Only show by default for the first time.
+ if (mHasSizeCompat && !mCompatUIHintsState.mHasShownSizeCompatHint) {
mLayout.setSizeCompatHintVisibility(/* show= */ true);
- // Only show by default for the first time.
- mShouldShowSizeCompatHint = false;
+ mCompatUIHintsState.mHasShownSizeCompatHint = true;
}
// Camera control for stretched issues.
mLayout.setCameraControlVisibility(shouldShowCameraControl());
- if (shouldShowCameraControl() && mShouldShowCameraCompatHint) {
+ // Only show by default for the first time.
+ if (shouldShowCameraControl() && !mCompatUIHintsState.mHasShownCameraCompatHint) {
mLayout.setCameraCompatHintVisibility(/* show= */ true);
- // Only show by default for the first time.
- mShouldShowCameraCompatHint = false;
+ mCompatUIHintsState.mHasShownCameraCompatHint = true;
}
if (shouldShowCameraControl()) {
mLayout.updateCameraTreatmentButton(mCameraCompatControlState);
@@ -231,4 +231,15 @@
return mCameraCompatControlState != CAMERA_COMPAT_CONTROL_HIDDEN
&& mCameraCompatControlState != CAMERA_COMPAT_CONTROL_DISMISSED;
}
+
+ /**
+ * A class holding the state of the compat UI hints, which is shared between all compat UI
+ * window managers.
+ */
+ static class CompatUIHintsState {
+ @VisibleForTesting
+ boolean mHasShownSizeCompatHint;
+ @VisibleForTesting
+ boolean mHasShownCameraCompatHint;
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java
index 7014fcc..5679bc4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java
@@ -51,15 +51,15 @@
*/
public abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
- protected final SyncTransactionQueue mSyncQueue;
- protected final int mDisplayId;
protected final int mTaskId;
-
protected Context mContext;
- protected Configuration mTaskConfig;
- protected ShellTaskOrganizer.TaskListener mTaskListener;
- protected DisplayLayout mDisplayLayout;
- protected final Rect mStableBounds;
+
+ private final SyncTransactionQueue mSyncQueue;
+ private final int mDisplayId;
+ private Configuration mTaskConfig;
+ private ShellTaskOrganizer.TaskListener mTaskListener;
+ private DisplayLayout mDisplayLayout;
+ private final Rect mStableBounds;
/**
* Utility class for adding and releasing a View hierarchy for this {@link
@@ -211,7 +211,7 @@
boolean layoutDirectionUpdated =
mTaskConfig.getLayoutDirection() != prevTaskConfig.getLayoutDirection();
if (boundsUpdated || layoutDirectionUpdated) {
- updateSurface();
+ onParentBoundsChanged();
}
if (layout != null && layoutDirectionUpdated) {
@@ -248,8 +248,9 @@
displayLayout.getStableBounds(curStableBounds);
mDisplayLayout = displayLayout;
if (!prevStableBounds.equals(curStableBounds)) {
- updateSurface();
+ // mStableBounds should be updated before we call onParentBoundsChanged.
mStableBounds.set(curStableBounds);
+ onParentBoundsChanged();
}
}
@@ -289,51 +290,39 @@
}
/** Re-layouts the view host and updates the surface position. */
- public void relayout() {
+ void relayout() {
+ relayout(getWindowLayoutParams());
+ }
+
+ protected void relayout(WindowManager.LayoutParams windowLayoutParams) {
if (mViewHost == null) {
return;
}
- mViewHost.relayout(getWindowLayoutParams());
+ mViewHost.relayout(windowLayoutParams);
updateSurfacePosition();
}
/**
- * Updates the surface following a change in the task bounds, display layout stable bounds,
- * or the layout direction.
+ * Called following a change in the task bounds, display layout stable bounds, or the layout
+ * direction.
*/
- protected void updateSurface() {
+ protected void onParentBoundsChanged() {
updateSurfacePosition();
}
/**
- * Updates the position of the surface with respect to the task bounds and display layout
- * stable bounds.
+ * Updates the position of the surface with respect to the parent bounds.
*/
- @VisibleForTesting
- void updateSurfacePosition() {
- if (mLeash == null) {
- return;
- }
- // Use stable bounds to prevent controls from overlapping with system bars.
- final Rect taskBounds = mTaskConfig.windowConfiguration.getBounds();
- final Rect stableBounds = new Rect();
- mDisplayLayout.getStableBounds(stableBounds);
- stableBounds.intersect(taskBounds);
-
- updateSurfacePosition(taskBounds, stableBounds);
- }
-
- /**
- * Updates the position of the surface with respect to the given {@code taskBounds} and {@code
- * stableBounds}.
- */
- protected abstract void updateSurfacePosition(Rect taskBounds, Rect stableBounds);
+ protected abstract void updateSurfacePosition();
/**
* Updates the position of the surface with respect to the given {@code positionX} and {@code
* positionY}.
*/
protected void updateSurfacePosition(int positionX, int positionY) {
+ if (mLeash == null) {
+ return;
+ }
mSyncQueue.runInSync(t -> {
if (mLeash == null || !mLeash.isValid()) {
Log.w(getTag(), "The leash has been released.");
@@ -347,6 +336,17 @@
return mContext.getResources().getConfiguration().getLayoutDirection();
}
+ protected Rect getTaskBounds() {
+ return mTaskConfig.windowConfiguration.getBounds();
+ }
+
+ /** Returns the intersection between the task bounds and the display layout stable bounds. */
+ protected Rect getTaskStableBounds() {
+ final Rect result = new Rect(mStableBounds);
+ result.intersect(getTaskBounds());
+ return result;
+ }
+
@VisibleForTesting
SurfaceControlViewHost createSurfaceViewHost() {
return new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java
index eff2602..3810eca 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java
@@ -43,6 +43,8 @@
class LetterboxEduAnimationController {
private static final String TAG = "LetterboxEduAnimation";
+ private static final int ENTER_ANIM_START_DELAY_MILLIS = 500;
+
private final TransitionAnimation mTransitionAnimation;
private final String mPackageName;
@AnyRes
@@ -87,6 +89,9 @@
mDialogAnimation.getDuration());
mBackgroundDimAnimator.addListener(getDimAnimatorListener());
+ mDialogAnimation.setStartOffset(ENTER_ANIM_START_DELAY_MILLIS);
+ mBackgroundDimAnimator.setStartDelay(ENTER_ANIM_START_DELAY_MILLIS);
+
dialogContainer.startAnimation(mDialogAnimation);
mBackgroundDimAnimator.start();
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java
index bc1d19b..bb6fe98 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java
@@ -20,7 +20,8 @@
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
-import android.widget.FrameLayout;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
import com.android.wm.shell.R;
@@ -31,7 +32,7 @@
* background dim which dismisses the dialog when clicked.
*/
// TODO(b/215316431): Add tests
-class LetterboxEduDialogLayout extends FrameLayout {
+class LetterboxEduDialogLayout extends ConstraintLayout {
// The alpha of a background is a number between 0 (fully transparent) to 255 (fully opaque).
// 204 is simply 255 * 0.8.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java
index 074610b..bb4d427 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java
@@ -26,6 +26,7 @@
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.ViewGroup.MarginLayoutParams;
import android.view.WindowManager;
import com.android.wm.shell.R;
@@ -109,6 +110,7 @@
protected View createLayout() {
setSeenLetterboxEducation();
mLayout = inflateLayout();
+ updateDialogMargins();
mAnimationController.startEnterAnimation(mLayout, /* endCallback= */
this::setDismissOnClickListener);
@@ -116,6 +118,22 @@
return mLayout;
}
+ private void updateDialogMargins() {
+ if (mLayout == null) {
+ return;
+ }
+ final View dialogContainer = mLayout.getDialogContainer();
+ MarginLayoutParams marginParams = (MarginLayoutParams) dialogContainer.getLayoutParams();
+ int verticalMargin = (int) mContext.getResources().getDimension(
+ R.dimen.letterbox_education_dialog_margin);
+
+ final Rect taskBounds = getTaskBounds();
+ final Rect taskStableBounds = getTaskStableBounds();
+ marginParams.topMargin = taskStableBounds.top - taskBounds.top + verticalMargin;
+ marginParams.bottomMargin = taskBounds.bottom - taskStableBounds.bottom + verticalMargin;
+ dialogContainer.setLayoutParams(marginParams);
+ }
+
private LetterboxEduDialogLayout inflateLayout() {
return (LetterboxEduDialogLayout) LayoutInflater.from(mContext).inflate(
R.layout.letterbox_education_dialog_layout, null);
@@ -150,20 +168,26 @@
}
@Override
- protected void updateSurface() {
- // We need to relayout because the layout dimensions depend on the task bounds.
- relayout();
+ protected void onParentBoundsChanged() {
+ if (mLayout == null) {
+ return;
+ }
+ // Both the layout dimensions and dialog margins depend on the parent bounds.
+ WindowManager.LayoutParams windowLayoutParams = getWindowLayoutParams();
+ mLayout.setLayoutParams(windowLayoutParams);
+ updateDialogMargins();
+ relayout(windowLayoutParams);
}
@Override
- protected void updateSurfacePosition(Rect taskBounds, Rect stableBounds) {
+ protected void updateSurfacePosition() {
// Nothing to do, since the position of the surface is fixed to the top left corner (0,0)
// of the task (parent surface), which is the default position of a surface.
}
@Override
protected WindowManager.LayoutParams getWindowLayoutParams() {
- final Rect taskBounds = mTaskConfig.windowConfiguration.getBounds();
+ final Rect taskBounds = getTaskBounds();
return getWindowLayoutParams(/* width= */ taskBounds.width(), /* height= */
taskBounds.height());
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java
index f91d7e2..4f16042 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java
@@ -30,7 +30,6 @@
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.pip.PipAnimationController;
-import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipMediaController;
import com.android.wm.shell.pip.PipSnapAlgorithm;
import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
@@ -39,6 +38,7 @@
import com.android.wm.shell.pip.PipTransitionState;
import com.android.wm.shell.pip.PipUiEventLogger;
import com.android.wm.shell.pip.tv.TvPipBoundsAlgorithm;
+import com.android.wm.shell.pip.tv.TvPipBoundsState;
import com.android.wm.shell.pip.tv.TvPipController;
import com.android.wm.shell.pip.tv.TvPipMenuController;
import com.android.wm.shell.pip.tv.TvPipNotificationController;
@@ -60,7 +60,7 @@
@Provides
static Optional<Pip> providePip(
Context context,
- PipBoundsState pipBoundsState,
+ TvPipBoundsState tvPipBoundsState,
TvPipBoundsAlgorithm tvPipBoundsAlgorithm,
PipTaskOrganizer pipTaskOrganizer,
TvPipMenuController tvPipMenuController,
@@ -73,7 +73,7 @@
return Optional.of(
TvPipController.create(
context,
- pipBoundsState,
+ tvPipBoundsState,
tvPipBoundsAlgorithm,
pipTaskOrganizer,
pipTransitionController,
@@ -94,14 +94,14 @@
@WMSingleton
@Provides
static TvPipBoundsAlgorithm provideTvPipBoundsAlgorithm(Context context,
- PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm) {
- return new TvPipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm);
+ TvPipBoundsState tvPipBoundsState, PipSnapAlgorithm pipSnapAlgorithm) {
+ return new TvPipBoundsAlgorithm(context, tvPipBoundsState, pipSnapAlgorithm);
}
@WMSingleton
@Provides
- static PipBoundsState providePipBoundsState(Context context) {
- return new PipBoundsState(context);
+ static TvPipBoundsState provideTvPipBoundsState(Context context) {
+ return new TvPipBoundsState(context);
}
// Handler needed for loadDrawableAsync() in PipControlsViewController
@@ -111,8 +111,8 @@
Transitions transitions, ShellTaskOrganizer shellTaskOrganizer,
PipAnimationController pipAnimationController,
TvPipBoundsAlgorithm tvPipBoundsAlgorithm,
- PipBoundsState pipBoundsState, TvPipMenuController pipMenuController) {
- return new TvPipTransition(pipBoundsState, pipMenuController,
+ TvPipBoundsState tvPipBoundsState, TvPipMenuController pipMenuController) {
+ return new TvPipTransition(tvPipBoundsState, pipMenuController,
tvPipBoundsAlgorithm, pipAnimationController, transitions, shellTaskOrganizer);
}
@@ -120,11 +120,11 @@
@Provides
static TvPipMenuController providesTvPipMenuController(
Context context,
- PipBoundsState pipBoundsState,
+ TvPipBoundsState tvPipBoundsState,
SystemWindows systemWindows,
PipMediaController pipMediaController,
@ShellMainThread Handler mainHandler) {
- return new TvPipMenuController(context, pipBoundsState, systemWindows, pipMediaController,
+ return new TvPipMenuController(context, tvPipBoundsState, systemWindows, pipMediaController,
mainHandler);
}
@@ -155,7 +155,7 @@
static PipTaskOrganizer providePipTaskOrganizer(Context context,
TvPipMenuController tvPipMenuController,
SyncTransactionQueue syncTransactionQueue,
- PipBoundsState pipBoundsState,
+ TvPipBoundsState tvPipBoundsState,
PipTransitionState pipTransitionState,
TvPipBoundsAlgorithm tvPipBoundsAlgorithm,
PipAnimationController pipAnimationController,
@@ -167,7 +167,7 @@
PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
@ShellMainThread ShellExecutor mainExecutor) {
return new PipTaskOrganizer(context,
- syncTransactionQueue, pipTransitionState, pipBoundsState, tvPipBoundsAlgorithm,
+ syncTransactionQueue, pipTransitionState, tvPipBoundsState, tvPipBoundsAlgorithm,
tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper,
pipTransitionController, splitScreenOptional, newSplitScreenOptional,
displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
index 2e54c79..c94f3d1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
@@ -168,8 +168,8 @@
@WMSingleton
@Provides
- static DragAndDrop provideDragAndDrop(DragAndDropController dragAndDropController) {
- return dragAndDropController.asDragAndDrop();
+ static Optional<DragAndDrop> provideDragAndDrop(DragAndDropController dragAndDropController) {
+ return Optional.of(dragAndDropController.asDragAndDrop());
}
@WMSingleton
@@ -184,8 +184,8 @@
@WMSingleton
@Provides
- static CompatUI provideCompatUI(CompatUIController compatUIController) {
- return compatUIController.asCompatUI();
+ static Optional<CompatUI> provideCompatUI(CompatUIController compatUIController) {
+ return Optional.of(compatUIController.asCompatUI());
}
@WMSingleton
@@ -699,10 +699,7 @@
Context context,
@ShellMainThread ShellExecutor shellExecutor
) {
- if (BackAnimationController.IS_ENABLED) {
- return Optional.of(
- new BackAnimationController(shellExecutor, context));
- }
- return Optional.empty();
+ return Optional.of(
+ new BackAnimationController(shellExecutor, context));
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
index 5c205f9..8f9636c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
@@ -27,7 +27,10 @@
import android.os.Looper;
import android.os.Trace;
+import androidx.annotation.Nullable;
+
import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
+import com.android.wm.shell.R;
import com.android.wm.shell.common.HandlerExecutor;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.annotations.ChoreographerSfVsync;
@@ -35,7 +38,6 @@
import com.android.wm.shell.common.annotations.ShellAnimationThread;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.common.annotations.ShellSplashscreenThread;
-import com.android.wm.shell.R;
import dagger.Module;
import dagger.Provides;
@@ -53,7 +55,7 @@
/**
* Returns whether to enable a separate shell thread for the shell features.
*/
- private static boolean enableShellMainThread(Context context) {
+ public static boolean enableShellMainThread(Context context) {
return context.getResources().getBoolean(R.bool.config_enableShellMainThread);
}
@@ -85,23 +87,41 @@
}
/**
+ * Creates a shell main thread to be injected into the shell components. This does not provide
+ * the {@param HandleThread}, but is used to create the thread prior to initializing the
+ * WM component, and is explicitly bound.
+ *
+ * See {@link com.android.systemui.SystemUIFactory#init(Context, boolean)}.
+ */
+ public static HandlerThread createShellMainThread() {
+ HandlerThread mainThread = new HandlerThread("wmshell.main", THREAD_PRIORITY_DISPLAY);
+ return mainThread;
+ }
+
+ /**
* Shell main-thread Handler, don't use this unless really necessary (ie. need to dedupe
* multiple types of messages, etc.)
+ *
+ * @param mainThread If non-null, this thread is expected to be started already
*/
@WMSingleton
@Provides
@ShellMainThread
public static Handler provideShellMainHandler(Context context,
+ @Nullable @ShellMainThread HandlerThread mainThread,
@ExternalMainThread Handler sysuiMainHandler) {
if (enableShellMainThread(context)) {
- HandlerThread mainThread = new HandlerThread("wmshell.main", THREAD_PRIORITY_DISPLAY);
- mainThread.start();
- if (Build.IS_DEBUGGABLE) {
- mainThread.getLooper().setTraceTag(Trace.TRACE_TAG_WINDOW_MANAGER);
- mainThread.getLooper().setSlowLogThresholdMs(MSGQ_SLOW_DISPATCH_THRESHOLD_MS,
- MSGQ_SLOW_DELIVERY_THRESHOLD_MS);
- }
- return Handler.createAsync(mainThread.getLooper());
+ if (mainThread == null) {
+ // If this thread wasn't pre-emptively started, then create and start it
+ mainThread = createShellMainThread();
+ mainThread.start();
+ }
+ if (Build.IS_DEBUGGABLE) {
+ mainThread.getLooper().setTraceTag(Trace.TRACE_TAG_WINDOW_MANAGER);
+ mainThread.getLooper().setSlowLogThresholdMs(MSGQ_SLOW_DISPATCH_THRESHOLD_MS,
+ MSGQ_SLOW_DELIVERY_THRESHOLD_MS);
+ }
+ return Handler.createAsync(mainThread.getLooper());
}
return sysuiMainHandler;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java
index b3b1ba7..3fefc4a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java
@@ -90,6 +90,12 @@
}
}
+ private void onExpandedAspectRatioChanged(float aspectRatio) {
+ for (PinnedTaskListener listener : mListeners) {
+ listener.onExpandedAspectRatioChanged(aspectRatio);
+ }
+ }
+
@BinderThread
private class PinnedTaskListenerImpl extends IPinnedTaskListener.Stub {
@Override
@@ -126,6 +132,15 @@
PinnedStackListenerForwarder.this.onAspectRatioChanged(aspectRatio);
});
}
+
+ @Override
+ public void onExpandedAspectRatioChanged(float aspectRatio) {
+ mMainExecutor.execute(() -> {
+ PinnedStackListenerForwarder.this.onExpandedAspectRatioChanged(aspectRatio);
+ });
+ }
+
+
}
/**
@@ -142,5 +157,7 @@
public void onActivityHidden(ComponentName componentName) {}
public void onAspectRatioChanged(float aspectRatio) {}
+
+ public void onExpandedAspectRatioChanged(float aspectRatio) {}
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
index e616172..77fd228 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
@@ -620,7 +620,7 @@
setCurrentValue(bounds);
final Rect insets = computeInsets(fraction);
final float degree, x, y;
- if (Transitions.ENABLE_SHELL_TRANSITIONS) {
+ if (Transitions.SHELL_TRANSITIONS_ROTATION) {
if (rotationDelta == ROTATION_90) {
degree = 90 * (1 - fraction);
x = fraction * (end.left - start.left)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
index 1a3c51e..e29dde2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
@@ -44,7 +44,7 @@
private static final String TAG = PipBoundsAlgorithm.class.getSimpleName();
private static final float INVALID_SNAP_FRACTION = -1f;
- protected final @NonNull PipBoundsState mPipBoundsState;
+ private final @NonNull PipBoundsState mPipBoundsState;
private final PipSnapAlgorithm mSnapAlgorithm;
private float mDefaultSizePercent;
@@ -56,7 +56,7 @@
private int mDefaultStackGravity;
private int mDefaultMinSize;
private int mOverridableMinSize;
- private Point mScreenEdgeInsets;
+ protected Point mScreenEdgeInsets;
public PipBoundsAlgorithm(Context context, @NonNull PipBoundsState pipBoundsState,
@NonNull PipSnapAlgorithm pipSnapAlgorithm) {
@@ -73,7 +73,7 @@
/**
* TODO: move the resources to SysUI package.
*/
- private void reloadResources(Context context) {
+ protected void reloadResources(Context context) {
final Resources res = context.getResources();
mDefaultAspectRatio = res.getFloat(
com.android.internal.R.dimen.config_pictureInPictureDefaultAspectRatio);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java
index b3558ad..bebf2ca 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java
@@ -20,9 +20,11 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityTaskManager;
+import android.app.PictureInPictureParams;
import android.app.PictureInPictureUiState;
import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.ActivityInfo;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.RemoteException;
@@ -46,7 +48,7 @@
/**
* Singleton source of truth for the current state of PIP bounds.
*/
-public final class PipBoundsState {
+public class PipBoundsState {
public static final int STASH_TYPE_NONE = 0;
public static final int STASH_TYPE_LEFT = 1;
public static final int STASH_TYPE_RIGHT = 2;
@@ -368,11 +370,11 @@
/**
* Initialize states when first entering PiP.
*/
- public void setBoundsStateForEntry(ComponentName componentName, float aspectRatio,
- Size overrideMinSize) {
+ public void setBoundsStateForEntry(ComponentName componentName, ActivityInfo activityInfo,
+ PictureInPictureParams params, PipBoundsAlgorithm pipBoundsAlgorithm) {
setLastPipComponentName(componentName);
- setAspectRatio(aspectRatio);
- setOverrideMinSize(overrideMinSize);
+ setAspectRatio(pipBoundsAlgorithm.getAspectRatioOrDefault(params));
+ setOverrideMinSize(pipBoundsAlgorithm.getMinimalSize(activityInfo));
}
/** Returns whether the shelf is currently showing. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index 6b0d7f5..1eb9501 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -310,6 +310,10 @@
return mPipTransitionState.isInPip();
}
+ private boolean isLaunchIntoPipTask() {
+ return mPictureInPictureParams != null && mPictureInPictureParams.isLaunchIntoPip();
+ }
+
/**
* Returns whether the entry animation is waiting to be started.
*/
@@ -369,11 +373,10 @@
return mLeash;
}
- private void setBoundsStateForEntry(ComponentName componentName, PictureInPictureParams params,
- ActivityInfo activityInfo) {
- mPipBoundsState.setBoundsStateForEntry(componentName,
- mPipBoundsAlgorithm.getAspectRatioOrDefault(params),
- mPipBoundsAlgorithm.getMinimalSize(activityInfo));
+ private void setBoundsStateForEntry(ComponentName componentName,
+ PictureInPictureParams params, ActivityInfo activityInfo) {
+ mPipBoundsState.setBoundsStateForEntry(componentName, activityInfo, params,
+ mPipBoundsAlgorithm);
}
/**
@@ -398,6 +401,10 @@
}
final WindowContainerTransaction wct = new WindowContainerTransaction();
+ if (isLaunchIntoPipTask()) {
+ exitLaunchIntoPipTask(wct);
+ return;
+ }
if (ENABLE_SHELL_TRANSITIONS) {
if (requestEnterSplit && mSplitScreenOptional.isPresent()) {
@@ -469,6 +476,14 @@
});
}
+ private void exitLaunchIntoPipTask(WindowContainerTransaction wct) {
+ wct.startTask(mTaskInfo.launchIntoPipHostTaskId, null /* ActivityOptions */);
+ mTaskOrganizer.applyTransaction(wct);
+
+ // Remove the PiP with fade-out animation right after the host Task is brought to front.
+ removePip();
+ }
+
private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) {
// Reset the final windowing mode.
wct.setWindowingMode(mToken, getOutPipWindowingMode());
@@ -564,6 +579,13 @@
Log.d(TAG, "Alpha animation is expired. Use bounds animation.");
mOneShotAnimationType = ANIM_TYPE_BOUNDS;
}
+
+ if (Transitions.ENABLE_SHELL_TRANSITIONS) {
+ // For Shell transition, we will animate the window in PipTransition#startAnimation
+ // instead of #onTaskAppeared.
+ return;
+ }
+
if (mWaitForFixedRotation) {
onTaskAppearedWithFixedRotation();
return;
@@ -573,15 +595,6 @@
Objects.requireNonNull(destinationBounds, "Missing destination bounds");
final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds();
- if (Transitions.ENABLE_SHELL_TRANSITIONS) {
- if (mOneShotAnimationType == ANIM_TYPE_BOUNDS) {
- mPipMenuController.attach(mLeash);
- } else if (mOneShotAnimationType == ANIM_TYPE_ALPHA) {
- mOneShotAnimationType = ANIM_TYPE_BOUNDS;
- }
- return;
- }
-
if (mOneShotAnimationType == ANIM_TYPE_BOUNDS) {
mPipMenuController.attach(mLeash);
final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
@@ -730,7 +743,7 @@
}
/**
- * Note that dismissing PiP is now originated from SystemUI, see {@link #exitPip(int)}.
+ * Note that dismissing PiP is now originated from SystemUI, see {@link #exitPip(int, boolean)}.
* Meanwhile this callback is invoked whenever the task is removed. For instance:
* - as a result of removeRootTasksInWindowingModes from WM
* - activity itself is died
@@ -814,6 +827,16 @@
mNextRotation = newRotation;
mWaitForFixedRotation = true;
+ if (Transitions.ENABLE_SHELL_TRANSITIONS) {
+ // The fixed rotation will also be included in the transition info. However, if it is
+ // not a PIP transition (such as open another app to different orientation),
+ // PIP transition handler may not be aware of the fixed rotation start.
+ // Notify the PIP transition handler so that it can fade out the PIP window early for
+ // fixed transition of other windows.
+ mPipTransitionController.onFixedRotationStarted();
+ return;
+ }
+
if (mPipTransitionState.isInPip()) {
// Fade out the existing PiP to avoid jump cut during seamless rotation.
fadeExistingPip(false /* show */);
@@ -825,6 +848,10 @@
if (!mWaitForFixedRotation) {
return;
}
+ if (Transitions.ENABLE_SHELL_TRANSITIONS) {
+ clearWaitForFixedRotation();
+ return;
+ }
if (mPipTransitionState.getTransitionState() == PipTransitionState.TASK_APPEARED) {
if (mPipTransitionState.getInSwipePipToHomeTransition()) {
onEndOfSwipePipToHomeTransition();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
index 3e5d5f6..60aac68 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
@@ -16,6 +16,7 @@
package com.android.wm.shell.pip;
+import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.util.RotationUtils.deltaRotation;
@@ -32,9 +33,11 @@
import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_ALPHA;
import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_BOUNDS;
import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_LEAVE_PIP;
+import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_SAME;
import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_TO_PIP;
import static com.android.wm.shell.pip.PipAnimationController.isInPipDirection;
import static com.android.wm.shell.pip.PipAnimationController.isOutPipDirection;
+import static com.android.wm.shell.pip.PipTransitionState.ENTERED_PIP;
import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP;
import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP_TO_SPLIT;
import static com.android.wm.shell.transition.Transitions.TRANSIT_REMOVE_PIP;
@@ -47,6 +50,7 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.os.IBinder;
+import android.util.Log;
import android.view.Surface;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
@@ -86,6 +90,16 @@
/** The Task window that is currently in PIP windowing mode. */
@Nullable
private WindowContainerToken mCurrentPipTaskToken;
+ /** Whether display is in fixed rotation. */
+ private boolean mInFixedRotation;
+ /**
+ * The rotation that the display will apply after expanding PiP to fullscreen. This is only
+ * meaningful if {@link #mInFixedRotation} is true.
+ */
+ @Surface.Rotation
+ private int mFixedRotation;
+ /** Whether the PIP window has fade out for fixed rotation. */
+ private boolean mHasFadeOut;
public PipTransition(Context context,
PipBoundsState pipBoundsState,
@@ -136,35 +150,41 @@
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,
@NonNull Transitions.TransitionFinishCallback finishCallback) {
+ final TransitionInfo.Change currentPipChange = findCurrentPipChange(info);
+ final TransitionInfo.Change fixedRotationChange = findFixedRotationChange(info);
+ mInFixedRotation = fixedRotationChange != null;
+ mFixedRotation = mInFixedRotation
+ ? fixedRotationChange.getEndFixedRotation()
+ : ROTATION_UNDEFINED;
+
// Exiting PIP.
final int type = info.getType();
if (transition.equals(mExitTransition)) {
mExitDestinationBounds.setEmpty();
mExitTransition = null;
-
+ mHasFadeOut = false;
if (mFinishCallback != null) {
mFinishCallback.onTransitionFinished(null, null);
mFinishCallback = null;
throw new RuntimeException("Previous callback not called, aborting exit PIP.");
}
- final TransitionInfo.Change exitPipChange = findCurrentPipChange(info);
- if (exitPipChange == null) {
+ if (currentPipChange == null) {
throw new RuntimeException("Cannot find the pip window for exit-pip transition.");
}
switch (type) {
case TRANSIT_EXIT_PIP:
startExitAnimation(info, startTransaction, finishTransaction, finishCallback,
- exitPipChange);
+ currentPipChange);
break;
case TRANSIT_EXIT_PIP_TO_SPLIT:
startExitToSplitAnimation(info, startTransaction, finishTransaction,
- finishCallback, exitPipChange);
+ finishCallback, currentPipChange);
break;
case TRANSIT_REMOVE_PIP:
removePipImmediately(info, startTransaction, finishTransaction, finishCallback,
- exitPipChange);
+ currentPipChange);
break;
default:
throw new IllegalStateException("mExitTransition with unexpected transit type="
@@ -177,7 +197,6 @@
// The previous PIP Task is no longer in PIP, but this is not an exit transition (This can
// happen when a new activity requests enter PIP). In this case, we just show this Task in
// its end state, and play other animation as normal.
- final TransitionInfo.Change currentPipChange = findCurrentPipChange(info);
if (currentPipChange != null
&& currentPipChange.getTaskInfo().getWindowingMode() != WINDOWING_MODE_PINNED) {
resetPrevPip(currentPipChange, startTransaction);
@@ -193,6 +212,12 @@
if (currentPipChange != null) {
updatePipForUnhandledTransition(currentPipChange, startTransaction, finishTransaction);
}
+
+ // Fade in the fadeout PIP when the fixed rotation is finished.
+ if (mPipTransitionState.isInPip() && !mInFixedRotation && mHasFadeOut) {
+ fadeExistingPip(true /* show */);
+ }
+
return false;
}
@@ -242,9 +267,8 @@
public void onFinishResize(TaskInfo taskInfo, Rect destinationBounds,
@PipAnimationController.TransitionDirection int direction,
@Nullable SurfaceControl.Transaction tx) {
-
if (isInPipDirection(direction)) {
- mPipTransitionState.setTransitionState(PipTransitionState.ENTERED_PIP);
+ mPipTransitionState.setTransitionState(ENTERED_PIP);
}
// If there is an expected exit transition, then the exit will be "merged" into this
// transition so don't fire the finish-callback in that case.
@@ -268,6 +292,16 @@
mFinishCallback = null;
}
+ @Override
+ public void onFixedRotationStarted() {
+ // The transition with this fixed rotation may be handled by other handler before reaching
+ // PipTransition, so we cannot do this in #startAnimation.
+ if (mPipTransitionState.getTransitionState() == ENTERED_PIP && !mHasFadeOut) {
+ // Fade out the existing PiP to avoid jump cut during seamless rotation.
+ fadeExistingPip(false /* show */);
+ }
+ }
+
@Nullable
private TransitionInfo.Change findCurrentPipChange(@NonNull TransitionInfo info) {
if (mCurrentPipTaskToken == null) {
@@ -282,6 +316,17 @@
return null;
}
+ @Nullable
+ private TransitionInfo.Change findFixedRotationChange(@NonNull TransitionInfo info) {
+ for (int i = info.getChanges().size() - 1; i >= 0; --i) {
+ final TransitionInfo.Change change = info.getChanges().get(i);
+ if (change.getEndFixedRotation() != ROTATION_UNDEFINED) {
+ return change;
+ }
+ }
+ return null;
+ }
+
private void startExitAnimation(@NonNull TransitionInfo info,
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,
@@ -453,6 +498,7 @@
}
// Keep track of the PIP task.
mCurrentPipTaskToken = enterPip.getContainer();
+ mHasFadeOut = false;
if (mFinishCallback != null) {
mFinishCallback.onTransitionFinished(null /* wct */, null /* callback */);
@@ -465,12 +511,25 @@
startTransaction.show(wallpaper.getLeash());
startTransaction.setAlpha(wallpaper.getLeash(), 1.f);
}
+ // Make sure other open changes are visible as entering PIP. Some may be hidden in
+ // Transitions#setupStartState because the transition type is OPEN (such as auto-enter).
+ for (int i = info.getChanges().size() - 1; i >= 0; --i) {
+ final TransitionInfo.Change change = info.getChanges().get(i);
+ if (change == enterPip || change == wallpaper) {
+ continue;
+ }
+ if (isOpeningType(change.getMode())) {
+ final SurfaceControl leash = change.getLeash();
+ startTransaction.show(leash).setAlpha(leash, 1.f);
+ }
+ }
mPipTransitionState.setTransitionState(PipTransitionState.ENTERING_PIP);
mFinishCallback = finishCallback;
+ final int endRotation = mInFixedRotation ? mFixedRotation : enterPip.getEndRotation();
return startEnterAnimation(enterPip.getTaskInfo(), enterPip.getLeash(),
startTransaction, finishTransaction, enterPip.getStartRotation(),
- enterPip.getEndRotation());
+ endRotation);
}
private boolean startEnterAnimation(final TaskInfo taskInfo, final SurfaceControl leash,
@@ -481,25 +540,36 @@
taskInfo.topActivityInfo);
final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
final Rect currentBounds = taskInfo.configuration.windowConfiguration.getBounds();
+ int rotationDelta = deltaRotation(startRotation, endRotation);
+ Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
+ taskInfo.pictureInPictureParams, currentBounds);
+ if (rotationDelta != Surface.ROTATION_0 && mInFixedRotation) {
+ // Need to get the bounds of new rotation in old rotation for fixed rotation,
+ sourceHintRect = computeRotatedBounds(rotationDelta, startRotation, endRotation,
+ taskInfo, TRANSITION_DIRECTION_TO_PIP, destinationBounds, sourceHintRect);
+ }
PipAnimationController.PipTransitionAnimator animator;
// Set corner radius for entering pip.
mSurfaceTransactionHelper
.crop(finishTransaction, leash, destinationBounds)
.round(finishTransaction, leash, true /* applyCornerRadius */);
+ mPipMenuController.attach(leash);
+
if (taskInfo.pictureInPictureParams != null
&& taskInfo.pictureInPictureParams.isAutoEnterEnabled()
&& mPipTransitionState.getInSwipePipToHomeTransition()) {
mOneShotAnimationType = ANIM_TYPE_BOUNDS;
-
- // PiP menu is attached late in the process here to avoid any artifacts on the leash
- // caused by addShellRoot when in gesture navigation mode.
- mPipMenuController.attach(leash);
SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
tx.setMatrix(leash, Matrix.IDENTITY_MATRIX, new float[9])
.setPosition(leash, destinationBounds.left, destinationBounds.top)
.setWindowCrop(leash, destinationBounds.width(), destinationBounds.height());
startTransaction.merge(tx);
startTransaction.apply();
+ if (rotationDelta != Surface.ROTATION_0 && mInFixedRotation) {
+ // For fixed rotation, set the destination bounds to the new rotation coordinates
+ // at the end.
+ destinationBounds.set(mPipBoundsAlgorithm.getEntryDestinationBounds());
+ }
mPipBoundsState.setBounds(destinationBounds);
onFinishResize(taskInfo, destinationBounds, TRANSITION_DIRECTION_TO_PIP, null /* tx */);
sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP);
@@ -507,17 +577,14 @@
return true;
}
- int rotationDelta = deltaRotation(endRotation, startRotation);
if (rotationDelta != Surface.ROTATION_0) {
Matrix tmpTransform = new Matrix();
- tmpTransform.postRotate(rotationDelta == Surface.ROTATION_90
- ? Surface.ROTATION_270 : Surface.ROTATION_90);
+ tmpTransform.postRotate(rotationDelta);
startTransaction.setMatrix(leash, tmpTransform, new float[9]);
}
if (mOneShotAnimationType == ANIM_TYPE_BOUNDS) {
- final Rect sourceHintRect =
- PipBoundsAlgorithm.getValidSourceHintRect(
- taskInfo.pictureInPictureParams, currentBounds);
+ // Reverse the rotation for Shell transition animation.
+ rotationDelta = deltaRotation(rotationDelta, 0);
animator = mPipAnimationController.getAnimator(taskInfo, leash, currentBounds,
currentBounds, destinationBounds, sourceHintRect, TRANSITION_DIRECTION_TO_PIP,
0 /* startingAngle */, rotationDelta);
@@ -528,9 +595,6 @@
}
} else if (mOneShotAnimationType == ANIM_TYPE_ALPHA) {
startTransaction.setAlpha(leash, 0f);
- // PiP menu is attached late in the process here to avoid any artifacts on the leash
- // caused by addShellRoot when in gesture navigation mode.
- mPipMenuController.attach(leash);
animator = mPipAnimationController.getAnimator(taskInfo, leash, destinationBounds,
0f, 1f);
mOneShotAnimationType = ANIM_TYPE_BOUNDS;
@@ -541,12 +605,47 @@
startTransaction.apply();
animator.setTransitionDirection(TRANSITION_DIRECTION_TO_PIP)
.setPipAnimationCallback(mPipAnimationCallback)
- .setDuration(mEnterExitAnimationDuration)
- .start();
+ .setDuration(mEnterExitAnimationDuration);
+ if (rotationDelta != Surface.ROTATION_0 && mInFixedRotation) {
+ // For fixed rotation, the animation destination bounds is in old rotation coordinates.
+ // Set the destination bounds to new coordinates after the animation is finished.
+ // ComputeRotatedBounds has changed the DisplayLayout without affecting the animation.
+ animator.setDestinationBounds(mPipBoundsAlgorithm.getEntryDestinationBounds());
+ }
+ animator.start();
return true;
}
+ /** Computes destination bounds in old rotation and returns source hint rect if available. */
+ @Nullable
+ private Rect computeRotatedBounds(int rotationDelta, int startRotation, int endRotation,
+ TaskInfo taskInfo, int direction, Rect outDestinationBounds,
+ @Nullable Rect sourceHintRect) {
+ if (direction == TRANSITION_DIRECTION_TO_PIP) {
+ mPipBoundsState.getDisplayLayout().rotateTo(mContext.getResources(), endRotation);
+ final Rect displayBounds = mPipBoundsState.getDisplayBounds();
+ outDestinationBounds.set(mPipBoundsAlgorithm.getEntryDestinationBounds());
+ // Transform the destination bounds to current display coordinates.
+ rotateBounds(outDestinationBounds, displayBounds, endRotation, startRotation);
+ // When entering PiP (from button navigation mode), adjust the source rect hint by
+ // display cutout if applicable.
+ if (sourceHintRect != null && taskInfo.displayCutoutInsets != null) {
+ if (rotationDelta == Surface.ROTATION_270) {
+ sourceHintRect.offset(taskInfo.displayCutoutInsets.left,
+ taskInfo.displayCutoutInsets.top);
+ }
+ }
+ } else if (direction == TRANSITION_DIRECTION_LEAVE_PIP) {
+ final Rect rotatedDestinationBounds = new Rect(outDestinationBounds);
+ rotateBounds(rotatedDestinationBounds, mPipBoundsState.getDisplayBounds(),
+ rotationDelta);
+ return PipBoundsAlgorithm.getValidSourceHintRect(taskInfo.pictureInPictureParams,
+ rotatedDestinationBounds);
+ }
+ return sourceHintRect;
+ }
+
private void startExitToSplitAnimation(TransitionInfo info,
SurfaceControl.Transaction startTransaction,
SurfaceControl.Transaction finishTransaction,
@@ -595,6 +694,13 @@
startTransaction.setCornerRadius(leash, 0);
startTransaction.setPosition(leash, bounds.left, bounds.top);
+ if (mHasFadeOut && prevPipChange.getTaskInfo().isVisible()) {
+ if (mPipAnimationController.getCurrentAnimator() != null) {
+ mPipAnimationController.getCurrentAnimator().cancel();
+ }
+ startTransaction.setAlpha(leash, 1);
+ }
+ mHasFadeOut = false;
mCurrentPipTaskToken = null;
mPipOrganizer.onExitPipFinished(prevPipChange.getTaskInfo());
}
@@ -615,6 +721,25 @@
.round(finishTransaction, leash, isInPip);
}
+ /** Hides and shows the existing PIP during fixed rotation transition of other activities. */
+ private void fadeExistingPip(boolean show) {
+ final SurfaceControl leash = mPipOrganizer.getSurfaceControl();
+ final TaskInfo taskInfo = mPipOrganizer.getTaskInfo();
+ if (leash == null || !leash.isValid() || taskInfo == null) {
+ Log.w(TAG, "Invalid leash on fadeExistingPip: " + leash);
+ return;
+ }
+ final float alphaStart = show ? 0 : 1;
+ final float alphaEnd = show ? 1 : 0;
+ mPipAnimationController
+ .getAnimator(taskInfo, leash, mPipBoundsState.getBounds(), alphaStart, alphaEnd)
+ .setTransitionDirection(TRANSITION_DIRECTION_SAME)
+ .setPipAnimationCallback(mPipAnimationCallback)
+ .setDuration(mEnterExitAnimationDuration)
+ .start();
+ mHasFadeOut = !show;
+ }
+
private void finishResizeForMenu(Rect destinationBounds) {
mPipMenuController.movePipMenu(null, null, destinationBounds);
mPipMenuController.updateMenuBounds(destinationBounds);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
index 22b3ef3..02e713d2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java
@@ -123,6 +123,10 @@
public void forceFinishTransition() {
}
+ /** Called when the fixed rotation started. */
+ public void onFixedRotationStarted() {
+ }
+
public PipTransitionController(PipBoundsState pipBoundsState,
PipMenuController pipMenuController, PipBoundsAlgorithm pipBoundsAlgorithm,
PipAnimationController pipAnimationController, Transitions transitions,
@@ -187,9 +191,8 @@
protected void setBoundsStateForEntry(ComponentName componentName,
PictureInPictureParams params,
ActivityInfo activityInfo) {
- mPipBoundsState.setBoundsStateForEntry(componentName,
- mPipBoundsAlgorithm.getAspectRatioOrDefault(params),
- mPipBoundsAlgorithm.getMinimalSize(activityInfo));
+ mPipBoundsState.setBoundsStateForEntry(componentName, activityInfo, params,
+ mPipBoundsAlgorithm);
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java
index 33f3bfb..8ab78e6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java
@@ -16,15 +16,26 @@
package com.android.wm.shell.pip.tv;
+import static android.view.KeyEvent.KEYCODE_DPAD_DOWN;
+import static android.view.KeyEvent.KEYCODE_DPAD_LEFT;
+import static android.view.KeyEvent.KEYCODE_DPAD_RIGHT;
+import static android.view.KeyEvent.KEYCODE_DPAD_UP;
+
+import static com.android.wm.shell.pip.tv.TvPipBoundsState.ORIENTATION_HORIZONTAL;
+import static com.android.wm.shell.pip.tv.TvPipBoundsState.ORIENTATION_UNDETERMINED;
+import static com.android.wm.shell.pip.tv.TvPipBoundsState.ORIENTATION_VERTICAL;
+
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Rect;
import android.util.Log;
+import android.util.Size;
import android.view.Gravity;
import androidx.annotation.NonNull;
+import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.pip.PipBoundsAlgorithm;
-import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipSnapAlgorithm;
/**
@@ -33,37 +44,282 @@
public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm {
private static final String TAG = TvPipBoundsAlgorithm.class.getSimpleName();
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = TvPipController.DEBUG;
+
+ private final @android.annotation.NonNull TvPipBoundsState mTvPipBoundsState;
+
+ private int mFixedExpandedHeightInPx;
+ private int mFixedExpandedWidthInPx;
public TvPipBoundsAlgorithm(Context context,
- @NonNull PipBoundsState pipBoundsState,
+ @NonNull TvPipBoundsState tvPipBoundsState,
@NonNull PipSnapAlgorithm pipSnapAlgorithm) {
- super(context, pipBoundsState, pipSnapAlgorithm);
+ super(context, tvPipBoundsState, pipSnapAlgorithm);
+ this.mTvPipBoundsState = tvPipBoundsState;
+ }
+
+ @Override
+ protected void reloadResources(Context context) {
+ super.reloadResources(context);
+ final Resources res = context.getResources();
+ mFixedExpandedHeightInPx = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.config_pictureInPictureExpandedHorizontalHeight);
+ mFixedExpandedWidthInPx = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.config_pictureInPictureExpandedVerticalWidth);
+ }
+
+ /** Returns the destination bounds to place the PIP window on entry. */
+ @Override
+ public Rect getEntryDestinationBounds() {
+ if (DEBUG) Log.d(TAG, "getEntryDestinationBounds()");
+ if (mTvPipBoundsState.getTvExpandedAspectRatio() != 0
+ && !mTvPipBoundsState.isTvPipManuallyCollapsed()) {
+ updatePositionOnExpandToggled(Gravity.NO_GRAVITY, true);
+ }
+ return getTvPipBounds(true);
+ }
+
+ /** Returns the current bounds adjusted to the new aspect ratio, if valid. */
+ @Override
+ public Rect getAdjustedDestinationBounds(Rect currentBounds, float newAspectRatio) {
+ if (DEBUG) Log.d(TAG, "getAdjustedDestinationBounds: " + newAspectRatio);
+ return getTvPipBounds(mTvPipBoundsState.isTvPipExpanded());
}
/**
* The normal bounds at a different position on the screen.
*/
- public Rect getTvNormalBounds(int gravity) {
+ public Rect getTvNormalBounds() {
Rect normalBounds = getNormalBounds();
Rect insetBounds = new Rect();
getInsetBounds(insetBounds);
- if (mPipBoundsState.isImeShowing()) {
- if (DEBUG) Log.d(TAG, "IME showing, height: " + mPipBoundsState.getImeHeight());
- insetBounds.bottom -= mPipBoundsState.getImeHeight();
+ if (mTvPipBoundsState.isImeShowing()) {
+ if (DEBUG) Log.d(TAG, "IME showing, height: " + mTvPipBoundsState.getImeHeight());
+ insetBounds.bottom -= mTvPipBoundsState.getImeHeight();
}
Rect result = new Rect();
- Gravity.apply(gravity, normalBounds.width(), normalBounds.height(), insetBounds, result);
+ Gravity.apply(mTvPipBoundsState.getTvPipGravity(), normalBounds.width(),
+ normalBounds.height(), insetBounds, result);
if (DEBUG) {
Log.d(TAG, "normalBounds: " + normalBounds.toShortString());
Log.d(TAG, "insetBounds: " + insetBounds.toShortString());
- Log.d(TAG, "gravity: " + Gravity.toString(gravity));
+ Log.d(TAG, "gravity: " + Gravity.toString(mTvPipBoundsState.getTvPipGravity()));
Log.d(TAG, "resultBounds: " + result.toShortString());
}
+ mTvPipBoundsState.setTvPipExpanded(false);
+
return result;
}
+
+ /**
+ * @return previous gravity if it is to be saved, or Gravity.NO_GRAVITY if not.
+ */
+ int updatePositionOnExpandToggled(int previousGravity, boolean expanding) {
+ if (DEBUG) {
+ Log.d(TAG, "updatePositionOnExpandToggle(), expanding: " + expanding
+ + ", mOrientation: " + mTvPipBoundsState.getTvFixedPipOrientation()
+ + ", previous gravity: " + Gravity.toString(previousGravity));
+ }
+
+ if (!mTvPipBoundsState.isTvExpandedPipEnabled()) {
+ return Gravity.NO_GRAVITY;
+ }
+
+ if (expanding && mTvPipBoundsState.getTvFixedPipOrientation() == ORIENTATION_UNDETERMINED) {
+ float expandedRatio = mTvPipBoundsState.getTvExpandedAspectRatio();
+ if (expandedRatio == 0) {
+ return Gravity.NO_GRAVITY;
+ }
+ if (expandedRatio < 1) {
+ mTvPipBoundsState.setTvFixedPipOrientation(ORIENTATION_VERTICAL);
+ } else {
+ mTvPipBoundsState.setTvFixedPipOrientation(ORIENTATION_HORIZONTAL);
+ }
+
+ }
+
+ int gravityToSave = Gravity.NO_GRAVITY;
+ int currentGravity = mTvPipBoundsState.getTvPipGravity();
+ int updatedGravity;
+
+ if (expanding) {
+ // save collapsed gravity
+ gravityToSave = mTvPipBoundsState.getTvPipGravity();
+
+ if (mTvPipBoundsState.getTvFixedPipOrientation() == ORIENTATION_HORIZONTAL) {
+ updatedGravity =
+ Gravity.CENTER_HORIZONTAL | (currentGravity
+ & Gravity.VERTICAL_GRAVITY_MASK);
+ } else {
+ updatedGravity =
+ Gravity.CENTER_VERTICAL | (currentGravity
+ & Gravity.HORIZONTAL_GRAVITY_MASK);
+ }
+ } else {
+ if (previousGravity != Gravity.NO_GRAVITY) {
+ // The pip hasn't been moved since expanding,
+ // go back to previous collapsed position.
+ updatedGravity = previousGravity;
+ } else {
+ if (mTvPipBoundsState.getTvFixedPipOrientation() == ORIENTATION_HORIZONTAL) {
+ updatedGravity =
+ Gravity.RIGHT | (currentGravity & Gravity.VERTICAL_GRAVITY_MASK);
+ } else {
+ updatedGravity =
+ Gravity.BOTTOM | (currentGravity & Gravity.HORIZONTAL_GRAVITY_MASK);
+ }
+ }
+ }
+ mTvPipBoundsState.setTvPipGravity(updatedGravity);
+ if (DEBUG) Log.d(TAG, "new gravity: " + Gravity.toString(updatedGravity));
+
+ return gravityToSave;
+ }
+
+ /**
+ * @return true if position changed
+ */
+ boolean updatePosition(int keycode) {
+ if (DEBUG) Log.d(TAG, "updatePosition, keycode: " + keycode);
+
+ // Check if position change is valid
+ if (mTvPipBoundsState.isTvPipExpanded()) {
+ int mOrientation = mTvPipBoundsState.getTvFixedPipOrientation();
+ if (mOrientation == ORIENTATION_VERTICAL
+ && (keycode == KEYCODE_DPAD_UP || keycode == KEYCODE_DPAD_DOWN)
+ || mOrientation == ORIENTATION_HORIZONTAL
+ && (keycode == KEYCODE_DPAD_RIGHT || keycode == KEYCODE_DPAD_LEFT)) {
+ return false;
+ }
+ }
+
+ int currentGravity = mTvPipBoundsState.getTvPipGravity();
+ int updatedGravity;
+ // First axis
+ switch (keycode) {
+ case KEYCODE_DPAD_UP:
+ updatedGravity = Gravity.TOP;
+ break;
+ case KEYCODE_DPAD_DOWN:
+ updatedGravity = Gravity.BOTTOM;
+ break;
+ case KEYCODE_DPAD_LEFT:
+ updatedGravity = Gravity.LEFT;
+ break;
+ case KEYCODE_DPAD_RIGHT:
+ updatedGravity = Gravity.RIGHT;
+ break;
+ default:
+ updatedGravity = currentGravity;
+ }
+
+ // Second axis
+ switch (keycode) {
+ case KEYCODE_DPAD_UP:
+ case KEYCODE_DPAD_DOWN:
+ if (mTvPipBoundsState.isTvPipExpanded()) {
+ updatedGravity |= Gravity.CENTER_HORIZONTAL;
+ } else {
+ updatedGravity |= (currentGravity & Gravity.HORIZONTAL_GRAVITY_MASK);
+ }
+ break;
+ case KEYCODE_DPAD_LEFT:
+ case KEYCODE_DPAD_RIGHT:
+ if (mTvPipBoundsState.isTvPipExpanded()) {
+ updatedGravity |= Gravity.CENTER_VERTICAL;
+ } else {
+ updatedGravity |= (currentGravity & Gravity.VERTICAL_GRAVITY_MASK);
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (updatedGravity != currentGravity) {
+ mTvPipBoundsState.setTvPipGravity(updatedGravity);
+ if (DEBUG) Log.d(TAG, "new gravity: " + Gravity.toString(updatedGravity));
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Calculates the PiP bounds.
+ */
+ public Rect getTvPipBounds(boolean expandedIfPossible) {
+ if (DEBUG) {
+ Log.d(TAG, "getExpandedBoundsIfPossible with gravity "
+ + Gravity.toString(mTvPipBoundsState.getTvPipGravity())
+ + ", fixed orientation: " + mTvPipBoundsState.getTvFixedPipOrientation());
+ }
+
+ if (!mTvPipBoundsState.isTvExpandedPipEnabled() || !expandedIfPossible) {
+ return getTvNormalBounds();
+ }
+
+ DisplayLayout displayLayout = mTvPipBoundsState.getDisplayLayout();
+ float expandedRatio = mTvPipBoundsState.getTvExpandedAspectRatio(); // width / height
+ Size expandedSize;
+ if (expandedRatio == 0) {
+ Log.d(TAG, "Expanded mode not supported");
+ return getTvNormalBounds();
+ } else if (expandedRatio < 1) {
+ // vertical
+ if (mTvPipBoundsState.getTvFixedPipOrientation() == ORIENTATION_HORIZONTAL) {
+ expandedSize = mTvPipBoundsState.getTvExpandedSize();
+ } else {
+ int maxHeight = displayLayout.height() - (2 * mScreenEdgeInsets.y);
+ float aspectRatioHeight = mFixedExpandedWidthInPx / expandedRatio;
+
+ if (maxHeight > aspectRatioHeight) {
+ if (DEBUG) Log.d(TAG, "Accommodate aspect ratio");
+ expandedSize = new Size(mFixedExpandedWidthInPx, (int) aspectRatioHeight);
+ } else {
+ if (DEBUG) Log.d(TAG, "Aspect ratio is too extreme, use max size");
+ expandedSize = new Size(mFixedExpandedWidthInPx, maxHeight);
+ }
+ }
+ } else {
+ // horizontal
+ if (mTvPipBoundsState.getTvFixedPipOrientation() == ORIENTATION_VERTICAL) {
+ expandedSize = mTvPipBoundsState.getTvExpandedSize();
+ } else {
+ int maxWidth = displayLayout.width() - (2 * mScreenEdgeInsets.x);
+ float aspectRatioWidth = mFixedExpandedHeightInPx * expandedRatio;
+ if (maxWidth > aspectRatioWidth) {
+ if (DEBUG) Log.d(TAG, "Accommodate aspect ratio");
+ expandedSize = new Size((int) aspectRatioWidth, mFixedExpandedHeightInPx);
+ } else {
+ if (DEBUG) Log.d(TAG, "Aspect ratio is too extreme, use max size");
+ expandedSize = new Size(maxWidth, mFixedExpandedHeightInPx);
+ }
+ }
+ }
+
+ if (expandedSize == null) {
+ return getTvNormalBounds();
+ }
+
+ if (DEBUG) {
+ Log.d(TAG, "expanded size, width: " + expandedSize.getWidth()
+ + ", height: " + expandedSize.getHeight());
+ }
+
+ Rect insetBounds = new Rect();
+ getInsetBounds(insetBounds);
+
+ Rect expandedBounds = new Rect();
+ Gravity.apply(mTvPipBoundsState.getTvPipGravity(), expandedSize.getWidth(),
+ expandedSize.getHeight(), insetBounds, expandedBounds);
+ if (DEBUG) Log.d(TAG, "expanded bounds: " + expandedBounds.toShortString());
+
+ mTvPipBoundsState.setTvExpandedSize(expandedSize);
+ mTvPipBoundsState.setTvPipExpanded(true);
+ return expandedBounds;
+ }
+
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsState.java
new file mode 100644
index 0000000..9370e33
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsState.java
@@ -0,0 +1,166 @@
+/*
+ * 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.wm.shell.pip.tv;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.PictureInPictureParams;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.util.Size;
+import android.view.Gravity;
+
+import com.android.wm.shell.pip.PipBoundsAlgorithm;
+import com.android.wm.shell.pip.PipBoundsState;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * TV specific values of the current state of the PIP bounds.
+ */
+public class TvPipBoundsState extends PipBoundsState {
+
+ public static final int ORIENTATION_UNDETERMINED = 0;
+ public static final int ORIENTATION_VERTICAL = 1;
+ public static final int ORIENTATION_HORIZONTAL = 2;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"ORIENTATION_"}, value = {
+ ORIENTATION_UNDETERMINED,
+ ORIENTATION_VERTICAL,
+ ORIENTATION_HORIZONTAL
+ })
+ public @interface Orientation {
+ }
+
+ public static final int DEFAULT_TV_GRAVITY = Gravity.BOTTOM | Gravity.RIGHT;
+
+ private boolean mIsTvExpandedPipEnabled;
+ private boolean mIsTvPipExpanded;
+ private boolean mTvPipManuallyCollapsed;
+ private float mTvExpandedAspectRatio;
+ private @Orientation int mTvFixedPipOrientation;
+ private int mTvPipGravity;
+ private @Nullable Size mTvExpandedSize;
+
+
+ public TvPipBoundsState(@NonNull Context context) {
+ super(context);
+ setIsTvExpandedPipEnabled(context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_EXPANDED_PICTURE_IN_PICTURE));
+ }
+
+ /**
+ * Initialize states when first entering PiP.
+ */
+ @Override
+ public void setBoundsStateForEntry(ComponentName componentName, ActivityInfo activityInfo,
+ PictureInPictureParams params, PipBoundsAlgorithm pipBoundsAlgorithm) {
+ super.setBoundsStateForEntry(componentName, activityInfo, params, pipBoundsAlgorithm);
+ setTvExpandedAspectRatio(params.getExpandedAspectRatio(), true);
+ }
+
+ /** Resets the TV PiP state for a new activity. */
+ public void resetTvPipState() {
+ mTvFixedPipOrientation = ORIENTATION_UNDETERMINED;
+ mTvPipGravity = DEFAULT_TV_GRAVITY;
+ }
+
+ /** Set the tv expanded bounds of PIP */
+ public void setTvExpandedSize(@Nullable Size bounds) {
+ mTvExpandedSize = bounds;
+ }
+
+ /** Get the PIP tv expanded bounds. */
+ @Nullable
+ public Size getTvExpandedSize() {
+ return mTvExpandedSize;
+ }
+
+ /** Set the PIP aspect ratio for the expanded PIP (TV) that is desired by the app. */
+ public void setTvExpandedAspectRatio(float aspectRatio, boolean override) {
+ if (override || mTvFixedPipOrientation == ORIENTATION_UNDETERMINED || aspectRatio == 0) {
+ mTvExpandedAspectRatio = aspectRatio;
+ resetTvPipState();
+ return;
+ }
+ if ((aspectRatio > 1 && mTvFixedPipOrientation == ORIENTATION_HORIZONTAL)
+ || (aspectRatio <= 1 && mTvFixedPipOrientation == ORIENTATION_VERTICAL)) {
+ mTvExpandedAspectRatio = aspectRatio;
+ }
+ }
+
+ /** Get the PIP aspect ratio for the expanded PIP (TV) that is desired by the app. */
+ public float getTvExpandedAspectRatio() {
+ return mTvExpandedAspectRatio;
+ }
+
+ /** Sets the orientation the expanded TV PiP activity has been fixed to. */
+ public void setTvFixedPipOrientation(@Orientation int orientation) {
+ mTvFixedPipOrientation = orientation;
+ }
+
+ /** Returns the fixed orientation of the expanded PiP on TV. */
+ @Orientation
+ public int getTvFixedPipOrientation() {
+ return mTvFixedPipOrientation;
+ }
+
+ /** Sets the current gravity of the TV PiP. */
+ public void setTvPipGravity(int gravity) {
+ mTvPipGravity = gravity;
+ }
+
+ /** Returns the current gravity of the TV PiP. */
+ public int getTvPipGravity() {
+ return mTvPipGravity;
+ }
+
+ /** Sets whether the TV PiP is currently expanded. */
+ public void setTvPipExpanded(boolean expanded) {
+ mIsTvPipExpanded = expanded;
+ }
+
+ /** Returns whether the TV PiP is currently expanded. */
+ public boolean isTvPipExpanded() {
+ return mIsTvPipExpanded;
+ }
+
+ /** Sets whether the user has manually collapsed the TV PiP. */
+ public void setTvPipManuallyCollapsed(boolean collapsed) {
+ mTvPipManuallyCollapsed = collapsed;
+ }
+
+ /** Returns whether the user has manually collapsed the TV PiP. */
+ public boolean isTvPipManuallyCollapsed() {
+ return mTvPipManuallyCollapsed;
+ }
+
+ /** Sets whether expanded PiP is supported by the device. */
+ public void setIsTvExpandedPipEnabled(boolean enabled) {
+ mIsTvExpandedPipEnabled = enabled;
+ }
+
+ /** Returns whether expanded PiP is supported by the device. */
+ public boolean isTvExpandedPipEnabled() {
+ return mIsTvExpandedPipEnabled;
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java
index de53939..5996acd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java
@@ -18,10 +18,6 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-import static android.view.KeyEvent.KEYCODE_DPAD_DOWN;
-import static android.view.KeyEvent.KEYCODE_DPAD_LEFT;
-import static android.view.KeyEvent.KEYCODE_DPAD_RIGHT;
-import static android.view.KeyEvent.KEYCODE_DPAD_UP;
import android.annotation.IntDef;
import android.app.ActivityManager;
@@ -47,7 +43,6 @@
import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.pip.PinnedStackListenerForwarder;
import com.android.wm.shell.pip.Pip;
-import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipMediaController;
import com.android.wm.shell.pip.PipTaskOrganizer;
import com.android.wm.shell.pip.PipTransitionController;
@@ -69,7 +64,7 @@
@IntDef(prefix = { "STATE_" }, value = {
STATE_NO_PIP,
STATE_PIP,
- STATE_PIP_MENU
+ STATE_PIP_MENU,
})
public @interface State {}
@@ -89,11 +84,9 @@
*/
private static final int STATE_PIP_MENU = 2;
- private static final int DEFAULT_GRAVITY = Gravity.BOTTOM | Gravity.RIGHT;
-
private final Context mContext;
- private final PipBoundsState mPipBoundsState;
+ private final TvPipBoundsState mTvPipBoundsState;
private final TvPipBoundsAlgorithm mTvPipBoundsAlgorithm;
private final PipTaskOrganizer mPipTaskOrganizer;
private final PipMediaController mPipMediaController;
@@ -103,14 +96,14 @@
private final TvPipImpl mImpl = new TvPipImpl();
private @State int mState = STATE_NO_PIP;
- private @Gravity.GravityFlags int mGravity = DEFAULT_GRAVITY;
+ private int mPreviousGravity = TvPipBoundsState.DEFAULT_TV_GRAVITY;
private int mPinnedTaskId = NONEXISTENT_TASK_ID;
private int mResizeAnimationDuration;
public static Pip create(
Context context,
- PipBoundsState pipBoundsState,
+ TvPipBoundsState tvPipBoundsState,
TvPipBoundsAlgorithm tvPipBoundsAlgorithm,
PipTaskOrganizer pipTaskOrganizer,
PipTransitionController pipTransitionController,
@@ -122,7 +115,7 @@
ShellExecutor mainExecutor) {
return new TvPipController(
context,
- pipBoundsState,
+ tvPipBoundsState,
tvPipBoundsAlgorithm,
pipTaskOrganizer,
pipTransitionController,
@@ -136,7 +129,7 @@
private TvPipController(
Context context,
- PipBoundsState pipBoundsState,
+ TvPipBoundsState tvPipBoundsState,
TvPipBoundsAlgorithm tvPipBoundsAlgorithm,
PipTaskOrganizer pipTaskOrganizer,
PipTransitionController pipTransitionController,
@@ -149,9 +142,9 @@
mContext = context;
mMainExecutor = mainExecutor;
- mPipBoundsState = pipBoundsState;
- mPipBoundsState.setDisplayId(context.getDisplayId());
- mPipBoundsState.setDisplayLayout(new DisplayLayout(context, context.getDisplay()));
+ mTvPipBoundsState = tvPipBoundsState;
+ mTvPipBoundsState.setDisplayId(context.getDisplayId());
+ mTvPipBoundsState.setDisplayLayout(new DisplayLayout(context, context.getDisplay()));
mTvPipBoundsAlgorithm = tvPipBoundsAlgorithm;
mPipMediaController = pipMediaController;
@@ -226,10 +219,24 @@
}
@Override
+ public void togglePipExpansion() {
+ if (DEBUG) Log.d(TAG, "togglePipExpansion()");
+ boolean expanding = !mTvPipBoundsState.isTvPipExpanded();
+ int saveGravity = mTvPipBoundsAlgorithm
+ .updatePositionOnExpandToggled(mPreviousGravity, expanding);
+ if (saveGravity != Gravity.NO_GRAVITY) {
+ mPreviousGravity = saveGravity;
+ }
+ mTvPipBoundsState.setTvPipManuallyCollapsed(!expanding);
+ mTvPipBoundsState.setTvPipExpanded(expanding);
+ movePinnedStack();
+ }
+
+ @Override
public void movePip(int keycode) {
- if (updatePosition(keycode)) {
- if (DEBUG) Log.d(TAG, "New gravity: " + Gravity.toString(mGravity));
- mTvPipMenuController.updateMenu(mGravity);
+ if (mTvPipBoundsAlgorithm.updatePosition(keycode)) {
+ mTvPipMenuController.updateGravity(mTvPipBoundsState.getTvPipGravity());
+ mPreviousGravity = Gravity.NO_GRAVITY;
movePinnedStack();
} else {
if (DEBUG) Log.d(TAG, "Position hasn't changed");
@@ -238,38 +245,11 @@
@Override
public int getPipGravity() {
- return mGravity;
+ return mTvPipBoundsState.getTvPipGravity();
}
- /**
- * @return true if position changed
- */
- private boolean updatePosition(int keycode) {
- if (DEBUG) Log.d(TAG, "updatePosition, keycode: " + keycode);
-
- int updatedGravity;
- switch (keycode) {
- case KEYCODE_DPAD_UP:
- updatedGravity = (mGravity & (~Gravity.BOTTOM)) | Gravity.TOP;
- break;
- case KEYCODE_DPAD_DOWN:
- updatedGravity = (mGravity & (~Gravity.TOP)) | Gravity.BOTTOM;
- break;
- case KEYCODE_DPAD_LEFT:
- updatedGravity = (mGravity & (~Gravity.RIGHT)) | Gravity.LEFT;
- break;
- case KEYCODE_DPAD_RIGHT:
- updatedGravity = (mGravity & (~Gravity.LEFT)) | Gravity.RIGHT;
- break;
- default:
- updatedGravity = mGravity;
- }
-
- if (updatedGravity != mGravity) {
- mGravity = updatedGravity;
- return true;
- }
- return false;
+ public int getOrientation() {
+ return mTvPipBoundsState.getTvFixedPipOrientation();
}
/**
@@ -280,11 +260,12 @@
return;
}
- Rect bounds = mTvPipBoundsAlgorithm.getTvNormalBounds(mGravity);
+ Rect bounds = mTvPipBoundsAlgorithm.getTvPipBounds(mTvPipBoundsState.isTvPipExpanded());
if (DEBUG) Log.d(TAG, "movePinnedStack() - new pip bounds: " + bounds.toShortString());
mPipTaskOrganizer.scheduleAnimateResizePip(bounds,
mResizeAnimationDuration, rect -> {
if (DEBUG) Log.d(TAG, "movePinnedStack() animation done");
+ mTvPipMenuController.updateExpansionState();
});
}
@@ -328,7 +309,7 @@
mPipNotificationController.dismiss();
mTvPipMenuController.hideMenu();
- mGravity = DEFAULT_GRAVITY;
+ mTvPipBoundsState.resetTvPipState();
setState(STATE_NO_PIP);
mPinnedTaskId = NONEXISTENT_TASK_ID;
}
@@ -346,11 +327,6 @@
@Override
public void onPipTransitionFinished(int direction) {
if (DEBUG) Log.d(TAG, "onPipTransition_Finished(), state=" + stateToName(mState));
-
- if (mState == STATE_PIP_MENU) {
- if (DEBUG) Log.d(TAG, " > show menu");
- mTvPipMenuController.showMenu();
- }
}
private void setState(@State int state) {
@@ -359,6 +335,11 @@
+ stateToName(mState));
}
mState = state;
+
+ if (mState == STATE_PIP_MENU) {
+ if (DEBUG) Log.d(TAG, " > show menu");
+ mTvPipMenuController.showMenu();
+ }
}
private void loadConfigurations() {
@@ -408,13 +389,13 @@
+ ", height=" + imeHeight);
}
- if (imeVisible == mPipBoundsState.isImeShowing()
- && (!imeVisible || imeHeight == mPipBoundsState.getImeHeight())) {
+ if (imeVisible == mTvPipBoundsState.isImeShowing()
+ && (!imeVisible || imeHeight == mTvPipBoundsState.getImeHeight())) {
// Nothing changed: either IME has been and remains invisible, or remains
// visible with the same height.
return;
}
- mPipBoundsState.setImeVisibility(imeVisible, imeHeight);
+ mTvPipBoundsState.setImeVisibility(imeVisible, imeHeight);
if (mState != STATE_NO_PIP) {
movePinnedStack();
@@ -422,6 +403,61 @@
}
@Override
+ public void onAspectRatioChanged(float ratio) {
+ if (DEBUG) Log.d(TAG, "onAspectRatioChanged: " + ratio);
+
+ boolean ratioChanged = mTvPipBoundsState.getAspectRatio() != ratio;
+ mTvPipBoundsState.setAspectRatio(ratio);
+
+ if (!mTvPipBoundsState.isTvPipExpanded() && ratioChanged) {
+ movePinnedStack();
+ }
+ }
+
+ @Override
+ public void onExpandedAspectRatioChanged(float ratio) {
+ if (DEBUG) Log.d(TAG, "onExpandedAspectRatioChanged: " + ratio);
+
+ // 0) No update to the ratio --> don't do anything
+ if (mTvPipBoundsState.getTvExpandedAspectRatio() == ratio) {
+ return;
+ }
+
+ mTvPipBoundsState.setTvExpandedAspectRatio(ratio, false);
+
+ // 1) PiP is expanded and only aspect ratio changed, but wasn't disabled
+ // --> update bounds, but don't toggle
+ if (mTvPipBoundsState.isTvPipExpanded() && ratio != 0) {
+ movePinnedStack();
+ }
+
+ // 2) PiP is expanded, but expanded PiP was disabled
+ // --> collapse PiP
+ if (mTvPipBoundsState.isTvPipExpanded() && ratio == 0) {
+ int saveGravity = mTvPipBoundsAlgorithm
+ .updatePositionOnExpandToggled(mPreviousGravity, false);
+ if (saveGravity != Gravity.NO_GRAVITY) {
+ mPreviousGravity = saveGravity;
+ }
+ mTvPipBoundsState.setTvPipExpanded(false);
+ movePinnedStack();
+ }
+
+ // 3) PiP not expanded and not manually collapsed and expand was enabled
+ // --> expand to new ratio
+ if (!mTvPipBoundsState.isTvPipExpanded() && ratio != 0
+ && !mTvPipBoundsState.isTvPipManuallyCollapsed()) {
+ int saveGravity = mTvPipBoundsAlgorithm
+ .updatePositionOnExpandToggled(mPreviousGravity, true);
+ if (saveGravity != Gravity.NO_GRAVITY) {
+ mPreviousGravity = saveGravity;
+ }
+ mTvPipBoundsState.setTvPipExpanded(true);
+ movePinnedStack();
+ }
+ }
+
+ @Override
public void onMovementBoundsChanged(boolean fromImeAdjustment) {}
@Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java
index bda685e..4eb46d9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java
@@ -65,7 +65,7 @@
setImageResource(typedArray.getResourceId(0, 0));
final int textResId = typedArray.getResourceId(1, 0);
if (textResId != 0) {
- setTextAndDescription(getContext().getString(textResId));
+ setTextAndDescription(textResId);
}
typedArray.recycle();
}
@@ -110,6 +110,13 @@
mButtonView.setContentDescription(text);
}
+ /**
+ * Sets the text and description with the given string resource id.
+ */
+ public void setTextAndDescription(int resId) {
+ setTextAndDescription(getContext().getString(resId));
+ }
+
@Override
public void setEnabled(boolean enabled) {
mButtonView.setEnabled(enabled);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java
index f838a0b..69d6c9e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java
@@ -18,6 +18,7 @@
import static android.view.WindowManager.SHELL_ROOT_LAYER_PIP;
+import android.app.ActivityManager;
import android.app.RemoteAction;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -37,7 +38,6 @@
import com.android.wm.shell.R;
import com.android.wm.shell.common.SystemWindows;
-import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipMediaController;
import com.android.wm.shell.pip.PipMenuController;
@@ -53,7 +53,7 @@
private final Context mContext;
private final SystemWindows mSystemWindows;
- private final PipBoundsState mPipBoundsState;
+ private final TvPipBoundsState mTvPipBoundsState;
private final Handler mMainHandler;
private Delegate mDelegate;
@@ -85,11 +85,11 @@
}
};
- public TvPipMenuController(Context context, PipBoundsState pipBoundsState,
+ public TvPipMenuController(Context context, TvPipBoundsState tvPipBoundsState,
SystemWindows systemWindows, PipMediaController pipMediaController,
Handler mainHandler) {
mContext = context;
- mPipBoundsState = pipBoundsState;
+ mTvPipBoundsState = tvPipBoundsState;
mSystemWindows = systemWindows;
mMainHandler = mainHandler;
@@ -151,12 +151,13 @@
if (DEBUG) Log.d(TAG, "showMenu()");
if (mPipMenuView != null) {
- Rect menuBounds = getMenuBounds(mPipBoundsState.getBounds());
+ Rect menuBounds = getMenuBounds(mTvPipBoundsState.getBounds());
mSystemWindows.updateViewLayout(mPipMenuView, getPipMenuLayoutParams(
MENU_WINDOW_TITLE, menuBounds.width(), menuBounds.height()));
maybeUpdateMenuViewActions();
+ updateExpansionState();
- SurfaceControl menuSurfaceControl = mSystemWindows.getViewSurface(mPipMenuView);
+ SurfaceControl menuSurfaceControl = getSurfaceControl();
if (menuSurfaceControl != null) {
SurfaceControl.Transaction t = new SurfaceControl.Transaction();
t.setRelativeLayer(mPipMenuView.getWindowSurfaceControl(), mLeash, 1);
@@ -167,10 +168,16 @@
}
}
- void updateMenu(int gravity) {
+ void updateGravity(int gravity) {
mPipMenuView.showMovementHints(gravity);
}
+ void updateExpansionState() {
+ mPipMenuView.setExpandedModeEnabled(mTvPipBoundsState.isTvExpandedPipEnabled()
+ && mTvPipBoundsState.getTvExpandedAspectRatio() != 0);
+ mPipMenuView.setIsExpanded(mTvPipBoundsState.isTvPipExpanded());
+ }
+
private Rect getMenuBounds(Rect pipBounds) {
int extraSpaceInPx = mContext.getResources()
.getDimensionPixelSize(R.dimen.pip_menu_outer_space);
@@ -350,7 +357,9 @@
SurfaceControl surfaceControl = getSurfaceControl();
SyncRtSurfaceTransactionApplier.SurfaceParams params =
new SyncRtSurfaceTransactionApplier.SurfaceParams.Builder(
- surfaceControl).withMatrix(mMoveTransform).build();
+ surfaceControl)
+ .withMatrix(mMoveTransform)
+ .build();
if (pipLeash != null && transaction != null) {
SyncRtSurfaceTransactionApplier.SurfaceParams
@@ -366,6 +375,8 @@
mPipMenuView.getHandler().removeCallbacks(mUpdateEmbeddedMatrix);
mPipMenuView.getHandler().post(mUpdateEmbeddedMatrix);
}
+
+ updateMenuBounds(pipDestBounds);
}
private boolean maybeCreateSyncApplier() {
@@ -397,6 +408,14 @@
mSystemWindows.updateViewLayout(mPipMenuView,
getPipMenuLayoutParams(MENU_WINDOW_TITLE, menuBounds.width(),
menuBounds.height()));
+ if (mPipMenuView != null) {
+ mPipMenuView.updateLayout(destinationBounds);
+ }
+ }
+
+ @Override
+ public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) {
+ Log.d(TAG, "onFocusTaskChanged");
}
@Override
@@ -416,6 +435,11 @@
mDelegate.movePipToFullscreen();
}
+ @Override
+ public void onToggleExpandedMode() {
+ mDelegate.togglePipExpansion();
+ }
+
interface Delegate {
void movePipToFullscreen();
@@ -423,6 +447,8 @@
int getPipGravity();
+ void togglePipExpansion();
+
void closeMenu();
void closePip();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java
index 84eae9e..773e9bf 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java
@@ -23,19 +23,21 @@
import static android.view.KeyEvent.KEYCODE_DPAD_LEFT;
import static android.view.KeyEvent.KEYCODE_DPAD_RIGHT;
import static android.view.KeyEvent.KEYCODE_DPAD_UP;
+import static android.view.KeyEvent.KEYCODE_ENTER;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.content.Context;
+import android.graphics.Rect;
import android.os.Handler;
import android.os.IBinder;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
-import android.view.LayoutInflater;
import android.view.SurfaceControl;
import android.view.View;
+import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.WindowManagerGlobal;
import android.widget.FrameLayout;
@@ -72,6 +74,13 @@
private final ImageView mArrowLeft;
private IBinder mFocusGrantToken = null;
+ private final ViewGroup mScrollView;
+ private final ViewGroup mHorizontalScrollView;
+
+ private Rect mCurrentBounds;
+
+ private final TvPipMenuActionButton mExpandButton;
+
public TvPipMenuView(@NonNull Context context) {
this(context, null);
}
@@ -97,6 +106,11 @@
.setOnClickListener(this);
mActionButtonsContainer.findViewById(R.id.tv_pip_menu_move_button)
.setOnClickListener(this);
+ mExpandButton = findViewById(R.id.tv_pip_menu_expand_button);
+ mExpandButton.setOnClickListener(this);
+
+ mScrollView = findViewById(R.id.tv_pip_menu_scroll);
+ mHorizontalScrollView = findViewById(R.id.tv_pip_menu_horizontal_scroll);
mMenuFrameView = findViewById(R.id.tv_pip_menu_frame);
@@ -106,6 +120,34 @@
mArrowLeft = findViewById(R.id.tv_pip_menu_arrow_left);
}
+ void updateLayout(Rect updatedBounds) {
+ Log.d(TAG, "update menu layout: " + updatedBounds.toShortString());
+ boolean previouslyVertical =
+ mCurrentBounds != null && mCurrentBounds.height() > mCurrentBounds.width();
+ boolean vertical = updatedBounds.height() > updatedBounds.width();
+
+ mCurrentBounds = updatedBounds;
+ if (previouslyVertical == vertical) {
+ if (DEBUG) Log.d(TAG, "no update for menu layout");
+ return;
+ } else {
+ if (DEBUG) Log.d(TAG, "change menu layout to vertical: " + vertical);
+ }
+
+ if (vertical) {
+ mHorizontalScrollView.removeView(mActionButtonsContainer);
+ mScrollView.addView(mActionButtonsContainer);
+ } else {
+ mScrollView.removeView(mActionButtonsContainer);
+ mHorizontalScrollView.addView(mActionButtonsContainer);
+ }
+ mActionButtonsContainer.setOrientation(vertical ? LinearLayout.VERTICAL
+ : LinearLayout.HORIZONTAL);
+
+ mScrollView.setVisibility(vertical ? VISIBLE : GONE);
+ mHorizontalScrollView.setVisibility(vertical ? GONE : VISIBLE);
+ }
+
void setListener(@Nullable Listener listener) {
mListener = listener;
}
@@ -114,6 +156,18 @@
mFocusGrantToken = token;
}
+ void setExpandedModeEnabled(boolean enabled) {
+ mExpandButton.setVisibility(enabled ? VISIBLE : GONE);
+ }
+
+ void setIsExpanded(boolean expanded) {
+ if (DEBUG) Log.d(TAG, "setIsExpanded, expanded: " + expanded);
+ mExpandButton.setImageResource(
+ expanded ? R.drawable.pip_ic_collapse : R.drawable.pip_ic_expand);
+ mExpandButton.setTextAndDescription(
+ expanded ? R.string.pip_collapse : R.string.pip_expand);
+ }
+
void show(boolean inMoveMode, int gravity) {
if (DEBUG) Log.d(TAG, "show(), inMoveMode: " + inMoveMode);
grantWindowFocus(true);
@@ -181,13 +235,13 @@
final int actionsNumber = actions.size();
int buttonsNumber = mAdditionalButtons.size();
if (actionsNumber > buttonsNumber) {
- final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
// Add buttons until we have enough to display all of the actions.
while (actionsNumber > buttonsNumber) {
TvPipMenuActionButton button = new TvPipMenuActionButton(mContext);
button.setOnClickListener(this);
- mActionButtonsContainer.addView(button);
+ mActionButtonsContainer.addView(button,
+ mActionButtonsContainer.getChildCount() - 1);
mAdditionalButtons.add(button);
buttonsNumber++;
@@ -239,6 +293,8 @@
mListener.onEnterMoveMode();
} else if (id == R.id.tv_pip_menu_close_button) {
mListener.onCloseButtonClick();
+ } else if (id == R.id.tv_pip_menu_expand_button) {
+ mListener.onToggleExpandedMode();
} else {
// This should be an "additional action"
final RemoteAction action = (RemoteAction) v.getTag();
@@ -271,6 +327,7 @@
case KEYCODE_DPAD_RIGHT:
return mListener.onPipMovement(event.getKeyCode()) || super.dispatchKeyEvent(
event);
+ case KEYCODE_ENTER:
case KEYCODE_DPAD_CENTER:
return mListener.onExitMoveMode() || super.dispatchKeyEvent(event);
default:
@@ -286,10 +343,14 @@
public void showMovementHints(int gravity) {
if (DEBUG) Log.d(TAG, "showMovementHints(), position: " + Gravity.toString(gravity));
- animateAlphaTo((gravity & Gravity.BOTTOM) == Gravity.BOTTOM ? 1f : 0f, mArrowUp);
- animateAlphaTo((gravity & Gravity.TOP) == Gravity.TOP ? 1f : 0f, mArrowDown);
- animateAlphaTo((gravity & Gravity.RIGHT) == Gravity.RIGHT ? 1f : 0f, mArrowLeft);
- animateAlphaTo((gravity & Gravity.LEFT) == Gravity.LEFT ? 1f : 0f, mArrowRight);
+ animateAlphaTo(checkGravity(gravity, Gravity.BOTTOM) ? 1f : 0f, mArrowUp);
+ animateAlphaTo(checkGravity(gravity, Gravity.TOP) ? 1f : 0f, mArrowDown);
+ animateAlphaTo(checkGravity(gravity, Gravity.RIGHT) ? 1f : 0f, mArrowLeft);
+ animateAlphaTo(checkGravity(gravity, Gravity.LEFT) ? 1f : 0f, mArrowRight);
+ }
+
+ private boolean checkGravity(int gravity, int feature) {
+ return (gravity & feature) == feature;
}
/**
@@ -330,5 +391,7 @@
void onCloseButtonClick();
void onFullscreenButtonClick();
+
+ void onToggleExpandedMode();
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl
index d022ec1..13137fa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl
@@ -97,9 +97,8 @@
* Start a pair of intent and task using legacy transition system.
*/
oneway void startIntentAndTaskWithLegacyTransition(in PendingIntent pendingIntent,
- in Intent fillInIntent, int taskId, boolean intentFirst, in Bundle mainOptions,
- in Bundle sideOptions, int sidePosition, float splitRatio,
- in RemoteAnimationAdapter adapter) = 12;
+ in Intent fillInIntent, int taskId, in Bundle mainOptions,in Bundle sideOptions,
+ int sidePosition, float splitRatio, in RemoteAnimationAdapter adapter) = 12;
/**
* Blocking call that notifies and gets additional split-screen targets when entering
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index 990b53a..e88eef9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -349,17 +349,20 @@
RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback,
SurfaceControl.Transaction t) {
- mStageCoordinator.updateSurfaceBounds(null /* layout */, t);
-
- if (apps != null) {
- for (int i = 0; i < apps.length; ++i) {
- if (apps[i].mode == MODE_OPENING) {
- t.show(apps[i].leash);
- }
- }
+ if (apps == null || apps.length == 0) {
+ // Do nothing when the animation was cancelled.
+ t.apply();
+ return;
}
+ mStageCoordinator.updateSurfaceBounds(null /* layout */, t);
+ for (int i = 0; i < apps.length; ++i) {
+ if (apps[i].mode == MODE_OPENING) {
+ t.show(apps[i].leash);
+ }
+ }
t.apply();
+
if (finishedCallback != null) {
try {
finishedCallback.onAnimationFinished();
@@ -642,14 +645,13 @@
@Override
public void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent,
- Intent fillInIntent, int taskId, boolean intentFirst, Bundle mainOptions,
- Bundle sideOptions, int sidePosition, float splitRatio,
- RemoteAnimationAdapter adapter) {
+ Intent fillInIntent, int taskId, Bundle mainOptions, Bundle sideOptions,
+ int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) {
executeRemoteCallWithTaskPermission(mController,
"startIntentAndTaskWithLegacyTransition", (controller) ->
controller.mStageCoordinator.startIntentAndTaskWithLegacyTransition(
- pendingIntent, fillInIntent, taskId, intentFirst, mainOptions,
- sideOptions, sidePosition, splitRatio, adapter));
+ pendingIntent, fillInIntent, taskId, mainOptions, sideOptions,
+ sidePosition, splitRatio, adapter));
}
@Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index 029d073..81dacdb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -373,6 +373,23 @@
void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions,
int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition,
float splitRatio, RemoteAnimationAdapter adapter) {
+ startWithLegacyTransition(mainTaskId, sideTaskId, null /* pendingIntent */,
+ null /* fillInIntent */, mainOptions, sideOptions, sidePosition, splitRatio,
+ adapter);
+ }
+
+ /** Start an intent and a task ordered by {@code intentFirst}. */
+ void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, Intent fillInIntent,
+ int taskId, @Nullable Bundle mainOptions, @Nullable Bundle sideOptions,
+ @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) {
+ startWithLegacyTransition(taskId, INVALID_TASK_ID, pendingIntent, fillInIntent,
+ mainOptions, sideOptions, sidePosition, splitRatio, adapter);
+ }
+
+ private void startWithLegacyTransition(int mainTaskId, int sideTaskId,
+ @Nullable PendingIntent pendingIntent, @Nullable Intent fillInIntent,
+ @Nullable Bundle mainOptions, @Nullable Bundle sideOptions,
+ @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) {
// Init divider first to make divider leash for remote animation target.
mSplitLayout.init();
// Set false to avoid record new bounds with old task still on top;
@@ -466,124 +483,19 @@
addActivityOptions(sideOptions, mSideStage);
// Add task launch requests
- wct.startTask(mainTaskId, mainOptions);
- wct.startTask(sideTaskId, sideOptions);
+ if (pendingIntent != null && fillInIntent != null) {
+ wct.startTask(mainTaskId, mainOptions);
+ wct.sendPendingIntent(pendingIntent, fillInIntent, sideOptions);
+ } else {
+ wct.startTask(mainTaskId, mainOptions);
+ wct.startTask(sideTaskId, sideOptions);
+ }
// Using legacy transitions, so we can't use blast sync since it conflicts.
mTaskOrganizer.applyTransaction(wct);
mSyncQueue.runInSync(t -> updateSurfaceBounds(mSplitLayout, t));
}
- /** Start an intent and a task ordered by {@code intentFirst}. */
- void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, Intent fillInIntent,
- int taskId, boolean intentFirst, @Nullable Bundle mainOptions,
- @Nullable Bundle sideOptions, @SplitPosition int sidePosition, float splitRatio,
- RemoteAnimationAdapter adapter) {
- // TODO: try pulling the first chunk of this method into a method so that it can be shared
- // with startTasksWithLegacyTransition. So far attempts to do so result in failure in split.
-
- // Init divider first to make divider leash for remote animation target.
- mSplitLayout.init();
- // Set false to avoid record new bounds with old task still on top;
- mShouldUpdateRecents = false;
- final WindowContainerTransaction wct = new WindowContainerTransaction();
- final WindowContainerTransaction evictWct = new WindowContainerTransaction();
- prepareEvictChildTasks(SPLIT_POSITION_TOP_OR_LEFT, evictWct);
- prepareEvictChildTasks(SPLIT_POSITION_BOTTOM_OR_RIGHT, evictWct);
- // Need to add another wrapper here in shell so that we can inject the divider bar
- // and also manage the process elevation via setRunningRemote
- IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() {
- @Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
- final IRemoteAnimationFinishedCallback finishedCallback) {
- RemoteAnimationTarget[] augmentedNonApps =
- new RemoteAnimationTarget[nonApps.length + 1];
- for (int i = 0; i < nonApps.length; ++i) {
- augmentedNonApps[i] = nonApps[i];
- }
- augmentedNonApps[augmentedNonApps.length - 1] = getDividerBarLegacyTarget();
-
- IRemoteAnimationFinishedCallback wrapCallback =
- new IRemoteAnimationFinishedCallback.Stub() {
- @Override
- public void onAnimationFinished() throws RemoteException {
- mShouldUpdateRecents = true;
- mSyncQueue.queue(evictWct);
- mSyncQueue.runInSync(t -> setDividerVisibility(true, t));
- finishedCallback.onAnimationFinished();
- }
- };
- try {
- try {
- ActivityTaskManager.getService().setRunningRemoteTransitionDelegate(
- adapter.getCallingApplication());
- } catch (SecurityException e) {
- Slog.e(TAG, "Unable to boost animation thread. This should only happen"
- + " during unit tests");
- }
- adapter.getRunner().onAnimationStart(transit, apps, wallpapers,
- augmentedNonApps, wrapCallback);
- } catch (RemoteException e) {
- Slog.e(TAG, "Error starting remote animation", e);
- }
- }
-
- @Override
- public void onAnimationCancelled() {
- mShouldUpdateRecents = true;
- mSyncQueue.queue(evictWct);
- mSyncQueue.runInSync(t -> setDividerVisibility(true, t));
- try {
- adapter.getRunner().onAnimationCancelled();
- } catch (RemoteException e) {
- Slog.e(TAG, "Error starting remote animation", e);
- }
- }
- };
- RemoteAnimationAdapter wrappedAdapter = new RemoteAnimationAdapter(
- wrapper, adapter.getDuration(), adapter.getStatusBarTransitionDelay());
-
- if (mainOptions == null) {
- mainOptions = ActivityOptions.makeRemoteAnimation(wrappedAdapter).toBundle();
- } else {
- ActivityOptions mainActivityOptions = ActivityOptions.fromBundle(mainOptions);
- mainActivityOptions.update(ActivityOptions.makeRemoteAnimation(wrappedAdapter));
- mainOptions = mainActivityOptions.toBundle();
- }
-
- sideOptions = sideOptions != null ? sideOptions : new Bundle();
- setSideStagePosition(sidePosition, wct);
-
- mSplitLayout.setDivideRatio(splitRatio);
- if (mMainStage.isActive()) {
- mMainStage.moveToTop(getMainStageBounds(), wct);
- } else {
- // Build a request WCT that will launch both apps such that task 0 is on the main stage
- // while task 1 is on the side stage.
- mMainStage.activate(getMainStageBounds(), wct, false /* reparent */);
- }
- mSideStage.moveToTop(getSideStageBounds(), wct);
-
- // Make sure the launch options will put tasks in the corresponding split roots
- addActivityOptions(mainOptions, mMainStage);
- addActivityOptions(sideOptions, mSideStage);
-
- // Add task launch requests
- if (intentFirst) {
- wct.sendPendingIntent(pendingIntent, fillInIntent, mainOptions);
- wct.startTask(taskId, sideOptions);
- } else {
- wct.startTask(taskId, mainOptions);
- wct.sendPendingIntent(pendingIntent, fillInIntent, sideOptions);
- }
-
- // Using legacy transitions, so we can't use blast sync since it conflicts.
- mTaskOrganizer.applyTransaction(wct);
- }
-
/**
* Collects all the current child tasks of a specific split and prepares transaction to evict
* them to display.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
index e255e44..025bcad 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
@@ -22,6 +22,9 @@
import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN;
import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+import static com.android.wm.shell.startingsurface.StartingSurfaceDrawer.MAX_ANIMATION_DURATION;
+import static com.android.wm.shell.startingsurface.StartingSurfaceDrawer.MINIMAL_ANIMATION_DURATION;
+
import android.annotation.ColorInt;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -46,6 +49,7 @@
import android.net.Uri;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.util.ArrayMap;
@@ -322,6 +326,33 @@
private int mAnimationDuration = 0;
}
+ /**
+ * Get an optimal animation duration to keep the splash screen from showing.
+ *
+ * @param animationDuration The animation duration defined from app.
+ * @param appReadyDuration The real duration from the starting the app to the first app window
+ * drawn.
+ */
+ @VisibleForTesting
+ static long getShowingDuration(long animationDuration, long appReadyDuration) {
+ if (animationDuration <= appReadyDuration) {
+ // app window ready took longer time than animation, it can be removed ASAP.
+ return appReadyDuration;
+ }
+ if (appReadyDuration < MAX_ANIMATION_DURATION) {
+ if (animationDuration > MAX_ANIMATION_DURATION
+ || appReadyDuration < MINIMAL_ANIMATION_DURATION) {
+ // animation is too long or too short, cut off with minimal duration
+ return MINIMAL_ANIMATION_DURATION;
+ }
+ // animation is longer than dOpt but shorter than max, allow it to play till finish
+ return MAX_ANIMATION_DURATION;
+ }
+ // the shortest duration is longer than dMax, cut off no matter how long the animation
+ // will be.
+ return appReadyDuration;
+ }
+
private class StartingWindowViewBuilder {
private final Context mContext;
private final ActivityInfo mActivityInfo;
@@ -977,9 +1008,27 @@
* Create and play the default exit animation for splash screen view.
*/
void applyExitAnimation(SplashScreenView view, SurfaceControl leash,
- Rect frame, Runnable finishCallback) {
- final SplashScreenExitAnimation animation = new SplashScreenExitAnimation(mContext, view,
- leash, frame, mMainWindowShiftLength, mTransactionPool, finishCallback);
- animation.startAnimations();
+ Rect frame, Runnable finishCallback, long createTime) {
+ final Runnable playAnimation = () -> {
+ final SplashScreenExitAnimation animation = new SplashScreenExitAnimation(mContext,
+ view, leash, frame, mMainWindowShiftLength, mTransactionPool, finishCallback);
+ animation.startAnimations();
+ };
+ if (view.getIconView() == null) {
+ playAnimation.run();
+ return;
+ }
+ final long appReadyDuration = SystemClock.uptimeMillis() - createTime;
+ final long animDuration = view.getIconAnimationDuration() != null
+ ? view.getIconAnimationDuration().toMillis() : 0;
+ final long minimumShowingDuration = getShowingDuration(animDuration, appReadyDuration);
+ final long delayed = minimumShowingDuration - appReadyDuration;
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW,
+ "applyExitAnimation delayed: %s", delayed);
+ if (delayed > 0) {
+ view.postDelayed(playAnimation, delayed);
+ } else {
+ playAnimation.run();
+ }
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
index 9a966b8..3442699 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
@@ -41,6 +41,7 @@
import android.os.IBinder;
import android.os.RemoteCallback;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.util.Slog;
@@ -121,6 +122,25 @@
private final StartingWindowRemovalInfo mTmpRemovalInfo = new StartingWindowRemovalInfo();
/**
+ * The minimum duration during which the splash screen is shown when the splash screen icon is
+ * animated.
+ */
+ static final long MINIMAL_ANIMATION_DURATION = 400L;
+
+ /**
+ * Allow the icon style splash screen to be displayed for longer to give time for the animation
+ * to finish, i.e. the extra buffer time to keep the splash screen if the animation is slightly
+ * longer than the {@link #MINIMAL_ANIMATION_DURATION} duration.
+ */
+ static final long TIME_WINDOW_DURATION = 100L;
+
+ /**
+ * The maximum duration during which the splash screen will be shown if the application is ready
+ * to show before the icon animation finishes.
+ */
+ static final long MAX_ANIMATION_DURATION = MINIMAL_ANIMATION_DURATION + TIME_WINDOW_DURATION;
+
+ /**
* @param splashScreenExecutor The thread used to control add and remove starting window.
*/
public StartingSurfaceDrawer(Context context, ShellExecutor splashScreenExecutor,
@@ -593,7 +613,8 @@
if (removalInfo.playRevealAnimation) {
mSplashscreenContentDrawer.applyExitAnimation(record.mContentView,
removalInfo.windowAnimationLeash, removalInfo.mainFrame,
- () -> removeWindowInner(record.mDecorView, true));
+ () -> removeWindowInner(record.mDecorView, true),
+ record.mCreateTime);
} else {
// the SplashScreenView has been copied to client, hide the view to skip
// default exit animation
@@ -641,6 +662,7 @@
private boolean mSetSplashScreen;
private @StartingWindowType int mSuggestType;
private int mBGColor;
+ private final long mCreateTime;
StartingWindowRecord(IBinder appToken, View decorView,
TaskSnapshotWindow taskSnapshotWindow, @StartingWindowType int suggestType) {
@@ -651,6 +673,7 @@
mBGColor = mTaskSnapshotWindow.getBackgroundColor();
}
mSuggestType = suggestType;
+ mCreateTime = SystemClock.uptimeMillis();
}
private void setSplashScreenView(SplashScreenView splashScreenView) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 86b73fc..efb52a5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -74,6 +74,8 @@
/** Set to {@code true} to enable shell transitions. */
public static final boolean ENABLE_SHELL_TRANSITIONS =
SystemProperties.getBoolean("persist.debug.shell_transit", false);
+ public static final boolean SHELL_TRANSITIONS_ROTATION = ENABLE_SHELL_TRANSITIONS
+ && SystemProperties.getBoolean("persist.debug.shell_transit_rotate", false);
/** Transition type for exiting PIP via the Shell, via pressing the expand button. */
public static final int TRANSIT_EXIT_PIP = TRANSIT_FIRST_CUSTOM + 1;
diff --git a/libs/WindowManager/Shell/tests/flicker/AndroidTest.xml b/libs/WindowManager/Shell/tests/flicker/AndroidTest.xml
index 556742e..574a9f4 100644
--- a/libs/WindowManager/Shell/tests/flicker/AndroidTest.xml
+++ b/libs/WindowManager/Shell/tests/flicker/AndroidTest.xml
@@ -26,16 +26,8 @@
<option name="shell-timeout" value="6600s" />
<option name="test-timeout" value="6000s" />
<option name="hidden-api-checks" value="false" />
- <option name="device-listeners"
- value="com.android.server.wm.flicker.TraceFileReadyListener" />
</test>
<metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
- <option name="pull-pattern-keys" value="(\w)+\.winscope" />
- <option name="pull-pattern-keys" value="(\w)+\.mp4" />
- <option name="collect-on-run-ended-only" value="false" />
- <option name="clean-up" value="true" />
- </metrics_collector>
- <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
<option name="directory-keys" value="/sdcard/flicker" />
<option name="collect-on-run-ended-only" value="true" />
<option name="clean-up" value="true" />
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt
index a20a201..a57d3e6 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt
@@ -16,8 +16,8 @@
package com.android.wm.shell.flicker.bubble
-import android.platform.test.annotations.Presubmit
-import androidx.test.filters.RequiresDevice
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.annotation.Group4
@@ -25,8 +25,8 @@
import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import org.junit.Assume
import org.junit.Before
-import org.junit.runner.RunWith
import org.junit.Test
+import org.junit.runner.RunWith
import org.junit.runners.Parameterized
/**
@@ -57,7 +57,7 @@
}
}
- @Presubmit
+ @FlakyTest(bugId = 218642026)
@Test
open fun testAppIsAlwaysVisible() {
testSpec.assertLayers {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
index 467cadc..f2c5093 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
@@ -16,7 +16,6 @@
package com.android.wm.shell.flicker.pip
-import android.platform.test.annotations.Postsubmit
import android.platform.test.annotations.Presubmit
import android.view.Surface
import androidx.test.filters.FlakyTest
@@ -167,7 +166,7 @@
* Checks that the focus changes between the [pipApp] window and the launcher when
* closing the pip window
*/
- @Postsubmit
+ @Presubmit
@Test
fun focusChanges() {
testSpec.assertEventLog {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
index 173140d..c22d3f6 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
@@ -16,7 +16,6 @@
package com.android.wm.shell.flicker.pip
-import android.platform.test.annotations.Postsubmit
import android.platform.test.annotations.Presubmit
import android.view.Surface
import com.android.server.wm.flicker.FlickerTestParameter
@@ -98,11 +97,11 @@
/**
* Checks that the focus doesn't change between windows during the transition
*/
- @Postsubmit
+ @Presubmit
@Test
open fun focusDoesNotChange() {
testSpec.assertEventLog {
this.focusDoesNotChange()
}
}
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt
index 931d060..4f98b70 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt
@@ -54,6 +54,7 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group3
+@FlakyTest(bugId = 219750830)
class ExitPipViaExpandButtonClickTest(
testSpec: FlickerTestParameter
) : ExitPipToAppTransition(testSpec) {
@@ -101,4 +102,4 @@
supportedRotations = listOf(Surface.ROTATION_0), repetitions = 3)
}
}
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
index 07c3b15..5fc80db 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
@@ -16,10 +16,9 @@
package com.android.wm.shell.flicker.pip
-import android.platform.test.annotations.Postsubmit
+import androidx.test.filters.FlakyTest
import android.platform.test.annotations.Presubmit
import android.view.Surface
-import androidx.test.filters.FlakyTest
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
@@ -149,7 +148,7 @@
/**
* Checks that the focus doesn't change between windows during the transition
*/
- @Postsubmit
+ @FlakyTest(bugId = 216306753)
@Test
fun focusDoesNotChange() {
testSpec.assertEventLog {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt
index e91bef1..87e927f 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt
@@ -24,7 +24,10 @@
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.traces.region.RegionSubject
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -55,9 +58,14 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group3
-class MovePipDownShelfHeightChangeTest(
+open class MovePipDownShelfHeightChangeTest(
testSpec: FlickerTestParameter
) : MovePipShelfHeightTransition(testSpec) {
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
/**
* Defines the transition used to run the test
*/
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest_ShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest_ShellTransit.kt
new file mode 100644
index 0000000..0ff260b
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest_ShellTransit.kt
@@ -0,0 +1,64 @@
+/*
+ * 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.wm.shell.flicker.pip
+
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group3
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test Pip movement with Launcher shelf height change (decrease).
+ *
+ * To run this test: `atest WMShellFlickerTests:MovePipDownShelfHeightChangeTest`
+ *
+ * Actions:
+ * Launch [pipApp] in pip mode
+ * Launch [testApp]
+ * Press home
+ * Check if pip window moves down (visually)
+ *
+ * Notes:
+ * 1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ * are inherited [PipTransition]
+ * 2. Part of the test setup occurs automatically via
+ * [com.android.server.wm.flicker.TransitionRunnerWithRules],
+ * including configuring navigation mode, initial orientation and ensuring no
+ * apps are running before setup
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group3
+@FlakyTest(bugId = 219693385)
+class MovePipDownShelfHeightChangeTest_ShellTransit(
+ testSpec: FlickerTestParameter
+) : MovePipDownShelfHeightChangeTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt
index 7e66cd3..388b5e0 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt
@@ -16,15 +16,18 @@
package com.android.wm.shell.flicker.pip
-import android.view.Surface
import androidx.test.filters.FlakyTest
-import androidx.test.filters.RequiresDevice
+import android.platform.test.annotations.RequiresDevice
+import android.view.Surface
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.traces.region.RegionSubject
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -58,6 +61,11 @@
class MovePipUpShelfHeightChangeTest(
testSpec: FlickerTestParameter
) : MovePipShelfHeightTransition(testSpec) {
+ @Before
+ fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
/**
* Defines the transition used to run the test
*/
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
index b11f910..9054685 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
@@ -16,6 +16,7 @@
package com.android.wm.shell.back;
+import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -24,14 +25,18 @@
import android.app.IActivityTaskManager;
import android.app.WindowConfiguration;
import android.content.Context;
+import android.graphics.Point;
+import android.graphics.Rect;
import android.hardware.HardwareBuffer;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.testing.AndroidTestingRunner;
import android.view.MotionEvent;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.window.BackEvent;
import android.window.BackNavigationInfo;
+import android.window.IOnBackInvokedCallback;
import androidx.test.filters.SmallTest;
@@ -41,6 +46,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -62,6 +68,9 @@
@Mock
private IActivityTaskManager mActivityTaskManager;
+ @Mock
+ private IOnBackInvokedCallback mIOnBackInvokedCallback;
+
private BackAnimationController mController;
@Before
@@ -71,12 +80,13 @@
mShellExecutor, mTransaction, mActivityTaskManager, mContext);
}
- private void createNavigationInfo(SurfaceControl topWindowLeash,
+ private void createNavigationInfo(RemoteAnimationTarget topAnimationTarget,
SurfaceControl screenshotSurface,
- HardwareBuffer hardwareBuffer) {
+ HardwareBuffer hardwareBuffer,
+ int backType) {
BackNavigationInfo navigationInfo = new BackNavigationInfo(
- BackNavigationInfo.TYPE_RETURN_TO_HOME,
- topWindowLeash,
+ backType,
+ topAnimationTarget,
screenshotSurface,
hardwareBuffer,
new WindowConfiguration(),
@@ -89,12 +99,20 @@
}
}
- @Test
- public void screenshotAttachedAndVisible() {
+ RemoteAnimationTarget createAnimationTarget() {
SurfaceControl topWindowLeash = new SurfaceControl();
+ return new RemoteAnimationTarget(-1, RemoteAnimationTarget.MODE_CLOSING, topWindowLeash,
+ false, new Rect(), new Rect(), -1,
+ new Point(0, 0), new Rect(), new Rect(), new WindowConfiguration(),
+ true, null, null, null, false, -1);
+ }
+
+ @Test
+ public void crossActivity_screenshotAttachedAndVisible() {
SurfaceControl screenshotSurface = new SurfaceControl();
HardwareBuffer hardwareBuffer = mock(HardwareBuffer.class);
- createNavigationInfo(topWindowLeash, screenshotSurface, hardwareBuffer);
+ createNavigationInfo(createAnimationTarget(), screenshotSurface, hardwareBuffer,
+ BackNavigationInfo.TYPE_CROSS_ACTIVITY);
mController.onMotionEvent(
MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0),
BackEvent.EDGE_LEFT);
@@ -104,18 +122,48 @@
}
@Test
- public void surfaceMovesWithGesture() {
- SurfaceControl topWindowLeash = new SurfaceControl();
+ public void crossActivity_surfaceMovesWithGesture() {
SurfaceControl screenshotSurface = new SurfaceControl();
HardwareBuffer hardwareBuffer = mock(HardwareBuffer.class);
- createNavigationInfo(topWindowLeash, screenshotSurface, hardwareBuffer);
+ RemoteAnimationTarget animationTarget = createAnimationTarget();
+ createNavigationInfo(animationTarget, screenshotSurface, hardwareBuffer,
+ BackNavigationInfo.TYPE_CROSS_ACTIVITY);
mController.onMotionEvent(
MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0),
BackEvent.EDGE_LEFT);
mController.onMotionEvent(
MotionEvent.obtain(10, 0, MotionEvent.ACTION_MOVE, 100, 100, 0),
BackEvent.EDGE_LEFT);
- verify(mTransaction).setPosition(topWindowLeash, 100, 100);
+ verify(mTransaction).setPosition(animationTarget.leash, 100, 100);
verify(mTransaction, atLeastOnce()).apply();
}
+
+ @Test
+ public void backToHome_dispatchesEvents() throws RemoteException {
+ mController.setBackToLauncherCallback(mIOnBackInvokedCallback);
+ RemoteAnimationTarget animationTarget = createAnimationTarget();
+ createNavigationInfo(animationTarget, null, null,
+ BackNavigationInfo.TYPE_RETURN_TO_HOME);
+
+ // Check that back start is dispatched.
+ mController.onMotionEvent(
+ MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0),
+ BackEvent.EDGE_LEFT);
+ verify(mIOnBackInvokedCallback).onBackStarted();
+
+ // Check that back progress is dispatched.
+ mController.onMotionEvent(
+ MotionEvent.obtain(10, 0, MotionEvent.ACTION_MOVE, 100, 100, 0),
+ BackEvent.EDGE_LEFT);
+ ArgumentCaptor<BackEvent> backEventCaptor = ArgumentCaptor.forClass(BackEvent.class);
+ verify(mIOnBackInvokedCallback).onBackProgressed(backEventCaptor.capture());
+ assertEquals(animationTarget, backEventCaptor.getValue().getDepartingAnimationTarget());
+
+ // Check that back invocation is dispatched.
+ mController.setTriggerBack(true); // Fake trigger back
+ mController.onMotionEvent(
+ MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0),
+ BackEvent.EDGE_LEFT);
+ verify(mIOnBackInvokedCallback).onBackInvoked();
+ }
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java
index 352805b..7d3e718 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java
@@ -43,6 +43,7 @@
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.compatui.CompatUIWindowManager.CompatUIHintsState;
import org.junit.Before;
import org.junit.Test;
@@ -77,8 +78,7 @@
mWindowManager = new CompatUIWindowManager(mContext,
createTaskInfo(/* hasSizeCompat= */ false, CAMERA_COMPAT_CONTROL_HIDDEN),
mSyncTransactionQueue, mCallback, mTaskListener,
- new DisplayLayout(), /* hasShownSizeCompatHint= */ false,
- /* hasShownCameraCompatHint= */ false);
+ new DisplayLayout(), new CompatUIHintsState());
mLayout = (CompatUILayout)
LayoutInflater.from(mContext).inflate(R.layout.compat_ui_layout, null);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java
index f9cfd12..e79b803 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java
@@ -51,6 +51,7 @@
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.compatui.CompatUIWindowManager.CompatUIHintsState;
import org.junit.Before;
import org.junit.Test;
@@ -85,8 +86,7 @@
mWindowManager = new CompatUIWindowManager(mContext,
createTaskInfo(/* hasSizeCompat= */ false, CAMERA_COMPAT_CONTROL_HIDDEN),
mSyncTransactionQueue, mCallback, mTaskListener,
- new DisplayLayout(), /* hasShownSizeCompatHint= */ false,
- /* hasShownCameraCompatHint= */ false);
+ new DisplayLayout(), new CompatUIHintsState());
spyOn(mWindowManager);
doReturn(mLayout).when(mWindowManager).inflateLayout();
@@ -102,7 +102,7 @@
verify(mWindowManager, never()).inflateLayout();
// Doesn't create hint popup.
- mWindowManager.mShouldShowSizeCompatHint = false;
+ mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint = true;
assertTrue(mWindowManager.createLayout(/* canShow= */ true));
verify(mWindowManager).inflateLayout();
@@ -113,14 +113,14 @@
clearInvocations(mWindowManager);
clearInvocations(mLayout);
mWindowManager.release();
- mWindowManager.mShouldShowSizeCompatHint = true;
+ mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint = false;
assertTrue(mWindowManager.createLayout(/* canShow= */ true));
verify(mWindowManager).inflateLayout();
assertNotNull(mLayout);
verify(mLayout).setRestartButtonVisibility(/* show= */ true);
verify(mLayout).setSizeCompatHintVisibility(/* show= */ true);
- assertFalse(mWindowManager.mShouldShowSizeCompatHint);
+ assertTrue(mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint);
// Returns false and doesn't create layout if has Size Compat is false.
clearInvocations(mWindowManager);
@@ -140,7 +140,7 @@
verify(mWindowManager, never()).inflateLayout();
// Doesn't create hint popup.
- mWindowManager.mShouldShowCameraCompatHint = false;
+ mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint = true;
assertTrue(mWindowManager.createLayout(/* canShow= */ true));
verify(mWindowManager).inflateLayout();
@@ -151,14 +151,14 @@
clearInvocations(mWindowManager);
clearInvocations(mLayout);
mWindowManager.release();
- mWindowManager.mShouldShowCameraCompatHint = true;
+ mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint = false;
assertTrue(mWindowManager.createLayout(/* canShow= */ true));
verify(mWindowManager).inflateLayout();
assertNotNull(mLayout);
verify(mLayout).setCameraControlVisibility(/* show= */ true);
verify(mLayout).setCameraCompatHintVisibility(/* show= */ true);
- assertFalse(mWindowManager.mShouldShowCameraCompatHint);
+ assertTrue(mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint);
// Returns false and doesn't create layout if Camera Compat state is hidden
clearInvocations(mWindowManager);
@@ -411,7 +411,7 @@
public void testOnRestartButtonLongClicked_showHint() {
// Not create hint popup.
mWindowManager.mHasSizeCompat = true;
- mWindowManager.mShouldShowSizeCompatHint = false;
+ mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint = true;
mWindowManager.createLayout(/* canShow= */ true);
verify(mWindowManager).inflateLayout();
@@ -423,10 +423,10 @@
}
@Test
- public void testOnCamerControlLongClicked_showHint() {
+ public void testOnCameraControlLongClicked_showHint() {
// Not create hint popup.
mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
- mWindowManager.mShouldShowCameraCompatHint = false;
+ mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint = true;
mWindowManager.createLayout(/* canShow= */ true);
verify(mWindowManager).inflateLayout();
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
index d92b12e..630d0d2 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
@@ -24,6 +24,8 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.wm.shell.startingsurface.StartingSurfaceDrawer.MAX_ANIMATION_DURATION;
+import static com.android.wm.shell.startingsurface.StartingSurfaceDrawer.MINIMAL_ANIMATION_DURATION;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
@@ -297,6 +299,56 @@
assertEquals(mStartingSurfaceDrawer.mStartingWindowRecords.size(), 0);
}
+ @Test
+ public void testMinimumAnimationDuration() {
+ final long maxDuration = MAX_ANIMATION_DURATION;
+ final long minDuration = MINIMAL_ANIMATION_DURATION;
+
+ final long shortDuration = minDuration - 1;
+ final long medianShortDuration = minDuration + 1;
+ final long medianLongDuration = maxDuration - 1;
+ final long longAppDuration = maxDuration + 1;
+
+ // static icon
+ assertEquals(shortDuration, SplashscreenContentDrawer.getShowingDuration(
+ 0, shortDuration));
+ // median launch + static icon
+ assertEquals(medianShortDuration, SplashscreenContentDrawer.getShowingDuration(
+ 0, medianShortDuration));
+ // long launch + static icon
+ assertEquals(longAppDuration, SplashscreenContentDrawer.getShowingDuration(
+ 0, longAppDuration));
+
+ // fast launch + animatable icon
+ assertEquals(shortDuration, SplashscreenContentDrawer.getShowingDuration(
+ shortDuration, shortDuration));
+ assertEquals(minDuration, SplashscreenContentDrawer.getShowingDuration(
+ medianShortDuration, shortDuration));
+ assertEquals(minDuration, SplashscreenContentDrawer.getShowingDuration(
+ longAppDuration, shortDuration));
+
+ // median launch + animatable icon
+ assertEquals(medianShortDuration, SplashscreenContentDrawer.getShowingDuration(
+ shortDuration, medianShortDuration));
+ assertEquals(medianShortDuration, SplashscreenContentDrawer.getShowingDuration(
+ medianShortDuration, medianShortDuration));
+ assertEquals(minDuration, SplashscreenContentDrawer.getShowingDuration(
+ longAppDuration, medianShortDuration));
+ // between min < max launch + animatable icon
+ assertEquals(medianLongDuration, SplashscreenContentDrawer.getShowingDuration(
+ medianShortDuration, medianLongDuration));
+ assertEquals(maxDuration, SplashscreenContentDrawer.getShowingDuration(
+ medianLongDuration, medianShortDuration));
+
+ // long launch + animatable icon
+ assertEquals(longAppDuration, SplashscreenContentDrawer.getShowingDuration(
+ shortDuration, longAppDuration));
+ assertEquals(longAppDuration, SplashscreenContentDrawer.getShowingDuration(
+ medianShortDuration, longAppDuration));
+ assertEquals(longAppDuration, SplashscreenContentDrawer.getShowingDuration(
+ longAppDuration, longAppDuration));
+ }
+
private StartingWindowInfo createWindowInfo(int taskId, int themeResId) {
StartingWindowInfo windowInfo = new StartingWindowInfo();
final ActivityInfo info = new ActivityInfo();
diff --git a/libs/androidfw/tests/BackupHelpers_test.cpp b/libs/androidfw/tests/BackupHelpers_test.cpp
index 86b7fb3..c2fcb69 100644
--- a/libs/androidfw/tests/BackupHelpers_test.cpp
+++ b/libs/androidfw/tests/BackupHelpers_test.cpp
@@ -50,7 +50,7 @@
TEST_F(BackupHelpersTest, WriteTarFileWithSizeGreaterThan2GB) {
TemporaryFile tf;
// Allocate a 2 GB file.
- off64_t fileSize = 2ll * 1024ll * 1024ll * 1024ll + 512ll;
+ off64_t fileSize = 2LL * 1024LL * 1024LL * 1024LL + 512LL;
ASSERT_EQ(0, posix_fallocate64(tf.fd, 0, fileSize));
off64_t tarSize = 0;
int err = write_tarfile(/* packageName */ String8("test-pkg"), /* domain */ String8(""), /* rootpath */ String8(""), /* filePath */ String8(tf.path), /* outSize */ &tarSize, /* writer */ NULL);
diff --git a/libs/hwui/jni/text/MeasuredText.cpp b/libs/hwui/jni/text/MeasuredText.cpp
index 76ea2d5..c13c800 100644
--- a/libs/hwui/jni/text/MeasuredText.cpp
+++ b/libs/hwui/jni/text/MeasuredText.cpp
@@ -134,6 +134,21 @@
GraphicsJNI::irect_to_jrect(ir, env, bounds);
}
+// Regular JNI
+static jlong nGetExtent(JNIEnv* env, jobject, jlong ptr, jcharArray javaText, jint start,
+ jint end) {
+ ScopedCharArrayRO text(env, javaText);
+ const minikin::U16StringPiece textBuffer(text.get(), text.size());
+ const minikin::Range range(start, end);
+
+ minikin::MinikinExtent extent = toMeasuredParagraph(ptr)->getExtent(textBuffer, range);
+
+ int32_t ascent = SkScalarRoundToInt(extent.ascent);
+ int32_t descent = SkScalarRoundToInt(extent.descent);
+
+ return (((jlong)(ascent)) << 32) | ((jlong)descent);
+}
+
// CriticalNative
static jlong nGetReleaseFunc(CRITICAL_JNI_PARAMS) {
return toJLong(&releaseMeasuredParagraph);
@@ -153,12 +168,13 @@
};
static const JNINativeMethod gMTMethods[] = {
- // MeasuredParagraph native functions.
- {"nGetWidth", "(JII)F", (void*) nGetWidth}, // Critical Natives
- {"nGetBounds", "(J[CIILandroid/graphics/Rect;)V", (void*) nGetBounds}, // Regular JNI
- {"nGetReleaseFunc", "()J", (void*) nGetReleaseFunc}, // Critical Natives
- {"nGetMemoryUsage", "(J)I", (void*) nGetMemoryUsage}, // Critical Native
- {"nGetCharWidthAt", "(JI)F", (void*) nGetCharWidthAt}, // Critical Native
+ // MeasuredParagraph native functions.
+ {"nGetWidth", "(JII)F", (void*)nGetWidth}, // Critical Natives
+ {"nGetBounds", "(J[CIILandroid/graphics/Rect;)V", (void*)nGetBounds}, // Regular JNI
+ {"nGetExtent", "(J[CII)J", (void*)nGetExtent}, // Regular JNI
+ {"nGetReleaseFunc", "()J", (void*)nGetReleaseFunc}, // Critical Natives
+ {"nGetMemoryUsage", "(J)I", (void*)nGetMemoryUsage}, // Critical Native
+ {"nGetCharWidthAt", "(JI)F", (void*)nGetCharWidthAt}, // Critical Native
};
int register_android_graphics_text_MeasuredText(JNIEnv* env) {
diff --git a/location/java/android/location/GnssClock.java b/location/java/android/location/GnssClock.java
index ed4bf1b..62f50b5 100644
--- a/location/java/android/location/GnssClock.java
+++ b/location/java/android/location/GnssClock.java
@@ -23,9 +23,9 @@
import android.os.Parcelable;
/**
- * A class containing a GPS clock timestamp.
+ * A class containing a GNSS clock timestamp.
*
- * <p>It represents a measurement of the GPS receiver's clock.
+ * <p>It represents a measurement of the GNSS receiver's clock.
*/
public final class GnssClock implements Parcelable {
// The following enumerations must be in sync with the values declared in gps.h
diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java
index 1fcb194..f1605f1 100644
--- a/location/java/android/location/Location.java
+++ b/location/java/android/location/Location.java
@@ -45,8 +45,8 @@
* timestamp, accuracy, and other information such as bearing, altitude and velocity.
*
* <p>All locations generated through {@link LocationManager} are guaranteed to have a valid
- * latitude, longitude, timestamp (both UTC time and elapsed real-time since boot), and accuracy.
- * All other parameters are optional.
+ * latitude, longitude, timestamp (both Unix epoch time and elapsed realtime since boot), and
+ * accuracy. All other parameters are optional.
*/
public class Location implements Parcelable {
@@ -240,36 +240,39 @@
}
/**
- * Return the UTC time of this location fix, in milliseconds since epoch (January 1, 1970).
+ * Returns the Unix epoch time of this location fix, in milliseconds since the start of the Unix
+ * epoch (00:00:00 January 1, 1970 UTC).
*
* <p>There is no guarantee that different locations have times set from the same clock.
* Locations derived from the {@link LocationManager#GPS_PROVIDER} are guaranteed to have their
- * time set from the clock in use by the satellite constellation that provided the fix.
+ * time originate from the clock in use by the satellite constellation that provided the fix.
* Locations derived from other providers may use any clock to set their time, though it is most
- * common to use the device clock (which may be incorrect).
+ * common to use the device's Unix epoch time system clock (which may be incorrect).
*
- * <p>Note that the device clock UTC time is not monotonic; it can jump forwards or backwards
- * unpredictably and may be changed at any time by the user, so this time should not be used to
- * order or compare locations. Prefer {@link #getElapsedRealtimeNanos} for that purpose, as this
- * clock is guaranteed to be monotonic.
+ * <p>Note that the device's Unix epoch time system clock is not monotonic; it can jump forwards
+ * or backwards unpredictably and may be changed at any time by the user, so this time should
+ * not be used to order or compare locations. Prefer {@link #getElapsedRealtimeNanos} for that
+ * purpose, as the elapsed realtime clock is guaranteed to be monotonic.
*
* <p>On the other hand, this method may be useful for presenting a human readable time to the
* user, or as a heuristic for comparing location fixes across reboot or across devices.
*
- * <p>All locations generated by the {@link LocationManager} are guaranteed to have a UTC time
- * set, however remember that the device clock may have changed since the location was
+ * <p>All locations generated by the {@link LocationManager} are guaranteed to have this time
+ * set, however remember that the device's system clock may have changed since the location was
* generated.
*
- * @return UTC time of this location
+ * @return the Unix epoch time of this location
*/
public @IntRange long getTime() {
return mTimeMs;
}
/**
- * Set the UTC time of this location, in milliseconds since epoch (January 1, 1970).
+ * Sets the Unix epoch time of this location fix, in milliseconds since the start of the Unix
+ * epoch (00:00:00 January 1, 1970 UTC).
*
- * @param timeMs UTC time of this location
+ * @param timeMs the Unix epoch time of this location
+ * @see #getTime for more information about times / clocks
*/
public void setTime(@IntRange long timeMs) {
mTimeMs = timeMs;
diff --git a/location/java/android/location/OnNmeaMessageListener.java b/location/java/android/location/OnNmeaMessageListener.java
index 1c02ebd..def688c 100644
--- a/location/java/android/location/OnNmeaMessageListener.java
+++ b/location/java/android/location/OnNmeaMessageListener.java
@@ -31,9 +31,8 @@
/**
* Called when an NMEA message is received.
* @param message NMEA message
- * @param timestamp Date and time of the location fix, as reported by the GNSS
- * chipset. The value is specified in milliseconds since 0:00
- * UTC 1 January 1970.
+ * @param timestamp Timestamp of the location fix, as reported by the GNSS chipset. The value
+ * is specified in Unix time milliseconds since 1st January 1970, 00:00:00 UTC
*/
void onNmeaMessage(String message, long timestamp);
}
diff --git a/location/java/android/location/SatellitePvt.java b/location/java/android/location/SatellitePvt.java
index 29888e1..f140c68 100644
--- a/location/java/android/location/SatellitePvt.java
+++ b/location/java/android/location/SatellitePvt.java
@@ -144,8 +144,8 @@
private final ClockInfo mClockInfo;
private final double mIonoDelayMeters;
private final double mTropoDelayMeters;
- private final int mTimeOfClock;
- private final int mTimeOfEphemeris;
+ private final long mTimeOfClock;
+ private final long mTimeOfEphemeris;
private final int mIssueOfDataClock;
private final int mIssueOfDataEphemeris;
@EphemerisSource
@@ -457,8 +457,8 @@
@Nullable ClockInfo clockInfo,
double ionoDelayMeters,
double tropoDelayMeters,
- int timeOfClock,
- int timeOfEphemeris,
+ long timeOfClock,
+ long timeOfEphemeris,
int issueOfDataClock,
int issueOfDataEphemeris,
@EphemerisSource int ephemerisSource) {
@@ -547,26 +547,28 @@
/**
* Time of Clock.
*
- * <p>This is defined in GPS ICD200 documentation (e.g.,
- * <a href="https://www.gps.gov/technical/icwg/IS-GPS-200H.pdf"></a>).
+ * <p>The value is in seconds since GPS epoch, regardless of the constellation.
+ *
+ * <p>The value is not encoded as in GPS ICD200 documentation.
*
* <p>This field is valid if {@link #hasTimeOfClock()} is true.
*/
- @IntRange(from = 0, to = 604784)
- public int getTimeOfClock() {
+ @IntRange(from = 0)
+ public long getTimeOfClock() {
return mTimeOfClock;
}
/**
* Time of ephemeris.
*
- * <p>This is defined in GPS ICD200 documentation (e.g.,
- * <a href="https://www.gps.gov/technical/icwg/IS-GPS-200H.pdf"></a>).
+ * <p>The value is in seconds since GPS epoch, regardless of the constellation.
+ *
+ * <p>The value is not encoded as in GPS ICD200 documentation.
*
* <p>This field is valid if {@link #hasTimeOfEphemeris()} is true.
*/
- @IntRange(from = 0, to = 604784)
- public int getTimeOfEphemeris() {
+ @IntRange(from = 0)
+ public long getTimeOfEphemeris() {
return mTimeOfEphemeris;
}
@@ -630,8 +632,8 @@
android.location.SatellitePvt.ClockInfo.class);
double ionoDelayMeters = in.readDouble();
double tropoDelayMeters = in.readDouble();
- int toc = in.readInt();
- int toe = in.readInt();
+ long toc = in.readLong();
+ long toe = in.readLong();
int iodc = in.readInt();
int iode = in.readInt();
int ephemerisSource = in.readInt();
@@ -669,8 +671,8 @@
parcel.writeParcelable(mClockInfo, flags);
parcel.writeDouble(mIonoDelayMeters);
parcel.writeDouble(mTropoDelayMeters);
- parcel.writeInt(mTimeOfClock);
- parcel.writeInt(mTimeOfEphemeris);
+ parcel.writeLong(mTimeOfClock);
+ parcel.writeLong(mTimeOfEphemeris);
parcel.writeInt(mIssueOfDataClock);
parcel.writeInt(mIssueOfDataEphemeris);
parcel.writeInt(mEphemerisSource);
@@ -707,8 +709,8 @@
@Nullable private ClockInfo mClockInfo;
private double mIonoDelayMeters;
private double mTropoDelayMeters;
- private int mTimeOfClock;
- private int mTimeOfEphemeris;
+ private long mTimeOfClock;
+ private long mTimeOfEphemeris;
private int mIssueOfDataClock;
private int mIssueOfDataEphemeris;
@EphemerisSource
@@ -721,8 +723,7 @@
* @return builder object
*/
@NonNull
- public Builder setPositionEcef(
- @NonNull PositionEcef positionEcef) {
+ public Builder setPositionEcef(@NonNull PositionEcef positionEcef) {
mPositionEcef = positionEcef;
updateFlags();
return this;
@@ -735,8 +736,7 @@
* @return builder object
*/
@NonNull
- public Builder setVelocityEcef(
- @NonNull VelocityEcef velocityEcef) {
+ public Builder setVelocityEcef(@NonNull VelocityEcef velocityEcef) {
mVelocityEcef = velocityEcef;
updateFlags();
return this;
@@ -749,8 +749,7 @@
* @return builder object
*/
@NonNull
- public Builder setClockInfo(
- @NonNull ClockInfo clockInfo) {
+ public Builder setClockInfo(@NonNull ClockInfo clockInfo) {
mClockInfo = clockInfo;
updateFlags();
return this;
@@ -793,12 +792,16 @@
/**
* Set time of clock in seconds.
*
+ * <p>The value is in seconds since GPS epoch, regardless of the constellation.
+ *
+ * <p>The value is not encoded as in GPS ICD200 documentation.
+ *
* @param timeOfClock time of clock (seconds)
* @return builder object
*/
@NonNull
- public Builder setTimeOfClock(@IntRange(from = 0, to = 604784) int timeOfClock) {
- Preconditions.checkArgumentInRange(timeOfClock, 0, 604784, "timeOfClock");
+ public Builder setTimeOfClock(@IntRange(from = 0) long timeOfClock) {
+ Preconditions.checkArgumentNonnegative(timeOfClock);
mTimeOfClock = timeOfClock;
mFlags = (byte) (mFlags | HAS_TIME_OF_CLOCK);
return this;
@@ -807,12 +810,16 @@
/**
* Set time of ephemeris in seconds.
*
+ * <p>The value is in seconds since GPS epoch, regardless of the constellation.
+ *
+ * <p>The value is not encoded as in GPS ICD200 documentation.
+ *
* @param timeOfEphemeris time of ephemeris (seconds)
* @return builder object
*/
@NonNull
- public Builder setTimeOfEphemeris(@IntRange(from = 0, to = 604784) int timeOfEphemeris) {
- Preconditions.checkArgumentInRange(timeOfEphemeris, 0, 604784, "timeOfEphemeris");
+ public Builder setTimeOfEphemeris(@IntRange(from = 0) int timeOfEphemeris) {
+ Preconditions.checkArgumentNonnegative(timeOfEphemeris);
mTimeOfEphemeris = timeOfEphemeris;
mFlags = (byte) (mFlags | HAS_TIME_OF_EPHEMERIS);
return this;
diff --git a/media/java/Android.bp b/media/java/Android.bp
index c7c1d54..6878f9d 100644
--- a/media/java/Android.bp
+++ b/media/java/Android.bp
@@ -16,7 +16,9 @@
exclude_srcs: [
":framework-media-tv-tunerresourcemanager-sources-aidl",
],
- visibility: ["//frameworks/base"],
+ visibility: [
+ "//frameworks/base",
+ ],
}
filegroup {
diff --git a/media/java/android/media/AudioDeviceVolumeManager.java b/media/java/android/media/AudioDeviceVolumeManager.java
new file mode 100644
index 0000000..0e9c99b
--- /dev/null
+++ b/media/java/android/media/AudioDeviceVolumeManager.java
@@ -0,0 +1,192 @@
+/*
+ * 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 android.media;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.content.Context;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.Executor;
+
+/**
+ * @hide
+ * AudioDeviceVolumeManager provides access to audio device volume control.
+ */
+public class AudioDeviceVolumeManager {
+
+ // define when using Log.*
+ //private static final String TAG = "AudioDeviceVolumeManager";
+ private static IAudioService sService;
+
+ private final String mPackageName;
+
+ public AudioDeviceVolumeManager(Context context) {
+ mPackageName = context.getApplicationContext().getOpPackageName();
+ }
+
+ /**
+ * @hide
+ * Interface to receive volume changes on a device that behaves in absolute volume mode.
+ * @see #setDeviceAbsoluteMultiVolumeBehavior(AudioDeviceAttributes, List, Executor,
+ * OnAudioDeviceVolumeChangeListener)
+ * @see #setDeviceAbsoluteVolumeBehavior(AudioDeviceAttributes, VolumeInfo, Executor,
+ * OnAudioDeviceVolumeChangeListener)
+ */
+ public interface OnAudioDeviceVolumeChangedListener {
+ /**
+ * Called the device for the given audio device has changed.
+ * @param device the audio device whose volume has changed
+ * @param vol the new volume for the device
+ */
+ void onAudioDeviceVolumeChanged(
+ @NonNull AudioDeviceAttributes device,
+ @NonNull VolumeInfo vol);
+ }
+
+ static class ListenerInfo {
+ final @NonNull OnAudioDeviceVolumeChangedListener mListener;
+ final @NonNull Executor mExecutor;
+ final @NonNull AudioDeviceAttributes mDevice;
+
+ ListenerInfo(@NonNull OnAudioDeviceVolumeChangedListener listener, @NonNull Executor exe,
+ @NonNull AudioDeviceAttributes device) {
+ mListener = listener;
+ mExecutor = exe;
+ mDevice = device;
+ }
+ }
+
+ private final Object mDeviceVolumeListenerLock = new Object();
+ /**
+ * List of listeners for volume changes, the associated device, and their associated Executor.
+ * List is lazy-initialized on first registration
+ */
+ @GuardedBy("mDeviceVolumeListenerLock")
+ private @Nullable ArrayList<ListenerInfo> mDeviceVolumeListeners;
+
+ @GuardedBy("mDeviceVolumeListenerLock")
+ private DeviceVolumeDispatcherStub mDeviceVolumeDispatcherStub;
+
+ final class DeviceVolumeDispatcherStub extends IAudioDeviceVolumeDispatcher.Stub {
+ /**
+ * Register / unregister the stub
+ * @param register true for registering, false for unregistering
+ * @param device device for which volume is monitored
+ */
+ public void register(boolean register, @NonNull AudioDeviceAttributes device,
+ @NonNull List<VolumeInfo> volumes) {
+ try {
+ getService().registerDeviceVolumeDispatcherForAbsoluteVolume(register,
+ this, mPackageName,
+ Objects.requireNonNull(device), Objects.requireNonNull(volumes));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ @Override
+ public void dispatchDeviceVolumeChanged(
+ @NonNull AudioDeviceAttributes device, @NonNull VolumeInfo vol) {
+ final ArrayList<ListenerInfo> volumeListeners;
+ synchronized (mDeviceVolumeListenerLock) {
+ volumeListeners = (ArrayList<ListenerInfo>) mDeviceVolumeListeners.clone();
+ }
+ for (ListenerInfo listenerInfo : volumeListeners) {
+ if (listenerInfo.mDevice.equals(device)) {
+ listenerInfo.mExecutor.execute(
+ () -> listenerInfo.mListener.onAudioDeviceVolumeChanged(device, vol));
+ }
+ }
+ }
+ }
+
+ /**
+ * @hide
+ * Configures a device to use absolute volume model, and registers a listener for receiving
+ * volume updates to apply on that device
+ * @param device the audio device set to absolute volume mode
+ * @param volume the type of volume this device responds to
+ * @param executor the Executor used for receiving volume updates through the listener
+ * @param vclistener the callback for volume updates
+ */
+ @RequiresPermission(anyOf = { android.Manifest.permission.MODIFY_AUDIO_ROUTING,
+ android.Manifest.permission.BLUETOOTH_PRIVILEGED })
+ public void setDeviceAbsoluteVolumeBehavior(
+ @NonNull AudioDeviceAttributes device,
+ @NonNull VolumeInfo volume,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnAudioDeviceVolumeChangedListener vclistener) {
+ final ArrayList<VolumeInfo> volumes = new ArrayList<>(1);
+ volumes.add(volume);
+ setDeviceAbsoluteMultiVolumeBehavior(device, volumes, executor, vclistener);
+ }
+
+ /**
+ * @hide
+ * Configures a device to use absolute volume model applied to different volume types, and
+ * registers a listener for receiving volume updates to apply on that device
+ * @param device the audio device set to absolute multi-volume mode
+ * @param volumes the list of volumes the given device responds to
+ * @param executor the Executor used for receiving volume updates through the listener
+ * @param vclistener the callback for volume updates
+ */
+ @RequiresPermission(anyOf = { android.Manifest.permission.MODIFY_AUDIO_ROUTING,
+ android.Manifest.permission.BLUETOOTH_PRIVILEGED })
+ public void setDeviceAbsoluteMultiVolumeBehavior(
+ @NonNull AudioDeviceAttributes device,
+ @NonNull List<VolumeInfo> volumes,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnAudioDeviceVolumeChangedListener vclistener) {
+ Objects.requireNonNull(device);
+ Objects.requireNonNull(volumes);
+ Objects.requireNonNull(executor);
+ Objects.requireNonNull(vclistener);
+
+ // TODO verify not already registered
+ //final ListenerInfo listenerInfo = new ListenerInfo(vclistener, executor, device);
+ synchronized (mDeviceVolumeListenerLock) {
+ if (mDeviceVolumeListeners == null) {
+ mDeviceVolumeListeners = new ArrayList<>();
+ }
+ if (mDeviceVolumeListeners.size() == 0) {
+ if (mDeviceVolumeDispatcherStub == null) {
+ mDeviceVolumeDispatcherStub = new DeviceVolumeDispatcherStub();
+ }
+ }
+ mDeviceVolumeDispatcherStub.register(true, device, volumes);
+ }
+ }
+
+ private static IAudioService getService() {
+ if (sService != null) {
+ return sService;
+ }
+ IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
+ sService = IAudioService.Stub.asInterface(b);
+ return sService;
+ }
+}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 3887372..6e695e6 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -7294,8 +7294,13 @@
* Ultrasound playback and capture, false otherwise.
*/
@SystemApi
- public static boolean isUltrasoundSupported() {
- return AudioSystem.isUltrasoundSupported();
+ @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND)
+ public boolean isUltrasoundSupported() {
+ try {
+ return getService().isUltrasoundSupported();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
/**
diff --git a/core/java/android/window/IOnFpsCallbackListener.aidl b/media/java/android/media/IAudioDeviceVolumeDispatcher.aidl
similarity index 65%
copy from core/java/android/window/IOnFpsCallbackListener.aidl
copy to media/java/android/media/IAudioDeviceVolumeDispatcher.aidl
index 3091df3..65633fe 100644
--- a/core/java/android/window/IOnFpsCallbackListener.aidl
+++ b/media/java/android/media/IAudioDeviceVolumeDispatcher.aidl
@@ -14,17 +14,18 @@
* limitations under the License.
*/
-package android.window;
+package android.media;
+
+import android.media.AudioDeviceAttributes;
+import android.media.VolumeInfo;
/**
- * @hide
+ * AIDL for the AudioService to signal audio device volume changes.
+ *
+ * {@hide}
*/
-oneway interface IOnFpsCallbackListener {
+oneway interface IAudioDeviceVolumeDispatcher {
- /**
- * Reports the fps from the registered task
- * @param fps The frame rate per second of the task that has the registered task id
- * and its children.
- */
- void onFpsReported(in float fps);
+ void dispatchDeviceVolumeChanged(in AudioDeviceAttributes device, in VolumeInfo vol);
+
}
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index a6fdf6c..d702eb9 100755
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -26,6 +26,7 @@
import android.media.AudioRecordingConfiguration;
import android.media.AudioRoutesInfo;
import android.media.BluetoothProfileConnectionInfo;
+import android.media.IAudioDeviceVolumeDispatcher;
import android.media.IAudioFocusDispatcher;
import android.media.IAudioModeDispatcher;
import android.media.IAudioRoutesObserver;
@@ -44,6 +45,7 @@
import android.media.IVolumeController;
import android.media.IVolumeController;
import android.media.PlayerBase;
+import android.media.VolumeInfo;
import android.media.VolumePolicy;
import android.media.audiopolicy.AudioPolicyConfig;
import android.media.audiopolicy.AudioProductStrategy;
@@ -136,6 +138,8 @@
boolean isMicrophoneMuted();
+ boolean isUltrasoundSupported();
+
void setMicrophoneMute(boolean on, String callingPackage, int userId, in String attributionTag);
oneway void setMicrophoneMuteFromSwitch(boolean on);
@@ -456,6 +460,8 @@
boolean isVolumeFixed();
+ VolumeInfo getDefaultVolumeInfo();
+
boolean isPstnCallAudioInterceptable();
oneway void muteAwaitConnection(in int[] usagesToMute, in AudioDeviceAttributes dev,
@@ -474,6 +480,7 @@
boolean sendFocusLoss(in AudioFocusInfo focusLoser, in IAudioPolicyCallback apcb);
+
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
void addAssistantServicesUids(in int[] assistantUID);
@@ -488,4 +495,10 @@
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
int[] getActiveAssistantServiceUids();
+
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
+ void registerDeviceVolumeDispatcherForAbsoluteVolume(boolean register,
+ in IAudioDeviceVolumeDispatcher cb,
+ in String packageName,
+ in AudioDeviceAttributes device, in List<VolumeInfo> volumes);
}
diff --git a/media/java/android/media/INearbyMediaDevicesProvider.aidl b/media/java/android/media/INearbyMediaDevicesProvider.aidl
new file mode 100644
index 0000000..5330123
--- /dev/null
+++ b/media/java/android/media/INearbyMediaDevicesProvider.aidl
@@ -0,0 +1,38 @@
+/*
+ * 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 android.media;
+
+import android.media.INearbyMediaDevicesUpdateCallback;
+import android.media.NearbyDevice;
+
+/**
+ * A binder-compatible version of {@link android.media.NearbyMediaDevicesProvider}. See that class
+ * for more information.
+ *
+ * @hide
+ */
+interface INearbyMediaDevicesProvider {
+ /**
+ * Registers a callback that should be notified each time nearby media device(s) change.
+ */
+ oneway void registerNearbyDevicesCallback(in INearbyMediaDevicesUpdateCallback callback) = 2;
+
+ /**
+ * Unregisters a callback. See {@link registerNearbyDevicesCallback}.
+ */
+ oneway void unregisterNearbyDevicesCallback(in INearbyMediaDevicesUpdateCallback callback) = 3;
+}
diff --git a/media/java/android/media/INearbyMediaDevicesUpdateCallback.aidl b/media/java/android/media/INearbyMediaDevicesUpdateCallback.aidl
new file mode 100644
index 0000000..24397bb
--- /dev/null
+++ b/media/java/android/media/INearbyMediaDevicesUpdateCallback.aidl
@@ -0,0 +1,43 @@
+/*
+ * 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 android.media;
+
+import android.media.NearbyDevice;
+
+/**
+ * A callback used to receive updates about the status of nearby devices that are able to play
+ * media.
+ *
+ * External clients may allow registration of these callbacks and external clients will be
+ * responsible for notifying the callbacks appropriately.
+ *
+ * @hide
+ */
+oneway interface INearbyMediaDevicesUpdateCallback {
+ /**
+ * Invoked by external clients when changes in nearby media device(s) are detected.
+ *
+ * When a callback is newly registered, it should be immediately notified of the current nearby
+ * media devices. Afterwards, the list of devices passed to the callback should always contain
+ * the full set of nearby media devices any time you get an update. If a device is no longer
+ * valid (went offline, e.g.) then it should be omitted from the list in the next update.
+ *
+ * @param nearbyDevices the list of nearby devices that have changed status due to moving closer
+ * or further away.
+ */
+ void onDevicesUpdated(in List<NearbyDevice> nearbyDevices);
+}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.aidl b/media/java/android/media/NearbyDevice.aidl
similarity index 93%
rename from packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.aidl
rename to media/java/android/media/NearbyDevice.aidl
index 62b50ed..d6140a7 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.aidl
+++ b/media/java/android/media/NearbyDevice.aidl
@@ -14,6 +14,6 @@
* limitations under the License.
*/
-package com.android.systemui.shared.media;
+package android.media;
parcelable NearbyDevice;
diff --git a/media/java/android/media/NearbyDevice.java b/media/java/android/media/NearbyDevice.java
new file mode 100644
index 0000000..cb85109
--- /dev/null
+++ b/media/java/android/media/NearbyDevice.java
@@ -0,0 +1,161 @@
+/*
+ * 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 android.media;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * A parcelable representing a nearby device that can be used for media transfer.
+ * <p>
+ * This class includes:
+ * <ul>
+ * <li>an ID identifying the media route.</li>
+ * <li>a range zone specifying how far away this device is from the device with the media route.
+ * </li>
+ * </ul>
+ * @hide
+ */
+@SystemApi
+public final class NearbyDevice implements Parcelable {
+ /**
+ * Unknown distance range.
+ */
+ public static final int RANGE_UNKNOWN = 0;
+
+ /**
+ * Distance is very far away from the peer device.
+ */
+ public static final int RANGE_FAR = 1;
+
+ /**
+ * Distance is relatively long from the peer device, typically a few meters.
+ */
+ public static final int RANGE_LONG = 2;
+
+ /**
+ * Distance is close to the peer device, typically with one or two meter.
+ */
+ public static final int RANGE_CLOSE = 3;
+
+ /**
+ * Distance is very close to the peer device, typically within one meter or less.
+ */
+ public static final int RANGE_WITHIN_REACH = 4;
+
+ /**
+ * The various range zones a device can be in, in relation to the current device.
+ *
+ * @hide
+ */
+ @IntDef(prefix = { "RANGE_" }, value = {
+ RANGE_UNKNOWN,
+ RANGE_FAR,
+ RANGE_LONG,
+ RANGE_CLOSE,
+ RANGE_WITHIN_REACH
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface RangeZone {}
+
+ /**
+ * Gets a human-readable string of the range zone.
+ */
+ @NonNull
+ public static String rangeZoneToString(@RangeZone int rangeZone) {
+ switch (rangeZone) {
+ case RANGE_UNKNOWN:
+ return "UNKNOWN";
+ case RANGE_FAR:
+ return "FAR";
+ case RANGE_LONG:
+ return "LONG";
+ case RANGE_CLOSE:
+ return "CLOSE";
+ case RANGE_WITHIN_REACH:
+ return "WITHIN_REACH";
+ default:
+ return "Invalid";
+ }
+ }
+
+ @NonNull private final String mMediaRoute2Id;
+ @RangeZone private final int mRangeZone;
+
+ public NearbyDevice(@NonNull String mediaRoute2Id, int rangeZone) {
+ mMediaRoute2Id = mediaRoute2Id;
+ mRangeZone = rangeZone;
+ }
+
+ private NearbyDevice(@NonNull Parcel in) {
+ mMediaRoute2Id = in.readString();
+ mRangeZone = in.readInt();
+ }
+
+ @NonNull
+ public static final Creator<NearbyDevice> CREATOR = new Creator<NearbyDevice>() {
+ @Override
+ public NearbyDevice createFromParcel(@NonNull Parcel in) {
+ return new NearbyDevice(in);
+ }
+
+ @Override
+ public NearbyDevice[] newArray(int size) {
+ return new NearbyDevice[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public String toString() {
+ return "NearbyDevice{mediaRoute2Id=" + mMediaRoute2Id
+ + " rangeZone=" + rangeZoneToString(mRangeZone) + "}";
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeString8(mMediaRoute2Id);
+ dest.writeInt(mRangeZone);
+ }
+
+ /**
+ * Returns the ID of the media route associated with the device.
+ *
+ * @see MediaRoute2Info#getId
+ */
+ @NonNull
+ public String getMediaRoute2Id() {
+ return mMediaRoute2Id;
+ }
+
+ /** Returns the range that the device is currently in. */
+ @RangeZone
+ public int getRangeZone() {
+ return mRangeZone;
+ }
+}
diff --git a/media/java/android/media/VolumeInfo.aidl b/media/java/android/media/VolumeInfo.aidl
new file mode 100644
index 0000000..aa82f52
--- /dev/null
+++ b/media/java/android/media/VolumeInfo.aidl
@@ -0,0 +1,18 @@
+/* Copyright 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 android.media;
+
+parcelable VolumeInfo;
diff --git a/media/java/android/media/VolumeInfo.java b/media/java/android/media/VolumeInfo.java
new file mode 100644
index 0000000..c61b0e5
--- /dev/null
+++ b/media/java/android/media/VolumeInfo.java
@@ -0,0 +1,380 @@
+/*
+ * 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 android.media;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.media.audiopolicy.AudioVolumeGroup;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Log;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @hide
+ * A class to represent type of volume information.
+ * Can be used to represent volume associated with a stream type or {@link AudioVolumeGroup}.
+ * Volume index is optional when used to represent a category of volume.
+ * Index ranges are supported too, making the representation of volume changes agnostic to the
+ * range (e.g. can be used to map BT A2DP absolute volume range to internal range).
+ *
+ * Note: this class is not yet part of the SystemApi but is intended to be gradually introduced
+ * particularly in parts of the audio framework that suffer from code ambiguity when
+ * dealing with different volume ranges / units.
+ */
+public final class VolumeInfo implements Parcelable {
+ private static final String TAG = "VolumeInfo";
+
+ private final boolean mUsesStreamType; // false implies AudioVolumeGroup is used
+ private final boolean mIsMuted;
+ private final int mVolIndex;
+ private final int mMinVolIndex;
+ private final int mMaxVolIndex;
+ private final int mVolGroupId;
+ private final int mStreamType;
+
+ private static IAudioService sService;
+ private static VolumeInfo sDefaultVolumeInfo;
+
+ private VolumeInfo(boolean usesStreamType, boolean isMuted, int volIndex,
+ int minVolIndex, int maxVolIndex,
+ int volGroupId, int streamType) {
+ mUsesStreamType = usesStreamType;
+ mIsMuted = isMuted;
+ mVolIndex = volIndex;
+ mMinVolIndex = minVolIndex;
+ mMaxVolIndex = maxVolIndex;
+ mVolGroupId = volGroupId;
+ mStreamType = streamType;
+ }
+
+ /**
+ * Indicates whether this instance has a stream type associated to it.
+ * Note this method returning true implies {@link #hasVolumeGroup()} returns false.
+ * (e.g. {@link AudioManager#STREAM_MUSIC}).
+ * @return true if it has stream type information
+ */
+ public boolean hasStreamType() {
+ return mUsesStreamType;
+ }
+
+ /**
+ * Returns the associated stream type, or will throw if {@link #hasStreamType()} returned false.
+ * @return a stream type value, see AudioManager.STREAM_*
+ */
+ public int getStreamType() {
+ if (!mUsesStreamType) {
+ throw new IllegalStateException("VolumeInfo doesn't use stream types");
+ }
+ return mStreamType;
+ }
+
+ /**
+ * Indicates whether this instance has a {@link AudioVolumeGroup} associated to it.
+ * Note this method returning true implies {@link #hasStreamType()} returns false.
+ * @return true if it has volume group information
+ */
+ public boolean hasVolumeGroup() {
+ return !mUsesStreamType;
+ }
+
+ /**
+ * Returns the associated volume group, or will throw if {@link #hasVolumeGroup()} returned
+ * false.
+ * @return the volume group corresponding to this VolumeInfo, or null if an error occurred
+ * in the volume group management
+ */
+ public @Nullable AudioVolumeGroup getVolumeGroup() {
+ if (mUsesStreamType) {
+ throw new IllegalStateException("VolumeInfo doesn't use AudioVolumeGroup");
+ }
+ List<AudioVolumeGroup> volGroups = AudioVolumeGroup.getAudioVolumeGroups();
+ for (AudioVolumeGroup group : volGroups) {
+ if (group.getId() == mVolGroupId) {
+ return group;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns whether this instance is conveying a mute state.
+ * @return true if the volume state is muted
+ */
+ public boolean isMuted() {
+ return mIsMuted;
+ }
+
+ /**
+ * A value used to express no volume index has been set.
+ */
+ public static final int INDEX_NOT_SET = -100;
+
+ /**
+ * Returns the volume index.
+ * @return a volume index, or {@link #INDEX_NOT_SET} if no index was set, in which case this
+ * instance is used to express a volume representation type (stream vs group) and
+ * optionally its volume range
+ */
+ public int getVolumeIndex() {
+ return mVolIndex;
+ }
+
+ /**
+ * Returns the minimum volume index.
+ * @return the minimum volume index, or {@link #INDEX_NOT_SET} if no minimum index was set.
+ */
+ public int getMinVolumeIndex() {
+ return mMinVolIndex;
+ }
+
+ /**
+ * Returns the maximum volume index.
+ * @return the maximum volume index, or {@link #INDEX_NOT_SET} if no maximum index was
+ * set.
+ */
+ public int getMaxVolumeIndex() {
+ return mMaxVolIndex;
+ }
+
+ /**
+ * Returns the default info for the platform, typically initialized
+ * to STREAM_MUSIC with min/max initialized to the associated range
+ * @return the default VolumeInfo for the device
+ */
+ public static @NonNull VolumeInfo getDefaultVolumeInfo() {
+ if (sService == null) {
+ IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
+ sService = IAudioService.Stub.asInterface(b);
+ }
+ if (sDefaultVolumeInfo == null) {
+ try {
+ sDefaultVolumeInfo = sService.getDefaultVolumeInfo();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling getDefaultVolumeInfo", e);
+ // return a valid value, but don't cache it
+ return new VolumeInfo.Builder(AudioManager.STREAM_MUSIC).build();
+ }
+ }
+ return sDefaultVolumeInfo;
+ }
+
+ /**
+ * The builder class for creating and initializing, or copying and modifying VolumeInfo
+ * instances
+ */
+ public static final class Builder {
+ private boolean mUsesStreamType = true; // false implies AudioVolumeGroup is used
+ private int mStreamType = AudioManager.STREAM_MUSIC;
+ private boolean mIsMuted = false;
+ private int mVolIndex = INDEX_NOT_SET;
+ private int mMinVolIndex = INDEX_NOT_SET;
+ private int mMaxVolIndex = INDEX_NOT_SET;
+ private int mVolGroupId = -Integer.MIN_VALUE;
+
+ /**
+ * Builder constructor for stream type-based VolumeInfo
+ */
+ public Builder(int streamType) {
+ // TODO validate stream type
+ mUsesStreamType = true;
+ mStreamType = streamType;
+ }
+
+ /**
+ * Builder constructor for volume group-based VolumeInfo
+ */
+ public Builder(@NonNull AudioVolumeGroup volGroup) {
+ Objects.requireNonNull(volGroup);
+ mUsesStreamType = false;
+ mStreamType = -Integer.MIN_VALUE;
+ mVolGroupId = volGroup.getId();
+ }
+
+ /**
+ * Builder constructor to copy a given VolumeInfo.
+ * Note you can't change the stream type or volume group later.
+ */
+ public Builder(@NonNull VolumeInfo info) {
+ Objects.requireNonNull(info);
+ mUsesStreamType = info.mUsesStreamType;
+ mStreamType = info.mStreamType;
+ mIsMuted = info.mIsMuted;
+ mVolIndex = info.mVolIndex;
+ mMinVolIndex = info.mMinVolIndex;
+ mMaxVolIndex = info.mMaxVolIndex;
+ mVolGroupId = info.mVolGroupId;
+ }
+
+ /**
+ * Sets whether the volume is in a muted state
+ * @param isMuted
+ * @return the same builder instance
+ */
+ public @NonNull Builder setMuted(boolean isMuted) {
+ mIsMuted = isMuted;
+ return this;
+ }
+
+ /**
+ * Sets the volume index
+ * @param volIndex a 0 or greater value, or {@link #INDEX_NOT_SET} if unknown
+ * @return the same builder instance
+ */
+ // TODO should we allow muted true + volume index set? (useful when toggling mute on/off?)
+ public @NonNull Builder setVolumeIndex(int volIndex) {
+ if (volIndex != INDEX_NOT_SET && volIndex < 0) {
+ throw new IllegalArgumentException("Volume index cannot be negative");
+ }
+ mVolIndex = volIndex;
+ return this;
+ }
+
+ /**
+ * Sets the minimum volume index
+ * @param minIndex a 0 or greater value, or {@link #INDEX_NOT_SET} if unknown
+ * @return the same builder instance
+ */
+ public @NonNull Builder setMinVolumeIndex(int minIndex) {
+ if (minIndex != INDEX_NOT_SET && minIndex < 0) {
+ throw new IllegalArgumentException("Min volume index cannot be negative");
+ }
+ mMinVolIndex = minIndex;
+ return this;
+ }
+
+ /**
+ * Sets the maximum volume index
+ * @param maxIndex a 0 or greater value, or {@link #INDEX_NOT_SET} if unknown
+ * @return the same builder instance
+ */
+ public @NonNull Builder setMaxVolumeIndex(int maxIndex) {
+ if (maxIndex != INDEX_NOT_SET && maxIndex < 0) {
+ throw new IllegalArgumentException("Max volume index cannot be negative");
+ }
+ mMaxVolIndex = maxIndex;
+ return this;
+ }
+
+ /**
+ * Builds the VolumeInfo with the data given to the builder
+ * @return the new VolumeInfo instance
+ */
+ public @NonNull VolumeInfo build() {
+ if (mVolIndex != INDEX_NOT_SET) {
+ if (mMinVolIndex != INDEX_NOT_SET && mVolIndex < mMinVolIndex) {
+ throw new IllegalArgumentException("Volume index:" + mVolIndex
+ + " lower than min index:" + mMinVolIndex);
+ }
+ if (mMaxVolIndex != INDEX_NOT_SET && mVolIndex > mMaxVolIndex) {
+ throw new IllegalArgumentException("Volume index:" + mVolIndex
+ + " greater than max index:" + mMaxVolIndex);
+ }
+ }
+ if (mMinVolIndex != INDEX_NOT_SET && mMaxVolIndex != INDEX_NOT_SET
+ && mMinVolIndex > mMaxVolIndex) {
+ throw new IllegalArgumentException("Min volume index:" + mMinVolIndex
+ + " greater than max index:" + mMaxVolIndex);
+ }
+ return new VolumeInfo(mUsesStreamType, mIsMuted,
+ mVolIndex, mMinVolIndex, mMaxVolIndex,
+ mVolGroupId, mStreamType);
+ }
+ }
+
+ //-----------------------------------------------
+ // Parcelable
+ @Override
+ public int hashCode() {
+ return Objects.hash(mUsesStreamType, mStreamType, mIsMuted,
+ mVolIndex, mMinVolIndex, mMaxVolIndex, mVolGroupId);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ VolumeInfo that = (VolumeInfo) o;
+ return ((mUsesStreamType == that.mUsesStreamType)
+ && (mStreamType == that.mStreamType)
+ && (mIsMuted == that.mIsMuted)
+ && (mVolIndex == that.mVolIndex)
+ && (mMinVolIndex == that.mMinVolIndex)
+ && (mMaxVolIndex == that.mMaxVolIndex)
+ && (mVolGroupId == that.mVolGroupId));
+ }
+
+ @Override
+ public String toString() {
+ return new String("VolumeInfo:"
+ + (mUsesStreamType ? (" streamType:" + mStreamType)
+ : (" volGroupId" + mVolGroupId))
+ + " muted:" + mIsMuted
+ + ((mVolIndex != INDEX_NOT_SET) ? (" volIndex:" + mVolIndex) : "")
+ + ((mMinVolIndex != INDEX_NOT_SET) ? (" min:" + mMinVolIndex) : "")
+ + ((mMaxVolIndex != INDEX_NOT_SET) ? (" max:" + mMaxVolIndex) : ""));
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeBoolean(mUsesStreamType);
+ dest.writeInt(mStreamType);
+ dest.writeBoolean(mIsMuted);
+ dest.writeInt(mVolIndex);
+ dest.writeInt(mMinVolIndex);
+ dest.writeInt(mMaxVolIndex);
+ dest.writeInt(mVolGroupId);
+ }
+
+ private VolumeInfo(@NonNull Parcel in) {
+ mUsesStreamType = in.readBoolean();
+ mStreamType = in.readInt();
+ mIsMuted = in.readBoolean();
+ mVolIndex = in.readInt();
+ mMinVolIndex = in.readInt();
+ mMaxVolIndex = in.readInt();
+ mVolGroupId = in.readInt();
+ }
+
+ public static final @NonNull Parcelable.Creator<VolumeInfo> CREATOR =
+ new Parcelable.Creator<VolumeInfo>() {
+ /**
+ * Rebuilds a VolumeInfo previously stored with writeToParcel().
+ * @param p Parcel object to read the VolumeInfo from
+ * @return a new VolumeInfo created from the data in the parcel
+ */
+ public VolumeInfo createFromParcel(Parcel p) {
+ return new VolumeInfo(p);
+ }
+
+ public VolumeInfo[] newArray(int size) {
+ return new VolumeInfo[size];
+ }
+ };
+}
diff --git a/media/java/android/media/midi/MidiManager.java b/media/java/android/media/midi/MidiManager.java
index 5348d4e..74c5499 100644
--- a/media/java/android/media/midi/MidiManager.java
+++ b/media/java/android/media/midi/MidiManager.java
@@ -112,20 +112,11 @@
// Binder stub for receiving device notifications from MidiService
private class DeviceListener extends IMidiDeviceListener.Stub {
private final DeviceCallback mCallback;
- private final Handler mHandler;
private final Executor mExecutor;
private final int mTransport;
- DeviceListener(DeviceCallback callback, Handler handler, int transport) {
- mCallback = callback;
- mHandler = handler;
- mExecutor = null;
- mTransport = transport;
- }
-
DeviceListener(DeviceCallback callback, Executor executor, int transport) {
mCallback = callback;
- mHandler = null;
mExecutor = executor;
mTransport = transport;
}
@@ -136,13 +127,6 @@
if (mExecutor != null) {
mExecutor.execute(() ->
mCallback.onDeviceAdded(device));
- } else if (mHandler != null) {
- final MidiDeviceInfo deviceF = device;
- mHandler.post(new Runnable() {
- @Override public void run() {
- mCallback.onDeviceAdded(deviceF);
- }
- });
} else {
mCallback.onDeviceAdded(device);
}
@@ -155,13 +139,6 @@
if (mExecutor != null) {
mExecutor.execute(() ->
mCallback.onDeviceRemoved(device));
- } else if (mHandler != null) {
- final MidiDeviceInfo deviceF = device;
- mHandler.post(new Runnable() {
- @Override public void run() {
- mCallback.onDeviceRemoved(deviceF);
- }
- });
} else {
mCallback.onDeviceRemoved(device);
}
@@ -173,13 +150,6 @@
if (mExecutor != null) {
mExecutor.execute(() ->
mCallback.onDeviceStatusChanged(status));
- } else if (mHandler != null) {
- final MidiDeviceStatus statusF = status;
- mHandler.post(new Runnable() {
- @Override public void run() {
- mCallback.onDeviceStatusChanged(statusF);
- }
- });
} else {
mCallback.onDeviceStatusChanged(status);
}
@@ -275,7 +245,11 @@
*/
@Deprecated
public void registerDeviceCallback(DeviceCallback callback, Handler handler) {
- DeviceListener deviceListener = new DeviceListener(callback, handler,
+ Executor executor = null;
+ if (handler != null) {
+ executor = handler::post;
+ }
+ DeviceListener deviceListener = new DeviceListener(callback, executor,
TRANSPORT_MIDI_BYTE_STREAM);
try {
mService.registerListener(mToken, deviceListener);
diff --git a/native/android/input.cpp b/native/android/input.cpp
index c06c81e..a231d8f 100644
--- a/native/android/input.cpp
+++ b/native/android/input.cpp
@@ -283,6 +283,21 @@
axis, pointer_index, history_index);
}
+int32_t AMotionEvent_getActionButton(const AInputEvent* motion_event) {
+ return static_cast<const MotionEvent*>(motion_event)->getActionButton();
+}
+
+int32_t AMotionEvent_getClassification(const AInputEvent* motion_event) {
+ switch (static_cast<const MotionEvent*>(motion_event)->getClassification()) {
+ case android::MotionClassification::NONE:
+ return AMOTION_EVENT_CLASSIFICATION_NONE;
+ case android::MotionClassification::AMBIGUOUS_GESTURE:
+ return AMOTION_EVENT_CLASSIFICATION_AMBIGUOUS_GESTURE;
+ case android::MotionClassification::DEEP_PRESS:
+ return AMOTION_EVENT_CLASSIFICATION_DEEP_PRESS;
+ }
+}
+
const AInputEvent* AMotionEvent_fromJava(JNIEnv* env, jobject motionEvent) {
MotionEvent* eventSrc = android::android_view_MotionEvent_getNativePtr(env, motionEvent);
if (eventSrc == nullptr) {
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index 3009a36..67a98a9 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -114,8 +114,10 @@
ALooper_removeFd;
ALooper_wake;
AMotionEvent_getAction;
+ AMotionEvent_getActionButton; # introduced=Tiramisu
AMotionEvent_getAxisValue; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
AMotionEvent_getButtonState; # introduced-arm=14 introduced-arm64=21 introduced-mips=14 introduced-mips64=21 introduced-x86=14 introduced-x86_64=21
+ AMotionEvent_getClassification; # introduced=Tiramisu
AMotionEvent_getDownTime;
AMotionEvent_getEdgeFlags;
AMotionEvent_getEventTime;
diff --git a/opengl/java/android/opengl/EGLExt.java b/opengl/java/android/opengl/EGLExt.java
index 74b64ea..1570e0e 100644
--- a/opengl/java/android/opengl/EGLExt.java
+++ b/opengl/java/android/opengl/EGLExt.java
@@ -18,6 +18,11 @@
package android.opengl;
+import android.annotation.NonNull;
+import android.hardware.SyncFence;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
/**
* EGL Extensions
*/
@@ -30,6 +35,12 @@
public static final int EGL_OPENGL_ES3_BIT_KHR = 0x0040;
public static final int EGL_RECORDABLE_ANDROID = 0x3142;
+ // EGL_ANDROID_native_fence_sync
+ public static final int EGL_SYNC_NATIVE_FENCE_ANDROID = 0x3144;
+ public static final int EGL_SYNC_NATIVE_FENCE_FD_ANDROID = 0x3145;
+ public static final int EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID = 0x3146;
+ public static final int EGL_NO_NATIVE_FENCE_FD_ANDROID = -1;
+
native private static void _nativeClassInit();
static {
_nativeClassInit();
@@ -43,4 +54,33 @@
long time
);
+ /**
+ * Retrieves the SyncFence for an EGLSync created with EGL_SYNC_NATIVE_FENCE_ANDROID
+ *
+ * See <a href="https://www.khronos.org/registry/EGL/extensions/ANDROID/EGL_ANDROID_native_fence_sync.txt">
+ * EGL_ANDROID_native_fence_sync</a> extension for more details
+ * @param display The EGLDisplay connection
+ * @param sync The EGLSync to fetch the SyncFence from
+ * @return A SyncFence representing the native fence.
+ * * If <sync> is not a valid sync object for <display>,
+ * an {@link SyncFence#isValid() invalid} SyncFence is returned and an EGL_BAD_PARAMETER
+ * error is generated.
+ * * If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute of <sync> is
+ * EGL_NO_NATIVE_FENCE_FD_ANDROID, an {@link SyncFence#isValid() invalid} SyncFence is
+ * returned and an EGL_BAD_PARAMETER error is generated.
+ * * If <display> does not match the display passed to eglCreateSync
+ * when <sync> was created, the behaviour is undefined.
+ */
+ public static @NonNull SyncFence eglDupNativeFenceFDANDROID(@NonNull EGLDisplay display,
+ @NonNull EGLSync sync) {
+ int fd = eglDupNativeFenceFDANDROIDImpl(display, sync);
+ Log.d("EGL", "eglDupNativeFence returned " + fd);
+ if (fd >= 0) {
+ return SyncFence.create(ParcelFileDescriptor.adoptFd(fd));
+ } else {
+ return SyncFence.createEmpty();
+ }
+ }
+
+ private static native int eglDupNativeFenceFDANDROIDImpl(EGLDisplay display, EGLSync sync);
}
diff --git a/packages/CompanionDeviceManager/Android.bp b/packages/CompanionDeviceManager/Android.bp
index 0e60873..6ded1637 100644
--- a/packages/CompanionDeviceManager/Android.bp
+++ b/packages/CompanionDeviceManager/Android.bp
@@ -39,6 +39,7 @@
static_libs: [
"androidx.lifecycle_lifecycle-livedata",
"androidx.lifecycle_lifecycle-extensions",
+ "androidx.recyclerview_recyclerview",
"androidx.appcompat_appcompat",
],
diff --git a/core/res/res/drawable/default_dream_preview.xml b/packages/CompanionDeviceManager/res/color/selector.xml
similarity index 72%
rename from core/res/res/drawable/default_dream_preview.xml
rename to packages/CompanionDeviceManager/res/color/selector.xml
index bf4a04b..fda827d 100644
--- a/core/res/res/drawable/default_dream_preview.xml
+++ b/packages/CompanionDeviceManager/res/color/selector.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
@@ -15,6 +14,7 @@
~ limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
- <solid android:color="@android:color/white"/>
-</shape>
\ No newline at end of file
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:color="@android:color/darker_gray"/> <!-- pressed -->
+ <item android:color="@android:color/white"/>
+</selector>
\ No newline at end of file
diff --git a/packages/CompanionDeviceManager/res/layout/activity_confirmation.xml b/packages/CompanionDeviceManager/res/layout/activity_confirmation.xml
index 313e164..70cbfdf 100644
--- a/packages/CompanionDeviceManager/res/layout/activity_confirmation.xml
+++ b/packages/CompanionDeviceManager/res/layout/activity_confirmation.xml
@@ -49,8 +49,8 @@
android:layout_height="0dp"
android:layout_weight="1">
- <ListView
- android:id="@+id/device_list"
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/device_list"
style="@android:style/Widget.Material.ListView"
android:layout_width="match_parent"
android:layout_height="200dp" />
diff --git a/packages/CompanionDeviceManager/res/layout/list_item_device.xml b/packages/CompanionDeviceManager/res/layout/list_item_device.xml
index d79aea6..153fc1f 100644
--- a/packages/CompanionDeviceManager/res/layout/list_item_device.xml
+++ b/packages/CompanionDeviceManager/res/layout/list_item_device.xml
@@ -19,7 +19,8 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
- android:padding="12dp">
+ android:padding="12dp"
+ android:background="@color/selector">
<!-- Do NOT change the ID of the root LinearLayout above: it's referenced in CTS tests. -->
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
index 9d3fc7f..b51d310 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
@@ -46,10 +46,13 @@
import android.util.Log;
import android.view.View;
import android.widget.Button;
-import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.List;
/**
* A CompanionDevice activity response for showing the available
@@ -92,9 +95,9 @@
// regular.
private Button mButtonAllow;
- // The list is only shown for multiple-device regular association request, after at least one
- // matching device is found.
- private @Nullable ListView mListView;
+ // The recycler view is only shown for multiple-device regular association request, after
+ // at least one matching device is found.
+ private @Nullable RecyclerView mRecyclerView;
private @Nullable DeviceListAdapter mAdapter;
// The flag used to prevent double taps, that may lead to sending several requests for creating
@@ -193,21 +196,19 @@
mTitle = findViewById(R.id.title);
mSummary = findViewById(R.id.summary);
- mListView = findViewById(R.id.device_list);
- mListView.setOnItemClickListener((av, iv, position, id) -> onListItemClick(position));
+ mRecyclerView = findViewById(R.id.device_list);
+ mAdapter = new DeviceListAdapter(this, this::onListItemClick);
mButtonAllow = findViewById(R.id.btn_positive);
mButtonAllow.setOnClickListener(this::onPositiveButtonClick);
findViewById(R.id.btn_negative).setOnClickListener(this::onNegativeButtonClick);
final CharSequence appLabel = getApplicationLabel(this, mRequest.getPackageName());
+
if (mRequest.isSelfManaged()) {
initUiForSelfManagedAssociation(appLabel);
} else if (mRequest.isSingleDevice()) {
- // TODO(b/211722613)
- // Treat singleDevice as the multipleDevices for now
- // initUiForSingleDevice(appLabel);
- initUiForMultipleDevices(appLabel);
+ initUiForSingleDevice(appLabel);
} else {
initUiForMultipleDevices(appLabel);
}
@@ -221,12 +222,6 @@
}
private void onUserSelectedDevice(@NonNull DeviceFilterPair<?> selectedDevice) {
- if (mSelectedDevice != null) {
- if (DEBUG) Log.w(TAG, "Already selected.");
- return;
- }
- mSelectedDevice = requireNonNull(selectedDevice);
-
final MacAddress macAddress = selectedDevice.getMacAddress();
onAssociationApproved(macAddress);
}
@@ -340,19 +335,32 @@
mTitle.setText(title);
mSummary.setText(summary);
- mListView.setVisibility(View.GONE);
+ mRecyclerView.setVisibility(View.GONE);
}
private void initUiForSingleDevice(CharSequence appLabel) {
if (DEBUG) Log.i(TAG, "initUiFor_SingleDevice()");
- // TODO: use real name
- final String deviceName = "<device>";
final String deviceProfile = mRequest.getDeviceProfile();
+ CompanionDeviceDiscoveryService.getScanResult().observe(this,
+ deviceFilterPairs -> updateSingleDeviceUi(
+ deviceFilterPairs, deviceProfile, appLabel));
+
+ mRecyclerView.setVisibility(View.GONE);
+ }
+
+ private void updateSingleDeviceUi(List<DeviceFilterPair<?>> deviceFilterPairs,
+ String deviceProfile, CharSequence appLabel) {
+ // Ignore "empty" scan reports.
+ if (deviceFilterPairs.isEmpty()) return;
+ mSelectedDevice = requireNonNull(deviceFilterPairs.get(0));
+
+ final String deviceName = mSelectedDevice.getDisplayName();
final Spanned title = getHtmlFromResources(
this, R.string.confirmation_title, appLabel, deviceName);
final Spanned summary;
+
if (deviceProfile == null) {
summary = getHtmlFromResources(this, R.string.summary_generic);
} else if (deviceProfile.equals(DEVICE_PROFILE_WATCH)) {
@@ -363,8 +371,6 @@
mTitle.setText(title);
mSummary.setText(summary);
-
- mListView.setVisibility(View.GONE);
}
private void initUiForMultipleDevices(CharSequence appLabel) {
@@ -389,10 +395,12 @@
mTitle.setText(title);
mSummary.setText(summary);
- mAdapter = new DeviceListAdapter(this);
+ mAdapter = new DeviceListAdapter(this, this::onListItemClick);
// TODO: hide the list and show a spinner until a first device matching device is found.
- mListView.setAdapter(mAdapter);
+ mRecyclerView.setAdapter(mAdapter);
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+
CompanionDeviceDiscoveryService.getScanResult().observe(
/* lifecycleOwner */ this,
/* observer */ mAdapter);
@@ -405,6 +413,16 @@
if (DEBUG) Log.d(TAG, "onListItemClick() " + position);
final DeviceFilterPair<?> selectedDevice = mAdapter.getItem(position);
+
+ if (mSelectedDevice != null) {
+ if (DEBUG) Log.w(TAG, "Already selected.");
+ return;
+ }
+ // Notify the adapter to highlight the selected item.
+ mAdapter.setSelectedPosition(position);
+
+ mSelectedDevice = requireNonNull(selectedDevice);
+
onUserSelectedDevice(selectedDevice);
}
@@ -417,9 +435,7 @@
if (mRequest.isSelfManaged()) {
onAssociationApproved(null);
} else {
- // TODO(b/211722613): call onUserSelectedDevice().
- throw new UnsupportedOperationException(
- "isSingleDevice() requests are not supported yet.");
+ onUserSelectedDevice(mSelectedDevice);
}
}
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java
index 5d48708..5f07fcf 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java
@@ -103,6 +103,8 @@
private final Runnable mTimeoutRunnable = this::timeout;
+ private boolean mStopAfterFirstMatch;;
+
/**
* A state enum for devices' discovery.
*/
@@ -163,8 +165,7 @@
break;
case ACTION_STOP_DISCOVERY:
- stopDiscoveryAndFinish();
- sStateLiveData.setValue(DiscoveryState.FINISHED_STOPPED);
+ stopDiscoveryAndFinish(/* timeout */ false);
break;
}
return START_NOT_STICKY;
@@ -182,6 +183,7 @@
requireNonNull(request);
if (mDiscoveryStarted) throw new RuntimeException("Discovery in progress.");
+ mStopAfterFirstMatch = request.isSingleDevice();
mDiscoveryStarted = true;
sStateLiveData.setValue(DiscoveryState.DISCOVERY_IN_PROGRESS);
sScanResultsLiveData.setValue(Collections.emptyList());
@@ -208,7 +210,7 @@
}
@MainThread
- private void stopDiscoveryAndFinish() {
+ private void stopDiscoveryAndFinish(boolean timeout) {
if (DEBUG) Log.i(TAG, "stopDiscovery()");
if (!mDiscoveryStarted) {
@@ -243,6 +245,12 @@
Handler.getMain().removeCallbacks(mTimeoutRunnable);
+ if (timeout) {
+ sStateLiveData.setValue(DiscoveryState.FINISHED_TIMEOUT);
+ } else {
+ sStateLiveData.setValue(DiscoveryState.FINISHED_STOPPED);
+ }
+
// "Finish".
stopSelf();
}
@@ -332,6 +340,7 @@
private void onDeviceFound(@NonNull DeviceFilterPair<?> device) {
runOnMainThread(() -> {
if (DEBUG) Log.v(TAG, "onDeviceFound() " + device);
+ if (mDiscoveryStopped) return;
if (mDevicesFound.contains(device)) {
// TODO: update the device instead of ignoring (new found device may contain
// additional/updated info, eg. name of the device).
@@ -347,6 +356,10 @@
mDevicesFound.add(device);
// Then: notify observers.
sScanResultsLiveData.setValue(mDevicesFound);
+ // Stop discovery when there's one device found for singleDevice.
+ if (mStopAfterFirstMatch) {
+ stopDiscoveryAndFinish(/* timeout */ false);
+ }
});
}
@@ -378,8 +391,7 @@
private void timeout() {
if (DEBUG) Log.i(TAG, "timeout()");
- stopDiscoveryAndFinish();
- sStateLiveData.setValue(DiscoveryState.FINISHED_TIMEOUT);
+ stopDiscoveryAndFinish(/* timeout */ true);
}
@Override
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java
index 198b778..e5513b0 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java
@@ -15,73 +15,84 @@
*/
package com.android.companiondevicemanager;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.lifecycle.Observer;
+import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
-
/**
* Adapter for the list of "found" devices.
*/
-class DeviceListAdapter extends BaseAdapter implements Observer<List<DeviceFilterPair<?>>> {
+class DeviceListAdapter extends RecyclerView.Adapter<DeviceListAdapter.ViewHolder> implements
+ Observer<List<DeviceFilterPair<?>>> {
+ public int mSelectedPosition = RecyclerView.NO_POSITION;
+
private final Context mContext;
// List if pairs (display name, address)
private List<DeviceFilterPair<?>> mDevices;
- DeviceListAdapter(Context context) {
+ private OnItemClickListener mListener;
+
+ private static final int TYPE_WIFI = 0;
+ private static final int TYPE_BT = 1;
+
+ DeviceListAdapter(Context context, OnItemClickListener listener) {
mContext = context;
+ mListener = listener;
}
- @Override
- public int getCount() {
- return mDevices != null ? mDevices.size() : 0;
- }
-
- @Override
public DeviceFilterPair<?> getItem(int position) {
return mDevices.get(position);
}
@Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(
+ R.layout.list_item_device, parent, false);
+ ViewHolder viewHolder = new ViewHolder(view);
+ if (viewType == TYPE_WIFI) {
+ viewHolder.mImageView.setImageDrawable(getIcon(
+ com.android.internal.R.drawable.ic_wifi_signal_3));
+ } else {
+ viewHolder.mImageView.setImageDrawable(getIcon(
+ android.R.drawable.stat_sys_data_bluetooth));
+ }
+ return viewHolder;
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ holder.itemView.setSelected(mSelectedPosition == position);
+ holder.mTextView.setText(mDevices.get(position).getDisplayName());
+ holder.itemView.setOnClickListener(v -> mListener.onItemClick(position));
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return isWifiDevice(position) ? TYPE_WIFI : TYPE_BT;
+ }
+
+ @Override
public long getItemId(int position) {
return position;
}
@Override
- public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
- final View view = convertView != null
- ? convertView
- : LayoutInflater.from(mContext).inflate(R.layout.list_item_device, parent, false);
-
- final DeviceFilterPair<?> item = getItem(position);
- bindView(view, item);
-
- return view;
+ public int getItemCount() {
+ return mDevices != null ? mDevices.size() : 0;
}
- private void bindView(@NonNull View view, DeviceFilterPair<?> item) {
- final TextView textView = view.findViewById(android.R.id.text1);
- textView.setText(item.getDisplayName());
-
- final ImageView iconView = view.findViewById(android.R.id.icon);
-
- // TODO(b/211417476): Set either Bluetooth or WiFi icon.
- iconView.setVisibility(View.GONE);
- // final int iconRes = isBt ? android.R.drawable.stat_sys_data_bluetooth
- // : com.android.internal.R.drawable.ic_wifi_signal_3;
- // final Drawable icon = getTintedIcon(mResources, iconRes);
- // iconView.setImageDrawable(icon);
+ public void setSelectedPosition(int position) {
+ mSelectedPosition = position;
}
@Override
@@ -89,4 +100,28 @@
mDevices = deviceFilterPairs;
notifyDataSetChanged();
}
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ private TextView mTextView;
+ private ImageView mImageView;
+ ViewHolder(View itemView) {
+ super(itemView);
+ mTextView = itemView.findViewById(android.R.id.text1);
+ mImageView = itemView.findViewById(android.R.id.icon);
+ }
+ }
+
+ private boolean isWifiDevice(int position) {
+ return mDevices.get(position).getDevice() instanceof android.net.wifi.ScanResult;
+ }
+
+ private Drawable getIcon(int resId) {
+ Drawable icon = mContext.getResources().getDrawable(resId, null);
+ icon.setTint(Color.DKGRAY);
+ return icon;
+ }
+
+ public interface OnItemClickListener {
+ void onItemClick(int position);
+ }
}
diff --git a/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java b/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java
index 1a955c4..72243f9 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java
@@ -146,7 +146,7 @@
* @param iface the name of the interface.
* @param state the current state of the interface, or {@link #STATE_ABSENT} if the
* interface was removed.
- * @param role whether the interface is in the client mode or server mode.
+ * @param role whether the interface is in client mode or server mode.
* @param configuration the current IP configuration of the interface.
* @hide
*/
diff --git a/packages/ConnectivityT/service/jni/com_android_server_net_NetworkStatsService.cpp b/packages/ConnectivityT/service/jni/com_android_server_net_NetworkStatsService.cpp
index f8a8168..39cbaf7 100644
--- a/packages/ConnectivityT/service/jni/com_android_server_net_NetworkStatsService.cpp
+++ b/packages/ConnectivityT/service/jni/com_android_server_net_NetworkStatsService.cpp
@@ -102,15 +102,10 @@
}
}
-static int deleteTagData(JNIEnv* /* env */, jclass /* clazz */, jint uid) {
- return qtaguid_deleteTagData(0, uid);
-}
-
static const JNINativeMethod gMethods[] = {
{"nativeGetTotalStat", "(I)J", (void*)getTotalStat},
{"nativeGetIfaceStat", "(Ljava/lang/String;I)J", (void*)getIfaceStat},
{"nativeGetUidStat", "(II)J", (void*)getUidStat},
- {"nativeDeleteTagData", "(I)I", (void*)deleteTagData},
};
int register_android_server_net_NetworkStatsService(JNIEnv* env) {
diff --git a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
index e8b3d4c..ef9ebb5 100644
--- a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
+++ b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
@@ -51,6 +51,7 @@
import static android.net.netstats.NetworkStatsDataMigrationUtils.PREFIX_UID_TAG;
import static android.net.netstats.NetworkStatsDataMigrationUtils.PREFIX_XT;
import static android.os.Trace.TRACE_TAG_NETWORK;
+import static android.system.OsConstants.ENOENT;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
@@ -122,7 +123,6 @@
import android.service.NetworkInterfaceProto;
import android.service.NetworkStatsServiceDumpProto;
import android.system.ErrnoException;
-import android.system.Os;
import android.telephony.PhoneStateListener;
import android.telephony.SubscriptionPlan;
import android.text.TextUtils;
@@ -221,6 +221,14 @@
// This is current path but may be changed soon.
private static final String UID_COUNTERSET_MAP_PATH =
"/sys/fs/bpf/map_netd_uid_counterset_map";
+ private static final String COOKIE_TAG_MAP_PATH =
+ "/sys/fs/bpf/map_netd_cookie_tag_map";
+ private static final String APP_UID_STATS_MAP_PATH =
+ "/sys/fs/bpf/map_netd_app_uid_stats_map";
+ private static final String STATS_MAP_A_PATH =
+ "/sys/fs/bpf/map_netd_stats_map_A";
+ private static final String STATS_MAP_B_PATH =
+ "/sys/fs/bpf/map_netd_stats_map_B";
private final Context mContext;
private final NetworkStatsFactory mStatsFactory;
@@ -348,6 +356,10 @@
*/
private SparseIntArray mActiveUidCounterSet = new SparseIntArray();
private final IBpfMap<U32, U8> mUidCounterSetMap;
+ private final IBpfMap<CookieTagMapKey, CookieTagMapValue> mCookieTagMap;
+ private final IBpfMap<StatsMapKey, StatsMapValue> mStatsMapA;
+ private final IBpfMap<StatsMapKey, StatsMapValue> mStatsMapB;
+ private final IBpfMap<UidStatsMapKey, StatsMapValue> mAppUidStatsMap;
/** Data layer operation counters for splicing into other structures. */
private NetworkStats mUidOperations = new NetworkStats(0L, 10);
@@ -481,6 +493,10 @@
mInterfaceMapUpdater = mDeps.makeBpfInterfaceMapUpdater(mContext, mHandler);
mInterfaceMapUpdater.start();
mUidCounterSetMap = mDeps.getUidCounterSetMap();
+ mCookieTagMap = mDeps.getCookieTagMap();
+ mStatsMapA = mDeps.getStatsMapA();
+ mStatsMapB = mDeps.getStatsMapB();
+ mAppUidStatsMap = mDeps.getAppUidStatsMap();
}
/**
@@ -554,8 +570,48 @@
}
}
- public TagStatsDeleter getTagStatsDeleter() {
- return NetworkStatsService::nativeDeleteTagData;
+ /** Gets the cookie tag map */
+ public IBpfMap<CookieTagMapKey, CookieTagMapValue> getCookieTagMap() {
+ try {
+ return new BpfMap<CookieTagMapKey, CookieTagMapValue>(COOKIE_TAG_MAP_PATH,
+ BpfMap.BPF_F_RDWR, CookieTagMapKey.class, CookieTagMapValue.class);
+ } catch (ErrnoException e) {
+ Log.wtf(TAG, "Cannot create cookie tag map: " + e);
+ return null;
+ }
+ }
+
+ /** Gets stats map A */
+ public IBpfMap<StatsMapKey, StatsMapValue> getStatsMapA() {
+ try {
+ return new BpfMap<StatsMapKey, StatsMapValue>(STATS_MAP_A_PATH,
+ BpfMap.BPF_F_RDWR, StatsMapKey.class, StatsMapValue.class);
+ } catch (ErrnoException e) {
+ Log.wtf(TAG, "Cannot create stats map A: " + e);
+ return null;
+ }
+ }
+
+ /** Gets stats map B */
+ public IBpfMap<StatsMapKey, StatsMapValue> getStatsMapB() {
+ try {
+ return new BpfMap<StatsMapKey, StatsMapValue>(STATS_MAP_B_PATH,
+ BpfMap.BPF_F_RDWR, StatsMapKey.class, StatsMapValue.class);
+ } catch (ErrnoException e) {
+ Log.wtf(TAG, "Cannot create stats map B: " + e);
+ return null;
+ }
+ }
+
+ /** Gets the uid stats map */
+ public IBpfMap<UidStatsMapKey, StatsMapValue> getAppUidStatsMap() {
+ try {
+ return new BpfMap<UidStatsMapKey, StatsMapValue>(APP_UID_STATS_MAP_PATH,
+ BpfMap.BPF_F_RDWR, UidStatsMapKey.class, StatsMapValue.class);
+ } catch (ErrnoException e) {
+ Log.wtf(TAG, "Cannot create app uid stats map: " + e);
+ return null;
+ }
}
}
@@ -1802,6 +1858,63 @@
currentTime);
}
+ // deleteKernelTagData can ignore ENOENT; otherwise we should log an error
+ private void logErrorIfNotErrNoent(final ErrnoException e, final String msg) {
+ if (e.errno != ENOENT) Log.e(TAG, msg, e);
+ }
+
+ private <K extends StatsMapKey, V extends StatsMapValue> void deleteStatsMapTagData(
+ IBpfMap<K, V> statsMap, int uid) {
+ try {
+ statsMap.forEach((key, value) -> {
+ if (key.uid == uid) {
+ try {
+ statsMap.deleteEntry(key);
+ } catch (ErrnoException e) {
+ logErrorIfNotErrNoent(e, "Failed to delete data(uid = " + key.uid + ")");
+ }
+ }
+ });
+ } catch (ErrnoException e) {
+ Log.e(TAG, "FAILED to delete tag data from stats map", e);
+ }
+ }
+
+ /**
+ * Deletes uid tag data from CookieTagMap, StatsMapA, StatsMapB, and UidStatsMap
+ * @param uid
+ */
+ private void deleteKernelTagData(int uid) {
+ try {
+ mCookieTagMap.forEach((key, value) -> {
+ if (value.uid == uid) {
+ try {
+ mCookieTagMap.deleteEntry(key);
+ } catch (ErrnoException e) {
+ logErrorIfNotErrNoent(e, "Failed to delete data(cookie = " + key + ")");
+ }
+ }
+ });
+ } catch (ErrnoException e) {
+ Log.e(TAG, "Failed to delete tag data from cookie tag map", e);
+ }
+
+ deleteStatsMapTagData(mStatsMapA, uid);
+ deleteStatsMapTagData(mStatsMapB, uid);
+
+ try {
+ mUidCounterSetMap.deleteEntry(new U32(uid));
+ } catch (ErrnoException e) {
+ logErrorIfNotErrNoent(e, "Failed to delete tag data from uid counter set map");
+ }
+
+ try {
+ mAppUidStatsMap.deleteEntry(new UidStatsMapKey(uid));
+ } catch (ErrnoException e) {
+ logErrorIfNotErrNoent(e, "Failed to delete tag data from app uid stats map");
+ }
+ }
+
/**
* Clean up {@link #mUidRecorder} after UID is removed.
*/
@@ -1817,10 +1930,7 @@
// Clear kernel stats associated with UID
for (int uid : uids) {
- final int ret = mDeps.getTagStatsDeleter().deleteTagData(uid);
- if (ret < 0) {
- Log.w(TAG, "problem clearing counters for uid " + uid + ": " + Os.strerror(-ret));
- }
+ deleteKernelTagData(uid);
}
}
@@ -2402,12 +2512,4 @@
private static native long nativeGetTotalStat(int type);
private static native long nativeGetIfaceStat(String iface, int type);
private static native long nativeGetUidStat(int uid, int type);
-
- // TODO: use BpfNetMaps to delete tag data and remove this.
- @VisibleForTesting
- interface TagStatsDeleter {
- int deleteTagData(int uid);
- }
-
- private static native int nativeDeleteTagData(int uid);
}
diff --git a/packages/SettingsLib/ActivityEmbedding/Android.bp b/packages/SettingsLib/ActivityEmbedding/Android.bp
index fc82b79..2569198 100644
--- a/packages/SettingsLib/ActivityEmbedding/Android.bp
+++ b/packages/SettingsLib/ActivityEmbedding/Android.bp
@@ -14,6 +14,8 @@
static_libs: [
"androidx.annotation_annotation",
+ "androidx.core_core",
+ "windowExtLib",
"SettingsLibUtils",
],
sdk_version: "system_current",
diff --git a/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java b/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java
index 7f17d26..44b3b4e 100644
--- a/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java
+++ b/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java
@@ -16,8 +16,14 @@
package com.android.settingslib.activityembedding;
+import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.core.os.BuildCompat;
+import androidx.window.embedding.SplitController;
import com.android.settingslib.utils.BuildCompatUtils;
@@ -44,6 +50,33 @@
return false;
}
+ /**
+ * Whether current activity is embedded in the Settings app or not.
+ */
+ public static boolean isActivityEmbedded(Activity activity) {
+ return SplitController.getInstance().isActivityEmbedded(activity);
+ }
+
+ /**
+ * Whether current activity is suggested to show back button or not.
+ */
+ public static boolean shouldHideBackButton(Activity activity, boolean isSecondaryLayerPage) {
+ if (!BuildCompat.isAtLeastT()) {
+ return false;
+ }
+ if (!isSecondaryLayerPage) {
+ return false;
+ }
+ final String shouldHideBackButton = Settings.Global.getString(activity.getContentResolver(),
+ "settings_hide_secondary_page_back_button_in_two_pane");
+
+ if (TextUtils.isEmpty(shouldHideBackButton)
+ || TextUtils.equals("true", shouldHideBackButton)) {
+ return isActivityEmbedded(activity);
+ }
+ return false;
+ }
+
private ActivityEmbeddingUtils() {
}
}
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index 684f4de..7a5ea47 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -48,7 +48,6 @@
"SettingsLibCollapsingToolbarBaseActivity",
"SettingsLibTwoTargetPreference",
"SettingsLibSettingsTransition",
- "SettingsLibActivityEmbedding",
"SettingsLibButtonPreference",
"setupdesign",
],
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
index 30748e6..d2a4de4 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
@@ -50,7 +50,7 @@
android:tint="?android:attr/colorAccent"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end"
- android:src="@android:drawable/ic_info"
+ android:src="@drawable/settingslib_ic_info"
android:visibility="gone" />
<Switch
diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
deleted file mode 100644
index 139cd95..0000000
--- a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<ripple
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:priv-android="http://schemas.android.com/apk/prv/res/android"
- android:color="@color/ripple_color">
-
- <item android:id="@android:id/background">
- <layer-list android:paddingMode="stack">
- <item
- android:top="8dp"
- android:bottom="8dp">
-
- <shape>
- <corners android:radius="28dp"/>
- <solid android:color="?priv-android:attr/colorAccentPrimary"/>
- <size android:height="@dimen/spinner_height"/>
- </shape>
- </item>
-
- <item
- android:gravity="center|end"
- android:width="18dp"
- android:height="18dp"
- android:end="8dp"
- android:drawable="@drawable/arrow_drop_down"/>
- </layer-list>
- </item>
-</ripple>
diff --git a/packages/SettingsLib/SettingsSpinner/res/layout/settings_spinner_dropdown_view.xml b/packages/SettingsLib/SettingsSpinner/res/layout-v31/settings_spinner_dropdown_view.xml
similarity index 78%
rename from packages/SettingsLib/SettingsSpinner/res/layout/settings_spinner_dropdown_view.xml
rename to packages/SettingsLib/SettingsSpinner/res/layout-v31/settings_spinner_dropdown_view.xml
index a342c84..cea1133 100644
--- a/packages/SettingsLib/SettingsSpinner/res/layout/settings_spinner_dropdown_view.xml
+++ b/packages/SettingsLib/SettingsSpinner/res/layout-v31/settings_spinner_dropdown_view.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2021 The Android Open Source Project
+ 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.
@@ -18,8 +18,7 @@
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- style="@style/SettingsSpinnerTitleBar"
+ style="@style/SettingsSpinnerDropdown"
android:gravity="center_vertical"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/settings_spinner_dropdown_background"/>
+ android:layout_height="wrap_content"/>
diff --git a/packages/SettingsLib/SettingsSpinner/res/layout/settings_spinner_preference.xml b/packages/SettingsLib/SettingsSpinner/res/layout/settings_spinner_preference.xml
index 7d5b6db..4c75344 100644
--- a/packages/SettingsLib/SettingsSpinner/res/layout/settings_spinner_preference.xml
+++ b/packages/SettingsLib/SettingsSpinner/res/layout/settings_spinner_preference.xml
@@ -22,7 +22,7 @@
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp">
- <com.android.settingslib.widget.settingsspinner.SettingsSpinner
+ <Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/packages/SettingsLib/SettingsSpinner/res/values-night/colors.xml b/packages/SettingsLib/SettingsSpinner/res/values-v31/colors.xml
similarity index 72%
rename from packages/SettingsLib/SettingsSpinner/res/values-night/colors.xml
rename to packages/SettingsLib/SettingsSpinner/res/values-v31/colors.xml
index abcf822..8fda876 100644
--- a/packages/SettingsLib/SettingsSpinner/res/values-night/colors.xml
+++ b/packages/SettingsLib/SettingsSpinner/res/values-v31/colors.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2021 The Android Open Source Project
+<!-- 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.
@@ -15,5 +15,6 @@
-->
<resources>
- <color name="ripple_color">@*android:color/material_grey_900</color>
+ <color name="settingslib_spinner_title_color">@android:color/system_neutral1_900</color>
+ <color name="settingslib_spinner_dropdown_color">@android:color/system_neutral2_700</color>
</resources>
diff --git a/packages/SettingsLib/SettingsSpinner/res/values-v31/styles.xml b/packages/SettingsLib/SettingsSpinner/res/values-v31/styles.xml
new file mode 100644
index 0000000..fc3ec43
--- /dev/null
+++ b/packages/SettingsLib/SettingsSpinner/res/values-v31/styles.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<resources>
+ <style name="SettingsSpinnerTitleBar">
+ <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
+ <item name="android:textColor">@color/settingslib_spinner_title_color</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:ellipsize">marquee</item>
+ <item name="android:minHeight">@dimen/spinner_height</item>
+ <item name="android:paddingStart">16dp</item>
+ <item name="android:paddingEnd">36dp</item>
+ <item name="android:paddingTop">@dimen/spinner_padding_top_or_bottom</item>
+ <item name="android:paddingBottom">@dimen/spinner_padding_top_or_bottom</item>
+ </style>
+
+ <style name="SettingsSpinnerDropdown">
+ <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
+ <item name="android:textColor">@color/settingslib_spinner_dropdown_color</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:ellipsize">marquee</item>
+ <item name="android:minHeight">@dimen/spinner_height</item>
+ <item name="android:paddingStart">16dp</item>
+ <item name="android:paddingEnd">36dp</item>
+ <item name="android:paddingTop">@dimen/spinner_padding_top_or_bottom</item>
+ <item name="android:paddingBottom">@dimen/spinner_padding_top_or_bottom</item>
+ </style>
+</resources>
diff --git a/packages/SettingsLib/SettingsSpinner/res/values/colors.xml b/packages/SettingsLib/SettingsSpinner/res/values/colors.xml
deleted file mode 100644
index 799b35e..0000000
--- a/packages/SettingsLib/SettingsSpinner/res/values/colors.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2021 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <color name="ripple_color">?android:attr/colorControlHighlight</color>
-</resources>
diff --git a/packages/SettingsLib/SettingsSpinner/res/values/styles.xml b/packages/SettingsLib/SettingsSpinner/res/values/styles.xml
index f665f38..8ea1f9a 100644
--- a/packages/SettingsLib/SettingsSpinner/res/values/styles.xml
+++ b/packages/SettingsLib/SettingsSpinner/res/values/styles.xml
@@ -18,10 +18,8 @@
<resources>
<style name="SettingsSpinnerTitleBar">
<item name="android:textAppearance">?android:attr/textAppearanceButton</item>
- <item name="android:textColor">@android:color/black</item>
<item name="android:maxLines">1</item>
<item name="android:ellipsize">marquee</item>
- <item name="android:minHeight">@dimen/spinner_height</item>
<item name="android:paddingStart">16dp</item>
<item name="android:paddingEnd">36dp</item>
<item name="android:paddingTop">@dimen/spinner_padding_top_or_bottom</item>
diff --git a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/settingsspinner/SettingsSpinnerAdapter.java b/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerAdapter.java
similarity index 77%
rename from packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/settingsspinner/SettingsSpinnerAdapter.java
rename to packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerAdapter.java
index 83da512..2611207 100644
--- a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/settingsspinner/SettingsSpinnerAdapter.java
+++ b/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerAdapter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -14,18 +14,18 @@
* limitations under the License.
*/
-package com.android.settingslib.widget.settingsspinner;
+package com.android.settingslib.widget;
import android.content.Context;
+import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
-import com.android.settingslib.widget.R;
-
/**
- * An ArrayAdapter which was used by {@link SettingsSpinner} with settings style.
+ * An ArrayAdapter which was used by Spinner with settings style.
+ * @param <T> the data type to be loaded.
*/
public class SettingsSpinnerAdapter<T> extends ArrayAdapter<T> {
@@ -43,7 +43,7 @@
public SettingsSpinnerAdapter(Context context) {
super(context, DEFAULT_RESOURCE);
- setDropDownViewResource(DFAULT_DROPDOWN_RESOURCE);
+ setDropDownViewResource(getDropdownResource());
mDefaultInflater = LayoutInflater.from(context);
}
@@ -59,6 +59,11 @@
* drop down view.
*/
public View getDefaultDropDownView(int position, View convertView, ViewGroup parent) {
- return mDefaultInflater.inflate(DFAULT_DROPDOWN_RESOURCE, parent, false /* attachToRoot */);
+ return mDefaultInflater.inflate(getDropdownResource(), parent, false /* attachToRoot */);
+ }
+
+ private int getDropdownResource() {
+ return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
+ ? DFAULT_DROPDOWN_RESOURCE : android.R.layout.simple_spinner_dropdown_item;
}
}
diff --git a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java b/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java
index d993e44..6952875 100644
--- a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java
+++ b/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java
@@ -20,16 +20,14 @@
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
+import android.widget.Spinner;
import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceClickListener;
import androidx.preference.PreferenceViewHolder;
-import com.android.settingslib.widget.settingsspinner.SettingsSpinner;
-import com.android.settingslib.widget.settingsspinner.SettingsSpinnerAdapter;
-
/**
- * This preference uses SettingsSpinner & SettingsSpinnerAdapter which provide default layouts for
+ * This preference uses Spinner & SettingsSpinnerAdapter which provide default layouts for
* both view and drop down view of the Spinner.
*/
public class SettingsSpinnerPreference extends Preference implements OnPreferenceClickListener {
@@ -113,7 +111,7 @@
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- final SettingsSpinner spinner = (SettingsSpinner) holder.findViewById(R.id.spinner);
+ final Spinner spinner = (Spinner) holder.findViewById(R.id.spinner);
spinner.setAdapter(mAdapter);
spinner.setSelection(mPosition);
spinner.setOnItemSelectedListener(mOnSelectedListener);
diff --git a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/settingsspinner/SettingsSpinner.java b/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/settingsspinner/SettingsSpinner.java
deleted file mode 100644
index 14286fa..0000000
--- a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/settingsspinner/SettingsSpinner.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settingslib.widget.settingsspinner;
-
-import android.content.Context;
-import android.os.Build;
-import android.util.AttributeSet;
-import android.widget.Spinner;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.settingslib.widget.R;
-
-/**
- * A {@link Spinner} with settings style.
- *
- * The items in the SettingsSpinner come from the {@link SettingsSpinnerAdapter} associated with
- * this view.
- */
-public class SettingsSpinner extends Spinner {
-
- /**
- * Constructs a new SettingsSpinner with the given context's theme.
- * And it also set a background resource with settings style.
- *
- * @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
- */
- public SettingsSpinner(Context context) {
- super(context);
- setBackgroundResource(R.drawable.settings_spinner_background);
- }
-
- /**
- * Constructs a new SettingsSpinner with the given context's theme and the supplied
- * mode of displaying choices. <code>mode</code> may be one of
- * {@link Spinner#MODE_DIALOG} or {@link Spinner#MODE_DROPDOWN}.
- * And it also set a background resource with settings style.
- *
- * @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
- * @param mode Constant describing how the user will select choices from
- * the spinner.
- *
- * @see Spinner#MODE_DIALOG
- * @see Spinner#MODE_DROPDOWN
- */
- public SettingsSpinner(Context context, int mode) {
- super(context, mode);
- setBackgroundResource(R.drawable.settings_spinner_background);
- }
-
- /**
- * Constructs a new SettingsSpinner with the given context's theme and the supplied
- * attribute set.
- * And it also set a background resource with settings style.
- *
- * @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
- * @param attrs The attributes of the XML tag that is inflating the view.
- */
- public SettingsSpinner(Context context, AttributeSet attrs) {
- super(context, attrs);
- setBackgroundResource(R.drawable.settings_spinner_background);
- }
-
- /**
- * Constructs a new SettingsSpinner with the given context's theme, the supplied
- * attribute set, and default style attribute.
- * And it also set a background resource with settings style.
- *
- * @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
- * @param attrs The attributes of the XML tag that is inflating the view.
- * @param defStyleAttr An attribute in the current theme that contains a
- * reference to a style resource that supplies default
- * values for the view. Can be 0 to not look for
- * defaults.
- */
- public SettingsSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- setBackgroundResource(R.drawable.settings_spinner_background);
- }
-
- /**
- * Constructs a new SettingsSpinner with the given context's theme, the supplied
- * attribute set, and default styles. <code>mode</code> may be one of
- * {@link Spinner#MODE_DIALOG} or {@link Spinner#MODE_DROPDOWN} and determines how the
- * user will select choices from the spinner.
- * And it also set a background resource with settings style.
- *
- * @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
- * @param attrs The attributes of the XML tag that is inflating the view.
- * @param defStyleAttr An attribute in the current theme that contains a
- * reference to a style resource that supplies default
- * values for the view. Can be 0 to not look for
- * defaults.
- * @param defStyleRes A resource identifier of a style resource that
- * supplies default values for the view, used only if
- * defStyleAttr is 0 or can not be found in the theme.
- * Can be 0 to not look for defaults.
- * @param mode Constant describing how the user will select choices from
- * the spinner.
- *
- * @see Spinner#MODE_DIALOG
- * @see Spinner#MODE_DROPDOWN
- */
- @RequiresApi(Build.VERSION_CODES.M)
- public SettingsSpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes,
- int mode) {
- super(context, attrs, defStyleAttr, defStyleRes, mode, null);
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- setDropDownVerticalOffset(getMeasuredHeight() - (int) getContext().getResources()
- .getDimension(R.dimen.spinner_padding_top_or_bottom));
- }
-}
diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/arrow_drop_down.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_arrow_drop_down.xml
similarity index 93%
rename from packages/SettingsLib/SettingsSpinner/res/drawable/arrow_drop_down.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_arrow_drop_down.xml
index 0544526..770a69d 100644
--- a/packages/SettingsLib/SettingsSpinner/res/drawable/arrow_drop_down.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_arrow_drop_down.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2018 The Android Open Source Project
+ 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.
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_progress_horizontal.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_progress_horizontal.xml
index a4c780b..ae63928 100644
--- a/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_progress_horizontal.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_progress_horizontal.xml
@@ -27,11 +27,12 @@
<item
android:id="@android:id/progress">
- <clip>
+ <scale android:scaleWidth="100%" android:useIntrinsicSizeAsMinimum="true">
<shape>
<corners android:radius="8dp" />
<solid android:color="?android:attr/textColorPrimary" />
+ <size android:width="8dp"/>
</shape>
- </clip>
+ </scale>
</item>
</layer-list>
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_spinner_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_spinner_background.xml
new file mode 100644
index 0000000..e1764af
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_spinner_background.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<ripple
+xmlns:android="http://schemas.android.com/apk/res/android"
+android:color="@color/settingslib_ripple_color">
+
+<item android:id="@android:id/background">
+ <layer-list android:paddingMode="stack">
+ <item
+ android:top="8dp"
+ android:bottom="8dp">
+
+ <shape>
+ <corners android:radius="28dp"/>
+ <solid android:color="@android:color/system_accent1_100"/>
+ <size android:height="@dimen/settingslib_spinner_height"/>
+ </shape>
+ </item>
+
+ <item
+ android:gravity="center|end"
+ android:width="18dp"
+ android:height="18dp"
+ android:end="12dp"
+ android:drawable="@drawable/settingslib_arrow_drop_down"/>
+ </layer-list>
+</item>
+</ripple>
diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_dropdown_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_spinner_dropdown_background.xml
similarity index 75%
rename from packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_dropdown_background.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_spinner_dropdown_background.xml
index aa451ae..056fb82 100644
--- a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_dropdown_background.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_spinner_dropdown_background.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2018 The Android Open Source Project
+ 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.
@@ -17,12 +17,12 @@
<ripple
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:priv-android="http://schemas.android.com/apk/prv/res/android"
- android:color="@color/ripple_color">
+ android:color="@color/settingslib_ripple_color">
<item android:id="@android:id/background">
<shape>
- <solid android:color="?priv-android:attr/colorAccentSecondary"/>
+ <corners android:radius="10dp"/>
+ <solid android:color="@android:color/system_accent2_100"/>
</shape>
</item>
</ripple>
diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/arrow_drop_down.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_arrow_drop_down.xml
similarity index 80%
copy from packages/SettingsLib/SettingsSpinner/res/drawable/arrow_drop_down.xml
copy to packages/SettingsLib/SettingsTheme/res/drawable/settingslib_arrow_drop_down.xml
index 0544526..6ed215d 100644
--- a/packages/SettingsLib/SettingsSpinner/res/drawable/arrow_drop_down.xml
+++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_arrow_drop_down.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2018 The Android Open Source Project
+ 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.
@@ -16,11 +16,11 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:viewportWidth="18"
- android:viewportHeight="18"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
android:width="24dp"
android:height="24dp">
<path
android:pathData="M7 10l5 5 5 -5z"
- android:fillColor="@android:color/black"/>
+ android:fillColor="?android:attr/textColorPrimary"/>
</vector>
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_spinner_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_spinner_background.xml
new file mode 100644
index 0000000..7466712
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable/settingslib_spinner_background.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<ripple
+xmlns:android="http://schemas.android.com/apk/res/android"
+android:color="@color/settingslib_ripple_color">
+
+ <item android:id="@android:id/background">
+ <layer-list android:paddingMode="stack">
+ <item
+ android:top="8dp"
+ android:bottom="8dp">
+
+ <shape>
+ <corners
+ android:radius="20dp"/>
+ <solid
+ android:color="?android:attr/colorPrimary"/>
+ <stroke
+ android:color="#1f000000"
+ android:width="1dp"/>
+ <size
+ android:height="32dp"/>
+ </shape>
+ </item>
+
+ <item
+ android:gravity="center|end"
+ android:width="24dp"
+ android:height="24dp"
+ android:end="4dp"
+ android:drawable="@drawable/settingslib_arrow_drop_down"/>
+ </layer-list>
+ </item>
+</ripple>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
index 3f2b8ac..77c4533 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
@@ -47,4 +47,6 @@
<color name="settingslib_text_color_secondary_device_default">@android:color/system_neutral2_200</color>
<color name="settingslib_text_color_preference_category_title">@android:color/system_accent1_100</color>
+
+ <color name="settingslib_ripple_color">@color/settingslib_material_grey_900</color>
</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
index ec3c336..6adb789 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
@@ -69,4 +69,7 @@
<color name="settingslib_text_color_secondary_device_default">@android:color/system_neutral2_700</color>
<color name="settingslib_text_color_preference_category_title">@android:color/system_accent1_600</color>
+
+ <color name="settingslib_ripple_color">?android:attr/colorControlHighlight</color>
+ <color name="settingslib_material_grey_900">#ff212121</color>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
index 11546c8..29fdab1 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
@@ -25,4 +25,6 @@
<dimen name="settingslib_listPreferredItemPaddingStart">24dp</dimen>
<!-- Right padding of the preference -->
<dimen name="settingslib_listPreferredItemPaddingEnd">24dp</dimen>
+
+ <dimen name="settingslib_spinner_height">36dp</dimen>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml
index 8e7226b..9d39911 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml
@@ -45,4 +45,13 @@
<item name="android:progressDrawable">@drawable/settingslib_progress_horizontal</item>
<item name="android:scaleY">0.5</item>
</style>
+
+ <style name="Spinner.SettingsLib"
+ parent="android:style/Widget.Material.Spinner">
+ <item name="android:background">@drawable/settingslib_spinner_background</item>
+ <item name="android:popupBackground">@drawable/settingslib_spinner_dropdown_background</item>
+ <item name="android:dropDownVerticalOffset">48dp</item>
+ <item name="android:layout_marginTop">16dp</item>
+ <item name="android:layout_marginBottom">8dp</item>
+ </style>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
index 7bf75bc..e9bbcc78 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
@@ -26,6 +26,7 @@
<item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item>
<item name="android:switchStyle">@style/Switch.SettingsLib</item>
<item name="android:progressBarStyleHorizontal">@style/HorizontalProgressBar.SettingsLib</item>
+ <item name="android:spinnerStyle">@style/Spinner.SettingsLib</item>
</style>
<!-- Using in SubSettings page including injected settings page -->
diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles.xml b/packages/SettingsLib/SettingsTheme/res/values/styles.xml
index aaab0f0..fa27bb6 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/styles.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/styles.xml
@@ -26,4 +26,10 @@
<style name="TextAppearance.CategoryTitle.SettingsLib"
parent="@android:style/TextAppearance.DeviceDefault.Medium">
</style>
+
+ <style name="Spinner.SettingsLib"
+ parent="android:style/Widget.Material.Spinner">
+ <item name="android:background">@drawable/settingslib_spinner_background</item>
+ <item name="android:dropDownVerticalOffset">48dp</item>
+ </style>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values/themes.xml b/packages/SettingsLib/SettingsTheme/res/values/themes.xml
index 2d881d1..8dc0f3c 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/themes.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/themes.xml
@@ -19,6 +19,7 @@
<!-- Only using in Settings application -->
<style name="Theme.SettingsBase" parent="@android:style/Theme.DeviceDefault.Settings">
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
+ <item name="android:spinnerStyle">@style/Spinner.SettingsLib</item>
</style>
<!-- Using in SubSettings page including injected settings page -->
diff --git a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ActivityTile.java b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ActivityTile.java
index b739ee6..98ea8b34 100644
--- a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ActivityTile.java
+++ b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ActivityTile.java
@@ -35,8 +35,7 @@
private static final String TAG = "ActivityTile";
public ActivityTile(ActivityInfo info, String category) {
- super(info, category);
- setMetaData(info.metaData);
+ super(info, category, info.metaData);
}
ActivityTile(Parcel in) {
diff --git a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ProviderTile.java b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ProviderTile.java
index 312d30e..54da585 100644
--- a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ProviderTile.java
+++ b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/ProviderTile.java
@@ -43,8 +43,7 @@
private String mKey;
public ProviderTile(ProviderInfo info, String category, Bundle metaData) {
- super(info, category);
- setMetaData(metaData);
+ super(info, category, metaData);
mAuthority = info.authority;
mKey = metaData.getString(META_DATA_PREFERENCE_KEYHINT);
}
diff --git a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java
index 220cf6b..a0c8ac4 100644
--- a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java
+++ b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java
@@ -71,16 +71,19 @@
private Bundle mMetaData;
private String mCategory;
- public Tile(ComponentInfo info, String category) {
+ public Tile(ComponentInfo info, String category, Bundle metaData) {
mComponentInfo = info;
mComponentPackage = mComponentInfo.packageName;
mComponentName = mComponentInfo.name;
mCategory = category;
+ mMetaData = metaData;
mIntent = new Intent().setClassName(mComponentPackage, mComponentName);
+ if (isNewTask()) {
+ mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
}
Tile(Parcel in) {
- final boolean isProviderTile = in.readBoolean();
mComponentPackage = in.readString();
mComponentName = in.readString();
mIntent = new Intent().setClassName(mComponentPackage, mComponentName);
@@ -90,6 +93,9 @@
}
mCategory = in.readString();
mMetaData = in.readBundle();
+ if (isNewTask()) {
+ mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
}
@Override
@@ -332,8 +338,7 @@
/**
* Whether the {@link Activity} should be launched in a separate task.
*/
- public boolean isNewTask(Context context) {
- ensureMetadataNotStale(context);
+ public boolean isNewTask() {
if (mMetaData != null
&& mMetaData.containsKey(META_DATA_NEW_TASK)) {
return mMetaData.getBoolean(META_DATA_NEW_TASK);
diff --git a/packages/SettingsLib/res/layout/restricted_popup_menu_item.xml b/packages/SettingsLib/res/layout/restricted_popup_menu_item.xml
index 923d022..52d7775 100644
--- a/packages/SettingsLib/res/layout/restricted_popup_menu_item.xml
+++ b/packages/SettingsLib/res/layout/restricted_popup_menu_item.xml
@@ -34,14 +34,4 @@
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:textColor="?android:attr/textColorAlertDialogListItem" />
- <ImageView
- android:id="@+id/restricted_icon"
- android:layout_width="@*android:dimen/config_restrictedIconSize"
- android:layout_height="@*android:dimen/config_restrictedIconSize"
- android:layout_alignParentRight="true"
- android:scaleType="centerInside"
- android:src="@*android:drawable/ic_info"
- android:tint="?android:attr/colorAccent"
- android:visibility="gone" />
-
</RelativeLayout>
diff --git a/packages/SettingsLib/res/layout/restricted_preference_widget_primary_switch.xml b/packages/SettingsLib/res/layout/restricted_preference_widget_primary_switch.xml
deleted file mode 100644
index 69df751..0000000
--- a/packages/SettingsLib/res/layout/restricted_preference_widget_primary_switch.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2021 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <include layout="@layout/restricted_icon"/>
-
- <include layout="@layout/preference_widget_primary_switch"/>
-</merge>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/layout/restricted_switch_widget.xml b/packages/SettingsLib/res/layout/restricted_switch_widget.xml
deleted file mode 100644
index 1520ac8..0000000
--- a/packages/SettingsLib/res/layout/restricted_switch_widget.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/restricted_icon"
- android:layout_width="@dimen/two_target_min_width"
- android:layout_height="@*android:dimen/config_restrictedIconSize"
- android:tint="?android:attr/colorAccent"
- android:src="@*android:drawable/ic_info"
- android:gravity="center" />
- <!-- Based off frameworks/base/core/res/res/layout/preference_widget_switch.xml -->
- <Switch xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/switch_widget"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:focusable="false"
- android:clickable="false"
- android:background="@null" />
-</merge>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 597815d..734cc5d 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Luggehalte"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Uitsaai-inligting"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Kies \'n profielprent"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Verstekgebruikerikoon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 7d3bece..bb4899e 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"የአየር ጥራት"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"የCast መረጃ"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"የመገለጫ ሥዕል ይምረጡ"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ነባሪ የተጠቃሚ አዶ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 6e406a7..f3df256 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"تم قطع اتصال Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"إيثرنت"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"لا يتم الاتصال."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"الوقت"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"التاريخ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"الطقس"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"جودة الهواء"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"معلومات البث"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"اختيار صورة الملف الشخصي"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"رمز المستخدم التلقائي"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index e7a3547..5499852 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথাৰনেট সংযোগ বিচ্ছিন্ন হৈছে।"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথাৰনেট।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"কল কৰা নহয়"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"সময়"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"তাৰিখ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"বতৰ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"বায়ুৰ গুণগত মান"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"কাষ্টৰ তথ্য"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"এখন প্ৰ’ফাইল চিত্ৰ বাছনি কৰক"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ডিফ’ল্ট ব্যৱহাৰকাৰীৰ চিহ্ন"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 226fc85..ee61930 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Havanın keyfiyyəti"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Yayım məlumatı"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Profil şəkli seçin"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Defolt istifadəçi ikonası"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 85be8c3..f7834b7 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvalitet vazduha"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Podaci o prebacivanju"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Odaberite sliku profila"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Podrazumevana ikona korisnika"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 94f107d..e63cddd 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet адлучаны."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Ніякіх выклікаў."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Час"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Дата"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Надвор\'е"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Якасць паветра"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Даныя пра трансляцыю"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Выберыце відарыс профілю"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Стандартны карыстальніцкі значок"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 408804f2..538f0f1 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Връзката с Ethernet е прекратена."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Без обаждания."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Час"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Дата"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Времето"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Качество на въздуха"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Предаване: Инф."</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Изберете снимка на потребителския профил"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Икона за основния потребител"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index ecfbbc3..9a9fabb 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথারনেটের সংযোগ বিচ্ছিন্ন হয়েছে৷"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথারনেট।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"কল করবেন না।"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"সময়"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"তারিখ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"আবহাওয়া"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"এয়ার কোয়ালিটি"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"কাস্ট সম্পর্কিত তথ্য"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"একটি প্রোফাইল ছবি বেছে নিন"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ডিফল্ট ব্যবহারকারীর আইকন"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index f742859..ba5cc4e 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvalitet zraka"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Podaci o emitiranju"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Odaberite sliku profila"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Zadana ikona korisnika"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 1b45287..30dfbe5 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualitat de l\'aire"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Informació d\'emissió"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Tria una foto de perfil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Icona d\'usuari predeterminat"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index b28bca5..0006a76 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Síť ethernet je odpojena."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Bez volání."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Čas"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Počasí"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvalita vzduchu"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info o odesílání"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Vyberte profilový obrázek"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Výchozí uživatelská ikona"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 3c8a4aa..63e462a 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er ikke tilsluttet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Opkald er deaktiveret."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Klokkeslæt"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Dato"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Vejr"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Luftkvalitet"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Cast-oplysninger"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Vælg et profilbillede"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon for standardbruger"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 4c76217..3ca2115 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Το Ethernet αποσυνδέθηκε."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Χωρίς κλήσεις."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Ώρα"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Ημερομηνία"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Καιρός"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Ποιότητα αέρα"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Πληροφορίες ηθοποιών"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Επιλογή φωτογραφίας προφίλ"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Προεπιλεγμένο εικονίδιο χρήστη"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 44d0904..63c56ba0 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Hora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Fecha"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Clima"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Calidad del aire"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info de reparto"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Elige una foto de perfil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ícono de usuario predeterminado"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 646d45b..743e81c 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -246,7 +246,7 @@
<string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Empareja nuevos dispositivos con el escáner de códigos QR"</string>
<string name="adb_pair_method_code_title" msgid="1122590300445142904">"Emparejar dispositivo con código de sincronización"</string>
<string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Empareja nuevos dispositivos con un código de seis dígitos"</string>
- <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos vinculados"</string>
+ <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos emparejados"</string>
<string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Conectados actualmente"</string>
<string name="adb_wireless_device_details_title" msgid="7129369670526565786">"Datos del dispositivo"</string>
<string name="adb_device_forget" msgid="193072400783068417">"Olvidar"</string>
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Conexión Ethernet desconectada."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Hora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Fecha"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Info. meteorológica"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Calidad del aire"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info. de emisión"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Elige una imagen de perfil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Icono de usuario predeterminado"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 6b44437..63998f9 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Etherneti-ühendus on katkestatud."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Helistamine pole võimalik."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Kellaaeg"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Kuupäev"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Ilm"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Õhukvaliteet"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Osatäitjate teave"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Valige profiilipilt"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Vaikekasutajaikoon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index ac38a13..4152219 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"کیفیت هوا"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"اطلاعات ارسال محتوا"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"انتخاب عکس نمایه"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"نماد کاربر پیشفرض"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 47613d8..2b5b550 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet on irrotettu."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Ei puheluita."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Aika"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Päivämäärä"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Sää"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Ilmanlaatu"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Striimaustiedot"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Valitse profiilikuva"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Oletuskäyttäjäkuvake"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 40784fd..7ecaa38 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Aucun appel."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Heure"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Date"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Météo"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualité de l\'air"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info diffusion"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Choisir une photo de profil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Icône d\'utilisateur par défaut"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index d8ca2b6..dbc398e 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Pas d\'appels."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Heure"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Date"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Météo"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualité de l\'air"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Infos distribution"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Choisissez une photo de profil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Icône de l\'utilisateur par défaut"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 675bc9f..b211606 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Calidade do aire"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Datos da emisión"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Escolle unha imaxe do perfil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Icona do usuario predeterminado"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 0a8554e..203a298 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ઇથરનેટ ડિસ્કનેક્ટ થયું."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ઇથરનેટ."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"કોઈ કૉલિંગ નહીં."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"સમય"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"તારીખ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"હવામાન"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"હવાની ક્વૉલિટી"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"કાસ્ટ વિશેની માહિતી"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"પ્રોફાઇલ ફોટો પસંદ કરો"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ડિફૉલ્ટ વપરાશકર્તાનું આઇકન"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 15d1218..d934b46 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvaliteta zraka"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Inform. o emitiranju"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Odabir profilne slike"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ikona zadanog korisnika"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index b9d1ed0..cd09a85 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Levegőminőség"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Átküldési információ"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Profilkép választása"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Alapértelmezett felhasználó ikonja"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 4d0d39f..0a2c406 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet-ը անջատված է:"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet։"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Զանգել հնարավոր չէ։"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Ժամ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Ամսաթիվ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Եղանակ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Օդի որակը"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Հեռարձակման տվյալներ"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Պրոֆիլի նկար ընտրեք"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Օգտատիրոջ կանխադրված պատկերակ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 7f76d40..12e0691 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet terputus."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Tidak ada panggilan."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Waktu"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Tanggal"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Cuaca"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kualitas Udara"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info Transmisi"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Pilih foto profil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon pengguna default"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 3b551d0..bf7021e 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet aftengt."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Engin símtöl."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Tími"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Dagsetning"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Veður"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Loftgæði"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Útsendingaruppl."</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Veldu prófílmynd"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Tákn sjálfgefins notanda"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 2740710..5bccf24 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Connessione Ethernet annullata."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Chiamate non disponibili."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Ora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Meteo"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualità dell\'aria"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info sul cast"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Scegli un\'immagine del profilo"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Icona dell\'utente predefinito"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 0599762..bc17f9e 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"אתרנט מנותק."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"אתרנט."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"אין שיחות."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"שעה"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"תאריך"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"מזג אוויר"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"איכות האוויר"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"פרטי ההעברה"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"בחירה של תמונת פרופיל"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"סמל המשתמש שמוגדר כברירת מחדל"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index d639381..aa274a5 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"大気質"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"キャスト情報"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"プロフィール写真の選択"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"デフォルト ユーザー アイコン"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 14bdbf1..395c7f9 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"ჰაერის ხარისხი"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ტრანსლირების ინფო"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"აირჩიეთ პროფილის სურათი"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"მომხმარებლის ნაგულისხმევი ხატულა"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 0f7bcde..74e0957 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Ауа сапасы"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Трансляция ақпараты"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Профиль суретін таңдау"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Әдепкі пайдаланушы белгішесі"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 22f8d14..cf043e7 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"គុណភាពខ្យល់"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ព័ត៌មានអំពីការបញ្ជូន"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"ជ្រើសរើសរូបភាពកម្រងព័ត៌មាន"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"រូបអ្នកប្រើប្រាស់លំនាំដើម"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 02ed98f..31bd310 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"이더넷에서 연결 해제되었습니다."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"이더넷에 연결되었습니다."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"통화 모드가 없습니다."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"시간"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"날짜"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"날씨"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"대기 상태"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"전송 정보"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"프로필 사진 선택하기"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"기본 사용자 아이콘"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 542f3ad..ad38373 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Абанын сапаты"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Тышкы экранга чыгаруу маалыматы"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Профилдин сүрөтүн тандоо"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Демейки колдонуучунун сүрөтчөсү"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 5d9a478..725a135 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"ຄຸນນະພາບອາກາດ"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ຂໍ້ມູນການສົ່ງສັນຍານ"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"ເລືອກຮູບໂປຣໄຟລ໌"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ໄອຄອນຜູ້ໃຊ້ເລີ່ມຕົ້ນ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 5d6ad42..5d34208 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Atsijungta nuo eterneto."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternetas."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Nekviečiama."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Laikas"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Orai"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Oro kokybė"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Perdav. informacija"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Pasirinkite profilio nuotrauką"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Numatytojo naudotojo piktograma"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 04490a8..ed4b8e6 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Pārtraukts savienojums ar tīklu Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Tīkls Ethernet"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Zvanīšana nav pieejama."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Laiks"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datums"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Laikapstākļi"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Gaisa kvalitāte"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Apraides informācija"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Profila attēla izvēle"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Noklusējuma lietotāja ikona"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 2b9a413..663f355 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Квалитет на воздух"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Инфо за улогите"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Изберете профилна слика"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Икона за стандарден корисник"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 9179083..7b1605a 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Агаарын чанар"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Дамжуулах мэдээлэл"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Профайл зураг сонгох"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Өгөгдмөл хэрэглэгчийн дүрс тэмдэг"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 2f92d3f..8edf739 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kualiti Udara"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Maklumat Pelakon"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Pilih gambar profil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon pengguna lalai"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index ecb3b75..061760f 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet နှင့်ချိတ်ဆက်မှုပြတ်တောက်"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"အီသာနက်။"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ခေါ်ဆိုမှု မရှိပါ။"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"အချိန်"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"ရက်စွဲ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"မိုးလေဝသ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"လေထုအရည်အသွေး"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ကာစ် အချက်အလက်"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"ပရိုဖိုင်ပုံ ရွေးပါ"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"မူရင်းအသုံးပြုသူ သင်္ကေတ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 3f10e2a..f47fae3 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er frakoblet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Ingen ringing."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Klokkeslett"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Dato"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Vær"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Luftkvalitet"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Castinformasjon"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Velg et profilbilde"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Standard brukerikon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index e30cd46..4eb4400 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernetverbinding verbroken."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Geen gesprekken."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Tijd"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Weer"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Luchtkwaliteit"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Castinformatie"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Kies een profielfoto"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Standaard gebruikersicoon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 8376c83..42b6038 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"ବାୟୁର ଗୁଣବତ୍ତା"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"କାଷ୍ଟ ସୂଚନା"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"ଏକ ପ୍ରୋଫାଇଲ ଛବି ବାଛନ୍ତୁ"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ଡିଫଲ୍ଟ ଉପଯୋଗକର୍ତ୍ତା ଆଇକନ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 4bf903b..a02cd5b 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ਈਥਰਨੈੱਟ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ।"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ਈਥਰਨੈੱਟ।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ਕਾਲਿੰਗ ਸੇਵਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"ਸਮਾਂ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"ਤਾਰੀਖ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"ਮੌਸਮ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"ਹਵਾ ਦੀ ਕੁਆਲਿਟੀ"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ਕਾਸਟ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"ਕੋਈ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਚੁਣੋ"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਰਤੋਂਕਾਰ ਪ੍ਰਤੀਕ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index b667bfb..f69ffb7 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Rozłączono z siecią Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Brak połączenia."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Godzina"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Pogoda"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Jakość powietrza"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Obsada"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Wybierz zdjęcie profilowe"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ikona domyślnego użytkownika"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 96145d5..d856b48 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -438,7 +438,7 @@
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache da transcodificação"</string>
<string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
- <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizar e controlar os serviços em execução no momento"</string>
+ <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços em execução no momento"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="2444261109877277714">"Configurar implementação do WebView"</string>
<string name="select_webview_provider_toast_text" msgid="8512254949169359848">"Esta opção não é mais válida. Tente novamente."</string>
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualidade do ar"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info. de transmissão"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Escolher a foto do perfil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ícone de usuário padrão"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 96145d5..d856b48 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -438,7 +438,7 @@
<string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache da transcodificação"</string>
<string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
- <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizar e controlar os serviços em execução no momento"</string>
+ <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços em execução no momento"</string>
<string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="2444261109877277714">"Configurar implementação do WebView"</string>
<string name="select_webview_provider_toast_text" msgid="8512254949169359848">"Esta opção não é mais válida. Tente novamente."</string>
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualidade do ar"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info. de transmissão"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Escolher a foto do perfil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ícone de usuário padrão"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index b04af7b..9fb13aa 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Calitatea aerului"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Informații artiști"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Alegeți o fotografie de profil"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Pictograma prestabilită a utilizatorului"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 97a4717..b0b3d14 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Устройство отключено от Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Совершение вызовов невозможно."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Время"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Дата"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Погода"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Качество воздуха"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Данные о трансляции"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Выберите фото профиля"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Значок пользователя по умолчанию"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 2dcabe1..a391e71 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ඊතර්නෙට් විසන්ධි කරන ලදී."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ඊතර්නෙට්."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ඇමතුම් නැත."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"වේලාව"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"දිනය"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"කාලගුණය"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"වායු ගුණත්වය"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"විකාශ තතු"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"පැතිකඩ පින්තූරයක් තේරීම"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"පෙරනිමි පරිශීලක නිරූපකය"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index d4a94fa..1d3320e 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Sieť ethernet je odpojená"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Žiadne volanie."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Čas"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Dátum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Počasie"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvalita vzduchu"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Informácie o prenose"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Výber profilovej fotky"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Predvolená ikona používateľa"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 65829d4..d38ab74 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Lidhja e eternetit u shkëput."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Telefonatat nuk ofrohen"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Ora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Moti"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Cilësia e ajrit"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Të dhënat e aktorëve"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Zgjidh një fotografi profili"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ikona e parazgjedhur e përdoruesit"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index d0b69e5..03ee28c 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Квалитет ваздуха"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Подаци о пребацивању"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Одаберите слику профила"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Подразумевана икона корисника"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 28653ef..1efae32 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet har kopplats från."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Inga anrop."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Tid"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Väder"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Luftkvalitet"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info om rollistan"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Välj en profilbild"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon för standardanvändare"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index d24d5e0..d8d5629 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethaneti imeondolewa."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethaneti."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Huwezi kupiga wala kupokea simu."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Saa"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Tarehe"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Hali ya Hewa"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Ubora wa Hewa"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Maelezo ya Wahusika"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Chagua picha ya wasifu"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Aikoni chaguomsingi ya mtumiaji"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index eec1a55..4bc0728 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"คุณภาพอากาศ"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ข้อมูลแคสต์"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"เลือกรูปโปรไฟล์"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ไอคอนผู้ใช้เริ่มต้น"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index fe0f4a3b..5db99d9 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kalidad ng Hangin"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Impormasyon ng Cast"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Pumili ng larawan sa profile"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Icon ng default na user"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 8a0042f..68fd199 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bağlantısı kesildi."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Çağrı yok."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Saat"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Tarih"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Hava durumu"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Hava Kalitesi"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Yayın Bilgisi"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Profil fotoğrafı seç"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Varsayılan kullanıcı simgesi"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 6fd7788..207e890 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet відключено."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Виклики недоступні."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Час"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Дата"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Погода"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Якість повітря"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Акторський склад"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Вибрати зображення профілю"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Значок користувача за умовчанням"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index f0449b4..3163277 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ایتھرنیٹ منقطع ہے۔"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ایتھرنیٹ۔"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"کوئی کالنگ نہیں ہے۔"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"وقت"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"تاریخ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"موسم"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"ہوا کا معیار"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"کاسٹ کرنے کی معلومات"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"پروفائل کی تصویر منتخب کریں"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ڈیفالٹ صارف کا آئیکن"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index c17415f..09dcdc0 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Havo sifati"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Translatsiya axboroti"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Profil rasmini tanlash"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Foydalanuvchining standart belgisi"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 89e1325..12af588 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Đã ngắt kết nối Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Không thể gọi điện."</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Giờ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Ngày"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Thời tiết"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Chất lượng không khí"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Thông tin về dàn nghệ sĩ"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Chọn một ảnh hồ sơ"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Biểu tượng người dùng mặc định"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index e125680..f6912b1 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"空气质量"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"投射信息"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"选择个人资料照片"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"默认用户图标"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 6278fdc..2580cde 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -635,17 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"未連上乙太網路。"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"乙太網路。"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"不顯示在螢幕上。"</string>
- <!-- no translation found for dream_complication_title_time (701747800712893499) -->
- <skip />
- <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
- <skip />
- <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
- <skip />
- <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
- <skip />
- <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
- <skip />
+ <string name="dream_complication_title_time" msgid="701747800712893499">"時間"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"日期"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"天氣"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"空氣品質"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"演出者資訊"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"選擇個人資料相片"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"預設使用者圖示"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 29a431d..5250aa5 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -641,6 +641,5 @@
<string name="dream_complication_title_aqi" msgid="4587552608957834110">"Ikhwalithi Yomoya"</string>
<string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Ulwazi Lokusakaza"</string>
<string name="avatar_picker_title" msgid="8492884172713170652">"Khetha isithombe sephrofayela"</string>
- <!-- no translation found for default_user_icon_description (6554047177298972638) -->
- <skip />
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Isithonjana somsebenzisi sokuzenzakalelayo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml
index 25d6c555..d893d09 100644
--- a/packages/SettingsLib/res/values/dimens.xml
+++ b/packages/SettingsLib/res/values/dimens.xml
@@ -22,8 +22,6 @@
<!-- The translation for disappearing security views after having solved them. -->
<dimen name="disappear_y_translation">-32dp</dimen>
- <dimen name="circle_avatar_size">190dp</dimen>
-
<!-- Height of a user icon view -->
<dimen name="user_icon_view_height">24dp</dimen>
<!-- User spinner -->
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 0fe869f..8965144e 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1077,7 +1077,7 @@
<!-- Subtitle for the accessibility preference to configure display color space correction. [CHAR LIMIT=NONE] -->
<string name="accessibility_display_daltonizer_preference_subtitle">
<![CDATA[
- Adjust how colors display on your device. This can be helpful when you want to:<br/><br/>
+ Color correction can be helpful when you want to:<br/>
<ol>
<li> See colors more accurately</li>
<li> Remove colors to help you focus</li>
diff --git a/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java
index 246fc8dd..b43b444 100644
--- a/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java
@@ -59,7 +59,7 @@
@Override
protected int getSecondTargetResId() {
- return R.layout.restricted_preference_widget_primary_switch;
+ return R.layout.preference_widget_primary_switch;
}
@Override
@@ -67,7 +67,6 @@
super.onBindViewHolder(holder);
final View switchWidget = holder.findViewById(R.id.switchWidget);
if (switchWidget != null) {
- switchWidget.setVisibility(isDisabledByAdmin() ? View.GONE : View.VISIBLE);
switchWidget.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java
index 81146fa..db2a6ec 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java
@@ -22,7 +22,6 @@
import android.os.Process;
import android.os.UserHandle;
import android.util.AttributeSet;
-import android.view.View;
import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.PreferenceManager;
@@ -67,23 +66,9 @@
}
@Override
- protected int getSecondTargetResId() {
- return R.layout.restricted_icon;
- }
-
- @Override
- protected boolean shouldHideSecondTarget() {
- return !isDisabledByAdmin();
- }
-
- @Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
mHelper.onBindViewHolder(holder);
- final View restrictedIcon = holder.findViewById(R.id.restricted_icon);
- if (restrictedIcon != null) {
- restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE);
- }
}
@Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
index 342189d..c607d74 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
@@ -46,7 +46,6 @@
public RestrictedSwitchPreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- setWidgetLayoutResource(R.layout.restricted_switch_widget);
mHelper = new RestrictedPreferenceHelper(context, this, attrs);
if (attrs != null) {
final TypedArray attributes = context.obtainStyledAttributes(attrs,
@@ -108,15 +107,6 @@
switchSummary = mRestrictedSwitchSummary;
}
- final View restrictedIcon = holder.findViewById(R.id.restricted_icon);
- final View switchWidget = holder.findViewById(android.R.id.switch_widget);
- if (restrictedIcon != null) {
- restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE);
- }
- if (switchWidget != null) {
- switchWidget.setVisibility(isDisabledByAdmin() ? View.GONE : View.VISIBLE);
- }
-
final ImageView icon = holder.itemView.findViewById(android.R.id.icon);
if (mIconSize > 0) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 883e080..f6e3557 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -144,7 +144,7 @@
* Returns a circular icon for a user.
*/
public static Drawable getUserIcon(Context context, UserManager um, UserInfo user) {
- final int iconSize = UserIconDrawable.getSizeForList(context);
+ final int iconSize = UserIconDrawable.getDefaultSize(context);
if (user.isManagedProfile()) {
Drawable drawable = UserIconDrawable.getManagedUserDrawable(context);
drawable.setBounds(0, 0, iconSize, iconSize);
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java b/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java
index e5ea446..7db00f3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java
@@ -31,8 +31,6 @@
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
-import com.android.settingslib.R;
-
/**
* Converts the user avatar icon to a circularly clipped one.
* TODO: Move this to an internal framework class and share with the one in Keyguard.
@@ -49,9 +47,9 @@
public static CircleFramedDrawable getInstance(Context context, Bitmap icon) {
Resources res = context.getResources();
- float iconSize = res.getDimension(R.dimen.circle_avatar_size);
+ int iconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size);
- CircleFramedDrawable instance = new CircleFramedDrawable(icon, (int) iconSize);
+ CircleFramedDrawable instance = new CircleFramedDrawable(icon, iconSize);
return instance;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
index 035fafd..d01f2b4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
@@ -49,8 +49,6 @@
import androidx.annotation.VisibleForTesting;
import androidx.core.os.BuildCompat;
-import com.android.settingslib.R;
-
/**
* Converts the user avatar icon to a circularly clipped one with an optional badge and frame
*/
@@ -120,8 +118,9 @@
* @param context
* @return size in pixels
*/
- public static int getSizeForList(Context context) {
- return (int) context.getResources().getDimension(R.dimen.circle_avatar_size);
+ public static int getDefaultSize(Context context) {
+ return context.getResources()
+ .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size);
}
public UserIconDrawable() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
index bd3deae..fcb56d2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
@@ -50,7 +50,6 @@
public class DreamBackend {
private static final String TAG = "DreamBackend";
private static final boolean DEBUG = false;
- private final Drawable mDreamPreviewDefault;
public static class DreamInfo {
public CharSequence caption;
@@ -135,8 +134,6 @@
com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
mDreamsActivatedOnDockByDefault = resources.getBoolean(
com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
- mDreamPreviewDefault = resources.getDrawable(
- com.android.internal.R.drawable.default_dream_preview);
mDisabledDreams = Arrays.stream(resources.getStringArray(
com.android.internal.R.array.config_disabledDreamComponents))
.map(ComponentName::unflattenFromString)
@@ -182,9 +179,6 @@
dreamInfo.settingsComponentName = dreamMetadata.settingsActivity;
dreamInfo.previewImage = dreamMetadata.previewImage;
}
- if (dreamInfo.previewImage == null) {
- dreamInfo.previewImage = mDreamPreviewDefault;
- }
dreamInfos.add(dreamInfo);
}
dreamInfos.sort(mComparator);
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
index f8bb38b..5862f60 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
@@ -16,19 +16,17 @@
package com.android.settingslib.users;
-import android.annotation.NonNull;
import android.app.Activity;
import android.content.Intent;
+import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.Log;
import android.widget.ImageView;
import com.android.internal.util.UserIcons;
-import com.android.settingslib.R;
import com.android.settingslib.drawable.CircleFramedDrawable;
import com.android.settingslib.utils.ThreadUtils;
@@ -114,10 +112,10 @@
private void onDefaultIconSelected(int tintColor) {
try {
ThreadUtils.postOnBackgroundThread(() -> {
+ Resources res = mActivity.getResources();
Drawable drawable =
- UserIcons.getDefaultUserIconInColor(mActivity.getResources(), tintColor);
- Bitmap bitmap = convertToBitmap(drawable,
- (int) mActivity.getResources().getDimension(R.dimen.circle_avatar_size));
+ UserIcons.getDefaultUserIconInColor(res, tintColor);
+ Bitmap bitmap = UserIcons.convertToBitmapAtUserIconSize(res, drawable);
ThreadUtils.postOnMainThread(() -> onPhotoProcessed(bitmap));
}).get();
@@ -126,14 +124,6 @@
}
}
- private static Bitmap convertToBitmap(@NonNull Drawable icon, int size) {
- Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- icon.setBounds(0, 0, size, size);
- icon.draw(canvas);
- return bitmap;
- }
-
private void onPhotoCropped(final Uri data) {
ThreadUtils.postOnBackgroundThread(() -> {
InputStream imageStream = null;
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java
index 53a382a..b81d13d 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java
@@ -22,14 +22,12 @@
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
+import android.widget.Spinner;
import androidx.preference.PreferenceViewHolder;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
-import com.android.settingslib.widget.settingsspinner.SettingsSpinner;
-import com.android.settingslib.widget.settingsspinner.SettingsSpinnerAdapter;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -42,7 +40,7 @@
private Context mContext;
private PreferenceViewHolder mViewHolder;
- private SettingsSpinner mSpinner;
+ private Spinner mSpinner;
private SettingsSpinnerPreference mSpinnerPreference;
@Before
@@ -53,7 +51,7 @@
final View rootView = inflater.inflate(mSpinnerPreference.getLayoutResource(),
new LinearLayout(mContext), false /* attachToRoot */);
mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
- mSpinner = (SettingsSpinner) mViewHolder.findViewById(R.id.spinner);
+ mSpinner = (Spinner) mViewHolder.findViewById(R.id.spinner);
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/PrimarySwitchPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/PrimarySwitchPreferenceTest.java
index 4e2b63b..9c16740 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/PrimarySwitchPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/PrimarySwitchPreferenceTest.java
@@ -53,13 +53,7 @@
mHolder = PreferenceViewHolder.createInstanceForTests(inflater.inflate(
com.android.settingslib.R.layout.preference_two_target, null));
mWidgetView = mHolder.itemView.findViewById(android.R.id.widget_frame);
- inflater.inflate(R.layout.restricted_preference_widget_primary_switch, mWidgetView, true);
- }
-
- @Test
- public void createNewPreference_shouldSetLayout() {
- assertThat(mPreference.getWidgetLayoutResource())
- .isEqualTo(R.layout.restricted_preference_widget_primary_switch);
+ inflater.inflate(R.layout.preference_widget_primary_switch, mWidgetView, true);
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
index f6affb8..1b63e3e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
@@ -30,6 +30,7 @@
import androidx.preference.PreferenceViewHolder;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -57,6 +58,7 @@
}
@Test
+ @Ignore
public void bindPreference_disabled_shouldDisplayDisabledSummary() {
final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS);
when(mViewHolder.itemView.findViewById(android.R.id.summary))
@@ -73,6 +75,7 @@
}
@Test
+ @Ignore
public void bindPreference_notDisabled_shouldNotHideSummary() {
final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS);
when(mViewHolder.itemView.findViewById(android.R.id.summary))
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java
index d7b366e..bb6b293 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java
@@ -206,9 +206,8 @@
when(config.isMandatoryCodec()).thenReturn(false);
when(config.getCodecType()).thenReturn(4);
- when(config.getCodecName()).thenReturn("LDAC");
assertThat(mProfile.getHighQualityAudioOptionLabel(mDevice)).isEqualTo(
- String.format(KNOWN_CODEC_LABEL, config.getCodecName()));
+ String.format(KNOWN_CODEC_LABEL, "LDAC"));
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
index d53a3e8..298ee90 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
@@ -28,6 +28,7 @@
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothUuid;
import android.content.Context;
+import android.os.Parcel;
import android.os.ParcelUuid;
import org.junit.Before;
@@ -60,9 +61,9 @@
private final static Map<Integer, ParcelUuid> CAP_GROUP2 =
Map.of(2, BluetoothUuid.CAP);
private final BluetoothClass DEVICE_CLASS_1 =
- new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES);
+ createBtClass(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES);
private final BluetoothClass DEVICE_CLASS_2 =
- new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE);
+ createBtClass(BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE);
@Mock
private LocalBluetoothProfileManager mLocalProfileManager;
@Mock
@@ -92,6 +93,16 @@
private HearingAidDeviceManager mHearingAidDeviceManager;
private Context mContext;
+ private BluetoothClass createBtClass(int deviceClass) {
+ Parcel p = Parcel.obtain();
+ p.writeInt(deviceClass);
+ p.setDataPosition(0); // reset position of parcel before passing to constructor
+
+ BluetoothClass bluetoothClass = BluetoothClass.CREATOR.createFromParcel(p);
+ p.recycle();
+ return bluetoothClass;
+ }
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java
index 7be176a..a8e6075 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java
@@ -28,6 +28,7 @@
import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
+import android.os.Parcel;
import org.junit.Before;
import org.junit.Test;
@@ -48,7 +49,7 @@
private final static String DEVICE_ADDRESS_1 = "AA:BB:CC:DD:EE:11";
private final static String DEVICE_ADDRESS_2 = "AA:BB:CC:DD:EE:22";
private final BluetoothClass DEVICE_CLASS =
- new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE);
+ createBtClass(BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE);
@Mock
private LocalBluetoothProfileManager mLocalProfileManager;
@Mock
@@ -67,6 +68,16 @@
private HearingAidDeviceManager mHearingAidDeviceManager;
private Context mContext;
+ private BluetoothClass createBtClass(int deviceClass) {
+ Parcel p = Parcel.obtain();
+ p.writeInt(deviceClass);
+ p.setDataPosition(0); // reset position of parcel before passing to constructor
+
+ BluetoothClass bluetoothClass = BluetoothClass.CREATOR.createFromParcel(p);
+ p.recycle();
+ return bluetoothClass;
+ }
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java
index e348865..bf07004 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -35,6 +36,7 @@
import java.util.Set;
@RunWith(RobolectricTestRunner.class)
+@Ignore
public class LicenseHtmlGeneratorFromXmlTest {
private static final String VALID_OLD_XML_STRING =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java
index 6f7f73a..c122a37 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java
@@ -31,6 +31,7 @@
import android.content.Context;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
+import android.os.Parcel;
import com.android.settingslib.bluetooth.A2dpProfile;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -65,9 +66,9 @@
private static final String ROUTER_ID_3 = "RouterId_3";
private static final String TEST_PACKAGE_NAME = "com.test.playmusic";
private final BluetoothClass mHeadreeClass =
- new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES);
+ createBtClass(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES);
private final BluetoothClass mCarkitClass =
- new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO);
+ createBtClass(BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO);
@Mock
private BluetoothDevice mDevice1;
@@ -118,6 +119,16 @@
private List<MediaDevice> mMediaDevices = new ArrayList<>();
private PhoneMediaDevice mPhoneMediaDevice;
+ private BluetoothClass createBtClass(int deviceClass) {
+ Parcel p = Parcel.obtain();
+ p.writeInt(deviceClass);
+ p.setDataPosition(0); // reset position of parcel before passing to constructor
+
+ BluetoothClass bluetoothClass = BluetoothClass.CREATOR.createFromParcel(p);
+ p.recycle();
+ return bluetoothClass;
+ }
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/EditUserInfoControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/EditUserInfoControllerTest.java
index a5ee4c3..f28572f 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/EditUserInfoControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/EditUserInfoControllerTest.java
@@ -39,6 +39,7 @@
import com.android.settingslib.R;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -54,6 +55,7 @@
import java.util.stream.Stream;
@RunWith(RobolectricTestRunner.class)
+@Ignore
public class EditUserInfoControllerTest {
private static final int MAX_USER_NAME_LENGTH = 100;
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java
index 3b7fbc7..c7e96bc 100644
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java
+++ b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java
@@ -69,7 +69,7 @@
}
@Implementation
- protected boolean removeActiveDevice(@BluetoothAdapter.ActiveDeviceUse int profiles) {
+ protected boolean removeActiveDevice(int profiles) {
if (profiles != ACTIVE_DEVICE_AUDIO && profiles != ACTIVE_DEVICE_PHONE_CALL
&& profiles != ACTIVE_DEVICE_ALL) {
return false;
@@ -78,8 +78,7 @@
}
@Implementation
- protected boolean setActiveDevice(BluetoothDevice device,
- @BluetoothAdapter.ActiveDeviceUse int profiles) {
+ protected boolean setActiveDevice(BluetoothDevice device, int profiles) {
if (device == null) {
return false;
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 7381e05..a2b6992 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -696,6 +696,14 @@
Settings.Global.MAX_ERROR_BYTES_PREFIX,
GlobalSettingsProto.MAX_ERROR_BYTES);
+ final long managedDeviceProvisioningToken =
+ p.start(GlobalSettingsProto.MANAGED_DEVICE_PROVISIONING);
+ dumpSetting(s, p,
+ Settings.Global.MANAGED_PROVISIONING_DEFER_PROVISIONING_TO_ROLE_HOLDER,
+ GlobalSettingsProto.ManagedDeviceProvisioning
+ .MANAGED_PROVISIONING_DEFER_PROVISIONING_TO_ROLE_HOLDER);
+ p.end(managedDeviceProvisioningToken);
+
final long euiccToken = p.start(GlobalSettingsProto.EUICC);
dumpSetting(s, p,
Settings.Global.EUICC_PROVISIONED,
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 2905429..3f4372b 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -594,6 +594,7 @@
Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
Settings.Global.CLOCKWORK_HOME_READY,
Settings.Global.WATCHDOG_TIMEOUT_MILLIS,
+ Settings.Global.MANAGED_PROVISIONING_DEFER_PROVISIONING_TO_ROLE_HOLDER,
Settings.Global.Wearable.BATTERY_SAVER_MODE,
Settings.Global.Wearable.COMBINED_LOCATION_ENABLED,
Settings.Global.Wearable.HAS_PAY_TOKENS,
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 741fe4f..1df326a 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -536,6 +536,9 @@
<uses-permission android:name="android.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
<uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
+ <!-- Permission needed for CTS test - ConcurrencyTest#testP2pExternalApprover
+ P2P external approver API sets require MANAGE_WIFI_AUTO_JOIN permission. -->
+ <uses-permission android:name="android.permission.MANAGE_WIFI_AUTO_JOIN" />
<!-- Permission required for CTS tests to enable/disable rate limiting toasts. -->
<uses-permission android:name="android.permission.MANAGE_TOAST_RATE_LIMITING" />
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 6b6aa71..ad6074a 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -886,12 +886,6 @@
android:singleUser="true"
android:permission="android.permission.BIND_DREAM_SERVICE" />
- <!-- Service for external clients to notify us of nearby media devices -->
- <!-- TODO(b/216313420): Export and guard with a permission. -->
- <service
- android:name=".media.nearby.NearbyMediaDevicesService"
- />
-
<receiver
android:name=".tuner.TunerService$ClearReceiver"
android:exported="false">
diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp
index 46adfeb..f7bcf1f 100644
--- a/packages/SystemUI/animation/Android.bp
+++ b/packages/SystemUI/animation/Android.bp
@@ -39,5 +39,5 @@
],
manifest: "AndroidManifest.xml",
- kotlincflags: ["-Xjvm-default=enable"],
+ kotlincflags: ["-Xjvm-default=all"],
}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
index 4540b77..c3f6a5d 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
@@ -48,9 +48,16 @@
* nicely into the starting window.
*/
class ActivityLaunchAnimator(
- private val launchAnimator: LaunchAnimator = LaunchAnimator(TIMINGS, INTERPOLATORS)
+ /** The animator used when animating a View into an app. */
+ private val launchAnimator: LaunchAnimator = LaunchAnimator(TIMINGS, INTERPOLATORS),
+
+ /** The animator used when animating a Dialog into an app. */
+ // TODO(b/218989950): Remove this animator and instead set the duration of the dim fade out to
+ // TIMINGS.contentBeforeFadeOutDuration.
+ private val dialogToAppAnimator: LaunchAnimator = LaunchAnimator(DIALOG_TIMINGS, INTERPOLATORS)
) {
companion object {
+ /** The timings when animating a View into an app. */
@JvmField
val TIMINGS = LaunchAnimator.Timings(
totalDuration = 500L,
@@ -60,6 +67,17 @@
contentAfterFadeInDuration = 183L
)
+ /**
+ * The timings when animating a Dialog into an app. We need to wait at least 200ms before
+ * showing the app (which is under the dialog window) so that the dialog window dim is fully
+ * faded out, to avoid flicker.
+ */
+ val DIALOG_TIMINGS = TIMINGS.copy(
+ contentBeforeFadeOutDuration = 200L,
+ contentAfterFadeInDelay = 200L
+ )
+
+ /** The interpolators when animating a View or a dialog into an app. */
val INTERPOLATORS = LaunchAnimator.Interpolators(
positionInterpolator = Interpolators.EMPHASIZED,
positionXInterpolator = createPositionXInterpolator(),
@@ -298,10 +316,17 @@
}
/**
+ * Whether this controller is controlling a dialog launch. This will be used to adapt the
+ * timings, making sure we don't show the app until the dialog dim had the time to fade out.
+ */
+ // TODO(b/218989950): Remove this.
+ val isDialogLaunch: Boolean
+ get() = false
+
+ /**
* The intent was started. If [willAnimate] is false, nothing else will happen and the
* animation will not be started.
*/
- @JvmDefault
fun onIntentStarted(willAnimate: Boolean) {}
/**
@@ -309,7 +334,6 @@
* this if the animation was already started, i.e. if [onLaunchAnimationStart] was called
* before the cancellation.
*/
- @JvmDefault
fun onLaunchAnimationCancelled() {}
}
@@ -317,7 +341,9 @@
inner class Runner(private val controller: Controller) : IRemoteAnimationRunner.Stub() {
private val launchContainer = controller.launchContainer
private val context = launchContainer.context
- private val transactionApplier = SyncRtSurfaceTransactionApplier(launchContainer)
+ private val transactionApplierView =
+ controller.openingWindowSyncView ?: controller.launchContainer
+ private val transactionApplier = SyncRtSurfaceTransactionApplier(transactionApplierView)
private val matrix = Matrix()
private val invertMatrix = Matrix()
@@ -405,6 +431,13 @@
val callback = this@ActivityLaunchAnimator.callback!!
val windowBackgroundColor = callback.getBackgroundColor(window.taskInfo)
+ // Make sure we use the modified timings when animating a dialog into an app.
+ val launchAnimator = if (controller.isDialogLaunch) {
+ dialogToAppAnimator
+ } else {
+ launchAnimator
+ }
+
// TODO(b/184121838): We should somehow get the top and bottom radius of the window
// instead of recomputing isExpandingFullyAbove here.
val isExpandingFullyAbove =
@@ -440,19 +473,29 @@
progress: Float,
linearProgress: Float
) {
- applyStateToWindow(window, state)
+ // Apply the state to the window only if it is visible, i.e. when the expanding
+ // view is *not* visible.
+ if (!state.visible) {
+ applyStateToWindow(window, state)
+ }
navigationBar?.let { applyStateToNavigationBar(it, state, linearProgress) }
+
listeners.forEach { it.onLaunchAnimationProgress(linearProgress) }
delegate.onLaunchAnimationProgress(state, progress, linearProgress)
}
}
- // We draw a hole when the additional layer is fading out to reveal the opening window.
animation = launchAnimator.startAnimation(
controller, endState, windowBackgroundColor, drawHole = true)
}
private fun applyStateToWindow(window: RemoteAnimationTarget, state: LaunchAnimator.State) {
+ if (transactionApplierView.viewRootImpl == null) {
+ // If the view root we synchronize with was detached, don't apply any transaction
+ // (as [SyncRtSurfaceTransactionApplier.scheduleApply] would otherwise throw).
+ return
+ }
+
val screenBounds = window.screenSpaceBounds
val centerX = (screenBounds.left + screenBounds.right) / 2f
val centerY = (screenBounds.top + screenBounds.bottom) / 2f
@@ -510,6 +553,12 @@
state: LaunchAnimator.State,
linearProgress: Float
) {
+ if (transactionApplierView.viewRootImpl == null) {
+ // If the view root we synchronize with was detached, don't apply any transaction
+ // (as [SyncRtSurfaceTransactionApplier.scheduleApply] would otherwise throw).
+ return
+ }
+
val fadeInProgress = LaunchAnimator.getProgress(TIMINGS, linearProgress,
ANIMATION_DELAY_NAV_FADE_IN, ANIMATION_DURATION_NAV_FADE_OUT)
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt
index 3051d80..a3c5649 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt
@@ -19,7 +19,6 @@
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
-import android.app.ActivityManager
import android.app.Dialog
import android.graphics.Color
import android.graphics.Rect
@@ -28,12 +27,12 @@
import android.util.Log
import android.util.MathUtils
import android.view.GhostView
-import android.view.SurfaceControl
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
-import android.view.ViewRootImpl
+import android.view.WindowInsets
import android.view.WindowManager
+import android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
import android.widget.FrameLayout
import kotlin.math.roundToInt
@@ -42,12 +41,17 @@
/**
* A class that allows dialogs to be started in a seamless way from a view that is transforming
* nicely into the starting dialog.
+ *
+ * This animator also allows to easily animate a dialog into an activity.
+ *
+ * @see showFromView
+ * @see showFromDialog
+ * @see createActivityLaunchController
*/
class DialogLaunchAnimator @JvmOverloads constructor(
private val dreamManager: IDreamManager,
private val launchAnimator: LaunchAnimator = LaunchAnimator(TIMINGS, INTERPOLATORS),
- // TODO(b/217621394): Remove special handling for low-RAM devices after animation sync is fixed
- private var forceDisableSynchronization: Boolean = ActivityManager.isLowRamDeviceStatic()
+ private val isForTesting: Boolean = false
) {
private companion object {
private val TIMINGS = ActivityLaunchAnimator.TIMINGS
@@ -113,7 +117,7 @@
dialog = dialog,
animateBackgroundBoundsChange,
animatedParent,
- forceDisableSynchronization
+ isForTesting
)
openedDialogs.add(animatedDialog)
@@ -141,6 +145,100 @@
}
/**
+ * Create an [ActivityLaunchAnimator.Controller] that can be used to launch an activity from the
+ * dialog that contains [View]. Note that the dialog must have been show using [showFromView]
+ * and be currently showing, otherwise this will return null.
+ *
+ * The returned controller will take care of dismissing the dialog at the right time after the
+ * activity started, when the dialog to app animation is done (or when it is cancelled). If this
+ * method returns null, then the dialog won't be dismissed.
+ *
+ * @param view any view inside the dialog to animate.
+ */
+ @JvmOverloads
+ fun createActivityLaunchController(
+ view: View,
+ cujType: Int? = null
+ ): ActivityLaunchAnimator.Controller? {
+ val animatedDialog = openedDialogs
+ .firstOrNull { it.dialog.window.decorView.viewRootImpl == view.viewRootImpl }
+ ?: return null
+
+ // At this point, we know that the intent of the caller is to dismiss the dialog to show
+ // an app, so we disable the exit animation into the touch surface because we will never
+ // want to run it anyways.
+ animatedDialog.exitAnimationDisabled = true
+
+ val dialog = animatedDialog.dialog
+
+ // Don't animate if the dialog is not showing.
+ if (!dialog.isShowing) {
+ return null
+ }
+
+ val dialogContentWithBackground = animatedDialog.dialogContentWithBackground ?: return null
+ val controller =
+ ActivityLaunchAnimator.Controller.fromView(dialogContentWithBackground, cujType)
+ ?: return null
+
+ // Wrap the controller into one that will instantly dismiss the dialog when the animation is
+ // done or dismiss it normally (fading it out) if the animation is cancelled.
+ return object : ActivityLaunchAnimator.Controller by controller {
+ override val isDialogLaunch = true
+
+ override fun onIntentStarted(willAnimate: Boolean) {
+ controller.onIntentStarted(willAnimate)
+
+ if (!willAnimate) {
+ dialog.dismiss()
+ }
+ }
+
+ override fun onLaunchAnimationCancelled() {
+ controller.onLaunchAnimationCancelled()
+ enableDialogDismiss()
+ dialog.dismiss()
+ }
+
+ override fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) {
+ controller.onLaunchAnimationStart(isExpandingFullyAbove)
+
+ // Make sure the dialog is not dismissed during the animation.
+ disableDialogDismiss()
+
+ // If this dialog was shown from a cascade of other dialogs, make sure those ones
+ // are dismissed too.
+ animatedDialog.touchSurface = animatedDialog.prepareForStackDismiss()
+
+ // Remove the dim.
+ dialog.window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
+ }
+
+ override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {
+ controller.onLaunchAnimationEnd(isExpandingFullyAbove)
+
+ // Hide the dialog then dismiss it to instantly dismiss it without playing the
+ // animation.
+ dialog.hide()
+ enableDialogDismiss()
+ dialog.dismiss()
+ }
+
+ private fun disableDialogDismiss() {
+ dialog.setDismissOverride { /* Do nothing */ }
+ }
+
+ private fun enableDialogDismiss() {
+ // We don't set the override to null given that [AnimatedDialog.OnDialogDismissed]
+ // will still properly dismiss the dialog but will also make sure to clean up
+ // everything (like making sure that the touched view that triggered the dialog is
+ // made VISIBLE again).
+ dialog.setDismissOverride(animatedDialog::onDialogDismissed)
+ }
+ }
+ }
+
+ /**
* Ensure that all dialogs currently shown won't animate into their touch surface when
* dismissed.
*
@@ -358,6 +456,21 @@
// Make sure the dialog is visible instantly and does not do any window animation.
window.attributes.windowAnimations = R.style.Animation_LaunchAnimation
+ // Ensure that the animation is not clipped by the display cut-out when animating this
+ // dialog into an app.
+ window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+ window.attributes = window.attributes
+
+ // We apply the insets ourselves to make sure that the paddings are set on the correct
+ // View.
+ window.setDecorFitsSystemWindows(false)
+ val viewWithInsets = (dialogContentWithBackground.parent as ViewGroup)
+ viewWithInsets.setOnApplyWindowInsetsListener { view, windowInsets ->
+ val insets = windowInsets.getInsets(WindowInsets.Type.displayCutout())
+ view.setPadding(insets.left, insets.top, insets.right, insets.bottom)
+ WindowInsets.CONSUMED
+ }
+
// Start the animation once the background view is properly laid out.
dialogContentWithBackground.addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
override fun onLayoutChange(
@@ -421,45 +534,12 @@
* (or inversely, removed from the UI when the touch surface is made visible).
*/
private fun synchronizeNextDraw(then: () -> Unit) {
- if (forceDisableSynchronization ||
- !touchSurface.isAttachedToWindow || touchSurface.viewRootImpl == null ||
- !decorView.isAttachedToWindow || decorView.viewRootImpl == null) {
- // No need to synchronize if either the touch surface or dialog view is not attached
- // to a window.
+ if (forceDisableSynchronization) {
then()
return
}
- // Consume the next frames of both view roots to make sure the ghost view is drawn at
- // exactly the same time as when the touch surface is made invisible.
- var remainingTransactions = 0
- val mergedTransactions = SurfaceControl.Transaction()
-
- fun onTransaction(transaction: SurfaceControl.Transaction?) {
- remainingTransactions--
- transaction?.let { mergedTransactions.merge(it) }
-
- if (remainingTransactions == 0) {
- mergedTransactions.apply()
- then()
- }
- }
-
- fun consumeNextDraw(viewRootImpl: ViewRootImpl) {
- if (viewRootImpl.consumeNextDraw(::onTransaction)) {
- remainingTransactions++
-
- // Make sure we trigger a traversal.
- viewRootImpl.view.invalidate()
- }
- }
-
- consumeNextDraw(touchSurface.viewRootImpl)
- consumeNextDraw(decorView.viewRootImpl)
-
- if (remainingTransactions == 0) {
- then()
- }
+ ViewRootSync.synchronizeNextDraw(touchSurface, decorView, then)
}
private fun findFirstViewGroupWithBackground(view: View): ViewGroup? {
@@ -523,7 +603,7 @@
)
}
- private fun onDialogDismissed() {
+ fun onDialogDismissed() {
if (Looper.myLooper() != Looper.getMainLooper()) {
dialog.context.mainExecutor.execute { onDialogDismissed() }
return
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt
index 77386cf..a4c5c30 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt
@@ -77,8 +77,8 @@
* This will be used to:
* - Get the associated [Context].
* - Compute whether we are expanding fully above the launch container.
- * - Apply surface transactions in sync with RenderThread when animating an activity
- * launch.
+ * - Get to overlay to which we initially put the window background layer, until the
+ * opening window is made visible (see [openingWindowSyncView]).
*
* This container can be changed to force this [Controller] to animate the expanding view
* inside a different location, for instance to ensure correct layering during the
@@ -87,6 +87,18 @@
var launchContainer: ViewGroup
/**
+ * The [View] with which the opening app window should be synchronized with once it starts
+ * to be visible.
+ *
+ * We will also move the window background layer to this view's overlay once the opening
+ * window is visible.
+ *
+ * If null, this will default to [launchContainer].
+ */
+ val openingWindowSyncView: View?
+ get() = null
+
+ /**
* Return the [State] of the view that will be animated. We will animate from this state to
* the final window state.
*
@@ -100,11 +112,9 @@
* needed for the animation. [isExpandingFullyAbove] will be true if the window is expanding
* fully above the [launchContainer].
*/
- @JvmDefault
fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) {}
/** The animation made progress and the expandable view [state] should be updated. */
- @JvmDefault
fun onLaunchAnimationProgress(state: State, progress: Float, linearProgress: Float) {}
/**
@@ -112,7 +122,6 @@
* called previously. This is typically used to clean up the resources initialized when the
* animation was started.
*/
- @JvmDefault
fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {}
}
@@ -154,7 +163,7 @@
}
/** The timings (durations and delays) used by this animator. */
- class Timings(
+ data class Timings(
/** The total duration of the animation. */
val totalDuration: Long,
@@ -257,8 +266,17 @@
animator.duration = timings.totalDuration
animator.interpolator = LINEAR
+ // Whether we should move the [windowBackgroundLayer] into the overlay of
+ // [Controller.openingWindowSyncView] once the opening app window starts to be visible.
+ val openingWindowSyncView = controller.openingWindowSyncView
+ val openingWindowSyncViewOverlay = openingWindowSyncView?.overlay
+ val moveBackgroundLayerWhenAppIsVisible = openingWindowSyncView != null &&
+ openingWindowSyncView.viewRootImpl != controller.launchContainer.viewRootImpl
+
val launchContainerOverlay = launchContainer.overlay
var cancelled = false
+ var movedBackgroundLayer = false
+
animator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?, isReverse: Boolean) {
if (DEBUG) {
@@ -278,6 +296,10 @@
}
controller.onLaunchAnimationEnd(isExpandingFullyAbove)
launchContainerOverlay.remove(windowBackgroundLayer)
+
+ if (moveBackgroundLayerWhenAppIsVisible) {
+ openingWindowSyncViewOverlay?.remove(windowBackgroundLayer)
+ }
}
})
@@ -318,11 +340,29 @@
timings.contentBeforeFadeOutDuration
) < 1
+ if (moveBackgroundLayerWhenAppIsVisible && !state.visible && !movedBackgroundLayer) {
+ // The expanding view is not visible, so the opening app is visible. If this is the
+ // first frame when it happens, trigger a one-off sync and move the background layer
+ // in its new container.
+ movedBackgroundLayer = true
+
+ launchContainerOverlay.remove(windowBackgroundLayer)
+ openingWindowSyncViewOverlay!!.add(windowBackgroundLayer)
+
+ ViewRootSync.synchronizeNextDraw(launchContainer, openingWindowSyncView, then = {})
+ }
+
+ val container = if (movedBackgroundLayer) {
+ openingWindowSyncView!!
+ } else {
+ controller.launchContainer
+ }
+
applyStateToWindowBackgroundLayer(
windowBackgroundLayer,
state,
linearProgress,
- launchContainer,
+ container,
drawHole
)
controller.onLaunchAnimationProgress(state, progress, linearProgress)
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ViewRootSync.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewRootSync.kt
new file mode 100644
index 0000000..5b3e45c
--- /dev/null
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewRootSync.kt
@@ -0,0 +1,75 @@
+package com.android.systemui.animation
+
+import android.app.ActivityManager
+import android.view.SurfaceControl
+import android.view.View
+import android.view.ViewRootImpl
+
+/** A util class to synchronize 2 view roots. */
+// TODO(b/200284684): Remove this class.
+object ViewRootSync {
+ // TODO(b/217621394): Remove special handling for low-RAM devices after animation sync is fixed
+ private val forceDisableSynchronization = ActivityManager.isLowRamDeviceStatic()
+
+ /**
+ * Synchronize the next draw between the view roots of [view] and [otherView], then run [then].
+ *
+ * Note that in some cases, the synchronization might not be possible (e.g. WM consumed the
+ * next transactions) or disabled (temporarily, on low ram devices). In this case, [then] will
+ * be called without synchronizing.
+ */
+ fun synchronizeNextDraw(
+ view: View,
+ otherView: View,
+ then: () -> Unit
+ ) {
+ if (forceDisableSynchronization ||
+ !view.isAttachedToWindow || view.viewRootImpl == null ||
+ !otherView.isAttachedToWindow || otherView.viewRootImpl == null ||
+ view.viewRootImpl == otherView.viewRootImpl) {
+ // No need to synchronize if either the touch surface or dialog view is not attached
+ // to a window.
+ then()
+ return
+ }
+
+ // Consume the next frames of both view roots to make sure the ghost view is drawn at
+ // exactly the same time as when the touch surface is made invisible.
+ var remainingTransactions = 0
+ val mergedTransactions = SurfaceControl.Transaction()
+
+ fun onTransaction(transaction: SurfaceControl.Transaction?) {
+ remainingTransactions--
+ transaction?.let { mergedTransactions.merge(it) }
+
+ if (remainingTransactions == 0) {
+ mergedTransactions.apply()
+ then()
+ }
+ }
+
+ fun consumeNextDraw(viewRootImpl: ViewRootImpl) {
+ if (viewRootImpl.consumeNextDraw(::onTransaction)) {
+ remainingTransactions++
+
+ // Make sure we trigger a traversal.
+ viewRootImpl.view.invalidate()
+ }
+ }
+
+ consumeNextDraw(view.viewRootImpl)
+ consumeNextDraw(otherView.viewRootImpl)
+
+ if (remainingTransactions == 0) {
+ then()
+ }
+ }
+
+ /**
+ * A Java-friendly API for [synchronizeNextDraw].
+ */
+ @JvmStatic
+ fun synchronizeNextDraw(view: View, otherView: View, then: Runnable) {
+ synchronizeNextDraw(view, otherView, then::run)
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
index 208825c..d8b050a 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
+++ b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
@@ -76,14 +76,14 @@
enum class Style(internal val coreSpec: CoreSpec) {
SPRITZ(CoreSpec(
- a1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0)),
- a2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0)),
- a3 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0)),
+ a1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 12.0)),
+ a2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 8.0)),
+ a3 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 16.0)),
n1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0)),
- n2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0))
+ n2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 8.0))
)),
TONAL_SPOT(CoreSpec(
- a1 = TonalSpec(chroma = Chroma(ChromaStrategy.GTE, 48.0)),
+ a1 = TonalSpec(chroma = Chroma(ChromaStrategy.GTE, 32.0)),
a2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 16.0)),
a3 = TonalSpec(Hue(HueStrategy.ADD, 60.0), Chroma(ChromaStrategy.EQ, 24.0)),
n1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0)),
@@ -91,17 +91,17 @@
)),
VIBRANT(CoreSpec(
a1 = TonalSpec(chroma = Chroma(ChromaStrategy.GTE, 48.0)),
- a2 = TonalSpec(Hue(HueStrategy.ADD, 10.0), Chroma(ChromaStrategy.EQ, 24.0)),
- a3 = TonalSpec(Hue(HueStrategy.ADD, 20.0), Chroma(ChromaStrategy.GTE, 32.0)),
+ a2 = TonalSpec(Hue(HueStrategy.ADD, 15.0), Chroma(ChromaStrategy.EQ, 24.0)),
+ a3 = TonalSpec(Hue(HueStrategy.ADD, 30.0), Chroma(ChromaStrategy.GTE, 32.0)),
n1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 8.0)),
n2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 16.0))
)),
EXPRESSIVE(CoreSpec(
- a1 = TonalSpec(Hue(HueStrategy.SUBTRACT, 40.0), Chroma(ChromaStrategy.GTE, 64.0)),
- a2 = TonalSpec(Hue(HueStrategy.ADD, 20.0), Chroma(ChromaStrategy.EQ, 24.0)),
- a3 = TonalSpec(Hue(HueStrategy.SUBTRACT, 80.0), Chroma(ChromaStrategy.GTE, 64.0)),
- n1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 16.0)),
- n2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 32.0))
+ a1 = TonalSpec(Hue(HueStrategy.SUBTRACT, 60.0), Chroma(ChromaStrategy.GTE, 64.0)),
+ a2 = TonalSpec(Hue(HueStrategy.SUBTRACT, 30.0), Chroma(ChromaStrategy.EQ, 24.0)),
+ a3 = TonalSpec(chroma = Chroma(ChromaStrategy.GTE, 48.0)),
+ n1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 12.0)),
+ n2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 16.0))
)),
RAINBOW(CoreSpec(
a1 = TonalSpec(chroma = Chroma(ChromaStrategy.GTE, 48.0)),
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
index ffee894..d4b4a74 100644
--- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
+++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
@@ -20,7 +20,7 @@
import android.app.smartspace.SmartspaceAction;
import android.app.smartspace.SmartspaceTarget;
import android.app.smartspace.SmartspaceTargetEvent;
-import android.app.smartspace.uitemplatedata.SmartspaceTapAction;
+import android.app.smartspace.uitemplatedata.TapAction;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.drawable.Drawable;
@@ -144,7 +144,7 @@
}
}
- default void startFromAction(SmartspaceTapAction action, View v, boolean showOnLockscreen) {
+ default void startFromAction(TapAction action, View v, boolean showOnLockscreen) {
try {
if (action.getIntent() != null) {
startIntent(v, action.getIntent(), showOnLockscreen);
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
index 757ed76..b33c544 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
@@ -91,6 +91,9 @@
* areas, false otherwise
*/
static boolean isInAreas(ArrayList<Rect> areas, View view) {
+ if (areas.isEmpty()) {
+ return true;
+ }
for (Rect area : areas) {
if (isInArea(area, view)) {
return true;
diff --git a/packages/SystemUI/res-keyguard/layout/footer_actions.xml b/packages/SystemUI/res-keyguard/layout/footer_actions.xml
index 339cab4..fb401ee 100644
--- a/packages/SystemUI/res-keyguard/layout/footer_actions.xml
+++ b/packages/SystemUI/res-keyguard/layout/footer_actions.xml
@@ -77,16 +77,6 @@
android:src="@drawable/ic_settings"
android:tint="?android:attr/textColorPrimary" />
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:id="@+id/tuner_icon"
- android:layout_width="8dp"
- android:layout_height="8dp"
- android:layout_gravity="center_horizontal|bottom"
- android:layout_marginBottom="@dimen/qs_footer_icon_padding"
- android:src="@drawable/tuner"
- android:tint="?android:attr/textColorTertiary"
- android:visibility="invisible" />
-
</com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
</com.android.systemui.qs.FooterActionsView>
\ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml b/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml
index 4884df7..59712c0 100644
--- a/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml
+++ b/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml
@@ -78,16 +78,6 @@
android:src="@drawable/ic_settings"
android:tint="?android:attr/textColorPrimary" />
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:id="@+id/tuner_icon"
- android:layout_width="8dp"
- android:layout_height="8dp"
- android:layout_gravity="center_horizontal|bottom"
- android:layout_marginBottom="@dimen/qs_footer_icon_padding"
- android:src="@drawable/tuner"
- android:tint="?android:attr/textColorTertiary"
- android:visibility="invisible" />
-
</com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
<com.android.systemui.statusbar.AlphaOptimizedImageView
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index f774251..f2ad66d 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Wagwoord word vir bykomende sekuriteit vereis"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Toestel is deur administrateur gesluit"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Toestel is handmatig gesluit"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nie herken nie"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie herken nie"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Skakel "<b>"kameratoegang"</b>" in Instellings > Privaatheid aan om Gesigslot te gebruik"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index 465f25c..7f4f6fd 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"የይለፍ ቃል ለተጨማሪ ደህንነት ያስፈልጋል"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"መሣሪያ በአስተዳዳሪ ተቆልፏል"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"መሣሪያ በተጠቃሚው ራሱ ተቆልፏል"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"አልታወቀም"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"አልታወቀም"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"በመልክ መክፈትን ለመጠቀም "<b>"የካሜራ መዳረሻ"</b>"ን በቅንብሮች እና ግላዊነት ውስጥ ያብሩ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index 653e6d3..5d7ac0d 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -97,7 +97,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"يجب إدخال كلمة المرور لمزيد من الأمان"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"اختار المشرف قفل الجهاز"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"تم حظر الجهاز يدويًا"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"لم يتم التعرف عليها."</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"لم يتم التعرّف عليه."</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"لاستخدام ميزة \"فتح الجهاز بالتعرف على الوجه\"، عليك منح إذن "<b>"الوصول إلى الكاميرا"</b>" في الإعدادات > الخصوصية."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 82abbfd..a59d4c9 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"অতিৰিক্ত সুৰক্ষাৰ বাবে পাছৱর্ড দিয়াটো বাধ্যতামূলক"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্ৰশাসকে ডিভাইচ লক কৰি ৰাখিছে"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"চিনাক্ত কৰিব পৰা নাই"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"চিনাক্ত কৰিব পৰা নাই"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ফেচ আনলক সুবিধাটো ব্যৱহাৰ কৰিবলৈ ছেটিং > গোপনীয়তাত "<b>"কেমেৰাৰ এক্সেছ"</b>" অন কৰক"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index f908851..71fd47b 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Əlavə təhlükəsizlik üçün parol tələb olunur"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz admin tərəfindən kilidlənib"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihaz əl ilə kilidləndi"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tanınmır"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmır"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Üz ilə Kiliddən Açma funksiyasını istifadə etmək üçün Ayarlar > Məxfilik bölməsində "<b>"Kameraya girişi"</b>" aktiv edin"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index bdf1648..c04a766 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -91,7 +91,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Treba da unesete lozinku radi dodatne bezbednosti"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nije prepoznat"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznat"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da biste koristili otključavanje licem, uključite "<b>"pristup kameri"</b>" u odeljku Podešavanja > Privatnost"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 8fc6a6b..eda5497f 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Для забеспячэння дадатковай бяспекі патрабуецца пароль"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Прылада заблакіравана адміністратарам"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Прылада была заблакіравана ўручную"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не распазнана"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распазнана"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Каб выкарыстоўваць распазнаванне твару, уключыце "<b>"доступ да камеры"</b>" праз раздзел \"Налады > Прыватнасць\""</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 62a9ec6..dcf0a05 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"За допълнителна сигурност се изисква парола"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Устройството е заключено от администратора"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройството бе заключено ръчно"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не е разпознато"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не е разпознато"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"За да използвате функцията „Отключване с лице“, включете "<b>"достъпа до камерата"</b>" от „Настройки > Поверителност“"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 160442a..f96db50 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"অতিরিক্ত সুরক্ষার জন্য পাসওয়ার্ড দেওয়া প্রয়োজন"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্রশাসক ডিভাইসটি লক করেছেন"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইসটিকে ম্যানুয়ালি লক করা হয়েছে"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"শনাক্ত করা যায়নি"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"শনাক্ত করা যায়নি"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"\'ফেস আনলক\' ফিচার ব্যবহার করতে \'সেটিংস ও গোপনীয়তা\' বিকল্পে গিয়ে "<b>"ক্যামেরায় অ্যাক্সেস দিন"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 99f796c..4a47157 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -91,7 +91,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Lozinka je potrebna radi dodatne sigurnosti"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Uređaj je zaključao administrator"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nije prepoznato"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da koristite otključavanje licem, uključite "<b>"Pristup kameri"</b>" u meniju Postavke > Privatnost"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index fca5f12..9cc855a 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Cal introduir la contrasenya per disposar de més seguretat"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'administrador ha bloquejat el dispositiu"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositiu s\'ha bloquejat manualment"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"No s\'ha reconegut"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"No s\'ha reconegut"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Per utilitzar Desbloqueig facial, activa "<b>"Accés a la càmera"</b>" a Configuració > Privadesa"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index 363601a..606bff5 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Pro ještě lepší zabezpečení je vyžadováno heslo"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zařízení je uzamknuto administrátorem"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zařízení bylo ručně uzamčeno"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nerozpoznáno"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznáno"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pokud chcete používat odemknutí obličejem, v Nastavení > Soukromí zapnetě "<b>"přístup k fotoaparátu"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index 38bcfb1..8f7b8d0 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Der kræves en adgangskode som ekstra beskyttelse"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheden er blevet låst af administratoren"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheden blev låst manuelt"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ikke genkendt"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke genkendt"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Hvis du vil bruge ansigtslåsen, skal du aktivere "<b>"Kameraadgang"</b>" under Indstillinger > Privatliv"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 5f12183..6391ed0 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Zur Verbesserung der Sicherheit ist ein Passwort erforderlich"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Gerät vom Administrator gesperrt"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Gerät manuell gesperrt"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nicht erkannt"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nicht erkannt"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Wenn du die Entsperrung per Gesichtserkennung verwenden möchtest, aktiviere in den Einstellungen unter „Datenschutz“ die Option "<b>"Kamerazugriff"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 4783b3c..a5bbb9a 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Απαιτείται κωδικός πρόσβασης για πρόσθετη ασφάλεια"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Η συσκευή κλειδώθηκε από τον διαχειριστή"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Η συσκευή κλειδώθηκε με μη αυτόματο τρόπο"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Δεν αναγνωρίστηκε"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Δεν αναγνωρίστηκε"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Για να χρησιμοποιήσετε τη λειτουργία Ξεκλείδωμα με το πρόσωπο, ενεργοποιήστε την επιλογή "<b>"Πρόσβαση στην κάμερα"</b>" από το μενού Ρυθμίσεις > Απόρρητο"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index 702abca..abfe5be 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Password required for additional security"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 533d768..69bcf89 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Password required for additional security"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index 702abca..abfe5be 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Password required for additional security"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index 702abca..abfe5be 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Password required for additional security"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index 3cc356a..804b6ae 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Password required for additional security"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognized"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognized"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index b80978f..d9adc7c 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Se requiere la contraseña por razones de seguridad"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se bloqueó de forma manual"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"No se reconoció"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoció"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar Desbloqueo facial, activa el "<b>"Acceso a la cámara"</b>" en Configuración y privacidad"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index a23b41a..3702be2 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Debes introducir la contraseña como medida de seguridad adicional"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se ha bloqueado manualmente"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"No se reconoce"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoce"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar Desbloqueo Facial, habilita el "<b>"acceso a la cámara"</b>" en Ajustes y privacidad"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index 5b1791f..9488054 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Lisaturvalisuse huvides tuleb sisestada parool"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administraator lukustas seadme"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Seade lukustati käsitsi"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ei tuvastatud"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tuvastatud"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Näoga avamise kasutamiseks lülitage menüüs Seaded > Privaatsus sisse "<b>"juurdepääs kaamerale"</b>"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index 5a4a9ef..41d467a 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Pasahitza behar da gailua babestuago izateko"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratzaileak blokeatu egin du gailua"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Eskuz blokeatu da gailua"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ez da ezagutu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ez da ezagutu"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu "<b>"kamera atzitzeko baimena"</b>" Ezarpenak > Pribatutasuna atalean"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index a76c979..9d77608 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"برای ایمنی بیشتر باید گذرواژه وارد شود"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"دستگاه توسط سرپرست سیستم قفل شده است"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"دستگاه بهصورت دستی قفل شده است"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"شناسایی نشد"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"شناسایی نشد"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"برای استفاده از «قفلگشایی با چهره»، "<b>"دسترسی به دوربین"</b>" را در «تنظیمات > حریمخصوصی» روشن کنید"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 5cdcf97..2fbb8ab 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Salasana vaaditaan suojauksen parantamiseksi."</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Järjestelmänvalvoja lukitsi laitteen."</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Laite lukittiin manuaalisesti"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ei tunnistettu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tunnistettu"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Jos haluat käyttää kasvojentunnistusavausta, valitse Asetukset > Yksityisyys ja laita "<b>"Pääsy kameraan"</b>" päälle"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index fadb4d9..da81aa3 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Le mot de passe est exigé pour plus de sécurité"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'appareil a été verrouillé par l\'administrateur"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"L\'appareil a été verrouillé manuellement"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Doigt non reconnu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Doigt non reconnu"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pour utiliser le déverrouillage par reconnaissance faciale, activez l\'"<b>"accès à l\'appareil photo"</b>" dans Paramètres > Confidentialité"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index b7edf05..b34ae8c 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Veuillez saisir le mot de passe pour renforcer la sécurité"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Appareil verrouillé par l\'administrateur"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Appareil verrouillé manuellement"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Non reconnu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Non reconnu"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pour utiliser Face Unlock, activez "<b>"Accès à l\'appareil photo"</b>" dans Paramètres > Confidentialité"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 7c2320d..b1c14fe5 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"É necesario o contrasinal para obter seguranza adicional"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"O administrador bloqueou o dispositivo"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo bloqueouse manualmente"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Non se recoñeceu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Non se recoñeceu"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o desbloqueo facial, activa "<b>"Acceso á cámara"</b>" en Configuración > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 4115d68..5dc4a1c 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"વધારાની સુરક્ષા માટે પાસવર્ડ જરૂરી છે"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"વ્યવસ્થાપકે ઉપકરણ લૉક કરેલું છે"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ઉપકરણ મેન્યુઅલી લૉક કર્યું હતું"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ઓળખાયેલ નથી"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ઓળખાયેલ નથી"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ફેસ અનલૉક સુવિધાનો ઉપયોગ કરવા માટે, સેટિંગ > પ્રાઇવસીમાં જઈને "<b>"કૅમેરા ઍક્સેસ"</b>" ચાલુ કરો"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index ecc5050..69a9dc9 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"अतिरिक्त सुरक्षा के लिए पासवर्ड ज़रूरी है"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"व्यवस्थापक ने डिवाइस को लॉक किया है"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिवाइस को मैन्युअल रूप से लॉक किया गया था"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"पहचान नहीं हो पाई"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"पहचान नहीं हो पाई"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फ़ेस अनलॉक की सुविधा का इस्तेमाल करने के लिए, सेटिंग और निजता में जाकर, "<b>"कैमरे का ऐक्सेस"</b>" चालू करें"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 5d02bba..de660d8 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -91,7 +91,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Unesite zaporku radi dodatne sigurnosti"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nije prepoznat"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da biste koristili otključavanje licem, uključite opciju "<b>"Pristup kameri"</b>" u odjeljku Postavke > Privatnost"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 77d57c4..8854740 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"A nagyobb biztonság érdekében jelszó szükséges"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"A rendszergazda zárolta az eszközt"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Az eszközt manuálisan lezárták"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nem ismerhető fel"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nem ismerhető fel"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Az Arcalapú feloldás funkció használatához kapcsolja be a "<b>"Hozzáférés a kamerához"</b>" beállítást a Beállítások > Adatvédelem szakaszban."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index fb1901a..94fdedd 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Անվտանգության նկատառումներից ելնելով անհրաժեշտ է մուտքագրել գաղտնաբառը"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Սարքը կողպված է ադմինիստրատորի կողմից"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Սարքը կողպվել է ձեռքով"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Չհաջողվեց ճանաչել"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Չհաջողվեց ճանաչել"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Դեմքով ապակողպումն օգտագործելու համար անցեք Կարգավորումներ > Գաղտնիություն և տրամադրեք "<b>"տեսախցիկն օգտագործելու թույլտվություն"</b>"։"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index e4e4d1c..b16031a 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Sandi diperlukan untuk keamanan tambahan"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Perangkat dikunci oleh admin"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Perangkat dikunci secara manual"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tidak dikenali"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Untuk menggunakan Face Unlock, aktifkan "<b>"Akses kamera"</b>" di Setelan > Privasi"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index ff6bbee..8f6b18b 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Aðgangsorðs er krafist af öryggisástæðum"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Kerfisstjóri læsti tæki"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Tækinu var læst handvirkt"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Þekktist ekki"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Þekktist ekki"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Þú verður að kveikja á "<b>"aðgangi að myndavél"</b>" í „Stillingar > persónuvernd“ til að nota andlitskenni"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 7ce2545..06db7b7 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Password obbligatoria per maggiore sicurezza"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloccato dall\'amministratore"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Il dispositivo è stato bloccato manualmente"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Non riconosciuto"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Non riconosciuto"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Per utilizzare lo sblocco con il volto, attiva "<b>"l\'accesso alla fotocamera"</b>" in Impostazioni > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 2551e22..ce43b15 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"יש להזין סיסמה כדי להגביר את רמת האבטחה"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"המנהל של המכשיר נהל אותו"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"המכשיר ננעל באופן ידני"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"לא זוהתה"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"לא זוהתה"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"כדי להשתמש בתכונה \'פתיחה ע\"י זיהוי הפנים\', יש להפעיל את ה"<b>"גישה למצלמה"</b>" בהגדרות > פרטיות"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index fca4549..07b3c87 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"追加の確認のためパスワードが必要です"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"デバイスは管理者によりロックされています"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"デバイスは手動でロックされました"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"認識されませんでした"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"認識されませんでした"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"顔認証を使用するには、[設定] > [プライバシー] で"<b>"カメラへのアクセス"</b>"を有効にしてください"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index c366abe..f2341c6 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"დამატებითი უსაფრთხოებისთვის საჭიროა პაროლის შეყვანა"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"მოწყობილობა ჩაკეტილია ადმინისტრატორის მიერ"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"მოწყობილობა ხელით ჩაიკეტა"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"არ არის ამოცნობილი"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"არ არის ამოცნობილი"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"იმისთვის, რომ სახით განბლოკვით ისარგებლოთ, ჩართეთ "<b>"კამერაზე წვდომა"</b>" პარამეტრებსა და კონფიდენციალურობაში"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index 779fa44..20bba0f 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Қауіпсіздікті күшейту үшін құпия сөзді енгізу қажет"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Құрылғыны әкімші құлыптаған"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Құрылғы қолмен құлыпталды"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Танылмады"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Танылмады"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Face Unlock функциясын пайдалану үшін \"Параметрлер > Құпиялылық\" бөлімінен "<b>"Камераны пайдалану рұқсатын"</b>" қосыңыз."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 1a1f808..236c318 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"តម្រូវឲ្យបញ្ចូលពាក្យសម្ងាត់ ដើម្បីទទួលបានសុវត្ថិភាពបន្ថែម"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកគ្រប់គ្រង"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកប្រើផ្ទាល់"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"មិនអាចសម្គាល់បានទេ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"មិនអាចសម្គាល់បានទេ"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ដើម្បីប្រើមុខងារដោះសោតាមទម្រង់មុខ សូមបើក"<b>"ការចូលប្រើកាមេរ៉ា"</b>"នៅក្នុងការកំណត់ > ឯកជនភាព"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 0eb48c5..716cbf6 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ನಿರ್ವಾಹಕರು ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಿದ್ದಾರೆ"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ಸಾಧನವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಬಳಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳು > ಗೌಪ್ಯತೆ ಎಂಬಲ್ಲಿ "<b>"ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು"</b>" ಆನ್ ಮಾಡಿ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 168752c..e698017 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"보안 강화를 위해 비밀번호가 필요합니다."</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"관리자가 기기를 잠갔습니다."</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"기기가 수동으로 잠금 설정되었습니다."</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"인식할 수 없음"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"인식할 수 없음"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"얼굴 인식 잠금 해제를 사용하려면 설정 > 개인 정보 보호에서 "<b>"카메라 액세스"</b>"를 사용 설정하세요."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 14bee97..1df29e1b 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Коопсуздукту бекемдөө үчүн сырсөз талап кылынат"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Түзмөктү администратор кулпулап койгон"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Түзмөк кол менен кулпуланды"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Таанылган жок"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Таанылган жок"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Жүзүнөн таанып ачуу функциясын колдонуу үчүн Жөндөөлөр > Купуялык бөлүмүнө өтүп, "<b>"Камераны колдонууну"</b>" күйгүзүңүз"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 732ac1f..a01cd7c 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"ຈຳເປັນຕ້ອງມີລະຫັດຜ່ານເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ອຸປະກອນຖືກລັອກໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ອຸປະກອນຖືກສັ່ງໃຫ້ລັອກ"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ບໍ່ຮູ້ຈັກ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ບໍ່ຮູ້ຈັກ"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ເພື່ອໃຊ້ການປົດລັອກດ້ວຍໜ້າ, ກະລຸນາເປີດໃຊ້ "<b>"ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ"</b>" ໃນການຕັ້ງຄ່າ > ຄວາມເປັນສ່ວນຕົວ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 1379529..64e600e 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Norint užtikrinti papildomą saugą būtinas slaptažodis"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Įrenginį užrakino administratorius"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Įrenginys užrakintas neautomatiškai"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Neatpažinta"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Neatpažinta"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Jei norite naudoti atrakinimą pagal veidą, įjunkite parinktį "<b>"Prieiga prie fotoaparato"</b>" skiltyje „Nustatymai“ > „Privatumas“"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index e0c237a..9cd30a1 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -91,7 +91,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Papildu drošībai ir jāievada parole."</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrators bloķēja ierīci."</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Ierīce tika bloķēta manuāli."</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nav atpazīts"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nav atpazīts"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Lai izmantotu autorizāciju pēc sejas, sadaļā Iestatījumi > Konfidencialitāte ieslēdziet opciju "<b>"Piekļuve kamerai"</b>"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index d68517b..c5cad18 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Потребна е лозинка за дополнителна безбедност"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Уредот е заклучен од администраторот"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уредот е заклучен рачно"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Непознат"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Непознат"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"За да користите „Отклучување со лик“, вклучете "<b>"Пристап до камерата"</b>" во „Поставки > Приватност“"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 6bd0ebe..2b0efc8 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"അധിക സുരക്ഷയ്ക്ക് പാസ്വേഡ് ആവശ്യമാണ്"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ഉപകരണം അഡ്മിൻ ലോക്കുചെയ്തു"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ഉപകരണം നേരിട്ട് ലോക്കുചെയ്തു"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"തിരിച്ചറിയുന്നില്ല"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"തിരിച്ചറിയുന്നില്ല"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ഫെയ്സ് അൺലോക്ക് ഉപയോഗിക്കാൻ, ക്രമീകരണം > സ്വകാര്യത എന്നതിൽ "<b>"ക്യാമറാ ആക്സസ്"</b>" ഓണാക്കുക"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 0e4e261..82fbaf1 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Аюулгүй байдлын үүднээс нууц үг оруулах шаардлагатай"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Админ төхөөрөмжийг түгжсэн"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Төхөөрөмжийг гараар түгжсэн"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Таньж чадсангүй"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Таньж чадсангүй"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Царайгаар түгжээ тайлахыг ашиглахын тулд Тохиргоо > Нууцлал хэсэгт "<b>" Камерын хандалтыг "</b>" асаана уу"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index a7bc880..012c83b 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"अतिरिक्त सुरक्षिततेसाठी पासवर्ड आवश्यक आहे"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकाद्वारे लॉक केलेले डिव्हाइस"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिव्हाइस मॅन्युअली लॉक केले होते"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ओळखले नाही"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ओळखले नाही"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फेस अनलॉक वापरण्यासाठी, सेटिंग्ज > गोपनीयता येथे "<b>"कॅमेरा अॅक्सेस"</b>" सुरू करा"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index a2e26a8..29672c1 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Kata laluan diperlukan untuk keselamatan tambahan"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Peranti dikunci oleh pentadbir"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Peranti telah dikunci secara manual"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tidak dikenali"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Untuk menggunakan Buka Kunci Wajah, hidupkan "<b>"akses Kamera"</b>" dalam Tetapan > Privasi"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index a47f597..91dcb9c 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"ပိုမို၍ လုံခြုံမှု ရှိစေရန် စကားဝှက် လိုအပ်ပါသည်"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"စက်ပစ္စည်းကို စီမံခန့်ခွဲသူက လော့ခ်ချထားပါသည်"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"စက်ပစ္စည်းကို ကိုယ်တိုင်ကိုယ်ကျ လော့ခ်ချထားခဲ့သည်"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"မသိ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"မသိ"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်းကို သုံးရန် "<b>"ကင်မရာ သုံးခွင့်"</b>" ကို ‘ဆက်တင်များ > ကန့်သတ်ဆက်တင်’ တွင်ဖွင့်ပါ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 1f3bded..b312706 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Du må skrive inn passordet for ekstra sikkerhet"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheten er låst av administratoren"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten ble låst manuelt"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ikke gjenkjent"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke gjenkjent"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"For å bruke ansiktslås, slå på "<b>"Kameratilgang"</b>" i Innstillinger > Personvern"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 762e0df..39548de 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"अतिरिक्त सुरक्षाको लागि पासवर्ड आवश्यक छ"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकले यन्त्रलाई लक गर्नुभएको छ"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"यन्त्रलाई म्यानुअल तरिकाले लक गरिएको थियो"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"पहिचान भएन"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"पहिचान भएन"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फेस अनलक प्रयोग गर्न \"सेटिङ तथा गोपनीयता\" मा गई "<b>"क्यामेरा प्रयोग गर्ने अनुमति"</b>" दिनुहोस्"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index 6ed0960..e97fde4 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Wachtwoord vereist voor extra beveiliging"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Apparaat vergrendeld door beheerder"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Apparaat is handmatig vergrendeld"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Niet herkend"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Niet herkend"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Als je Ontgrendelen via gezichtsherkenning wilt gebruiken, zet je "<b>"Cameratoegang"</b>" aan via Instellingen > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index ef2a739..edf5d99 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ ପାସ୍ୱର୍ଡ ଆବଶ୍ୟକ"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ଡିଭାଇସ୍ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଲକ୍ କରାଯାଇଛି"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ଡିଭାଇସ୍ ମାନୁଆଲ ଭାବେ ଲକ୍ କରାଗଲା"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ଫେସ ଅନଲକ ବ୍ୟବହାର କରିବା ପାଇଁ, ସେଟିଂସ ଏବଂ ଗୋପନୀୟତାରେ "<b>"କ୍ୟାମେରା ଆକ୍ସେସ"</b>"କୁ ଚାଲୁ କରନ୍ତୁ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 36c0558..858682c 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ਫ਼ੇਸ ਅਣਲਾਕ ਨੂੰ ਵਰਤਣ ਲਈ, ਸੈਟਿੰਗਾਂ > ਪਰਦੇਦਾਰੀ ਵਿੱਚ ਜਾ ਕੇ "<b>"ਕੈਮਰਾ ਪਹੁੰਚ"</b>" ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 5f4152c..f1a53e0 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Dla większego bezpieczeństwa musisz podać hasło"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Urządzenie zablokowane przez administratora"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Urządzenie zostało zablokowane ręcznie"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nie rozpoznano"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie rozpoznano"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Aby używać rozpoznawania twarzy, włącz "<b>"dostęp do aparatu"</b>" w Ustawieniach i prywatności"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 05f90aa..aecc5f2 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"A senha é necessária para aumentar a segurança"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Não reconhecido"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 42d2d9a..c3486bb 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Para segurança adicional, é necessária uma palavra-passe"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo gestor"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Não reconhecido."</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido."</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para utilizar o Desbloqueio facial, ative o "<b>"Acesso à câmara"</b>" em Definições > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 05f90aa..aecc5f2 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"A senha é necessária para aumentar a segurança"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Não reconhecido"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 3ba168c..04fe6be 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -91,7 +91,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Parola este necesară pentru securitate suplimentară"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispozitiv blocat de administrator"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Dispozitivul a fost blocat manual"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nu este recunoscută"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nu este recunoscut"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pentru a folosi Deblocarea facială, activați "<b>"Accesul la cameră"</b>" în Setări și confidențialitate"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index 1dc6ee2..364c8b7 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"В качестве дополнительной меры безопасности введите пароль"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Устройство заблокировано администратором"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройство было заблокировано вручную"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не распознано"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распознано"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Чтобы использовать фейсконтроль, разрешите "<b>"доступ к камере"</b>". Для этого перейдите в настройки и нажмите \"Конфиденциальность\"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index f4b08f2..5e934cc 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"අමතර ආරක්ෂාව සඳහා මුරපදය අවශ්යයි"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ඔබගේ පරිපාලක විසින් උපාංගය අගුළු දමා ඇත"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"උපාංගය හස්තීයව අගුලු දමන ලදී"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"හඳුනා නොගන්නා ලදී"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"හඳුනා නොගන්නා ලදී"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"මුහුණෙන් අගුලු හැරීම භාවිත කිරීමට, සැකසීම් > පෞද්ගලිකත්වය තුළ "<b>"කැමරා ප්රවේශය"</b>" ක්රියාත්මක කරන්න"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index 8faa85b..187683f 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Na ďalšie zabezpečenie musíte zadať heslo"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zariadenie zamkol správca"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zariadenie bolo uzamknuté ručne"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nerozpoznané"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznané"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ak chcete používať odomknutie tvárou, v sekcii Nastavenia > Ochrana súkromia zapnite "<b>"prístup ku kamere"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index b9b74d5..17c590f 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Zaradi dodatne varnosti morate vnesti geslo"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Napravo je zaklenil skrbnik"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Naprava je bila ročno zaklenjena"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ni prepoznano"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ni prepoznano"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Če želite uporabljati odklepanje z obrazom, v meniju »Nastavitve« > »Zasebnost« vklopite možnost "<b>"Dostop do fotoaparata"</b>"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index d46ac78..16adc13 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Kërkohet fjalëkalimi për më shumë siguri"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Pajisja është e kyçur nga administratori"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Pajisja është kyçur manualisht"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nuk njihet"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nuk njihet"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Për të përdorur \"Shkyçjen me fytyrë\", aktivizo "<b>"Qasjen te kamera"</b>" te \"Cilësimet\" > \"Privatësia\""</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 675b934..2fb2939 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -91,7 +91,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Треба да унесете лозинку ради додатне безбедности"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Администратор је закључао уређај"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уређај је ручно закључан"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Није препознат"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Није препознат"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Да бисте користили откључавање лицем, укључите "<b>"приступ камери"</b>" у одељку Подешавања > Приватност"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index 09b177a..166be1b 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Du måste ange lösenord för ytterligare säkerhet"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratören har låst enheten"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten har låsts manuellt"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Identifierades inte"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Identifierades inte"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Om du vill använda ansiktslås aktiverar du "<b>"Kameraåtkomst"</b>" i Inställningar > Integritet"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index b44b65d..193bb60 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Nenosiri linahitajika ili kuongeza usalama."</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Msimamizi amefunga kifaa"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Umefunga kifaa mwenyewe"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Haitambuliwi"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Haitambuliwi"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ili utumie kipengele cha kufungua kwa uso, washa kipengele cha "<b>"ufikiaji wa Kamera"</b>" katika Mipangilio na Faragha"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 1708377..cfa865a 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"கூடுதல் பாதுகாப்பிற்கு, கடவுச்சொல்லை உள்ளிட வேண்டும்"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"நிர்வாகி சாதனத்தைப் பூட்டியுள்ளார்"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"பயனர் சாதனத்தைப் பூட்டியுள்ளார்"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"அடையாளங்காணபடவில்லை"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"அடையாளங்காணபடவில்லை"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"முகம் காட்டித் திறத்தல் அம்சத்தைப் பயன்படுத்த, அமைப்புகள் > தனியுரிமை என்பதற்குச் சென்று "<b>"கேமரா அணுகலை"</b>" இயக்கவும்"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 2a1f62f..dd42d77 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"అదనపు సెక్యూరిటీ కోసం పాస్వర్డ్ను ఎంటర్ చేయాలి"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"పరికరం నిర్వాహకుల ద్వారా లాక్ చేయబడింది"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"పరికరం మాన్యువల్గా లాక్ చేయబడింది"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"గుర్తించలేదు"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"గుర్తించలేదు"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ఫేస్ అన్లాక్ను ఉపయోగించడానికి, సెట్టింగ్లు > గోప్యతలో "<b>"కెమెరా యాక్సెస్"</b>"ను ఆన్ చేయండి"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index 57a6a9f..10bdd0c 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"ต้องป้อนรหัสผ่านเพื่อความปลอดภัยเพิ่มเติม"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ผู้ดูแลระบบล็อกอุปกรณ์"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"มีการล็อกอุปกรณ์ด้วยตัวเอง"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ไม่รู้จัก"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ไม่รู้จัก"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"หากต้องการใช้ปลดล็อกด้วยใบหน้า ให้เปิด"<b>"การเข้าถึงกล้อง"</b>"ในการตั้งค่าและความเป็นส่วนตัว"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index cd2fc68..85fcb7a 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Kinakailangan ang password para sa karagdagang seguridad"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Na-lock ng admin ang device"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Manual na na-lock ang device"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Hindi nakilala"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Hindi nakilala"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para magamit ang Pag-unlock Gamit ang Mukha, i-on ang "<b>"Access sa camera"</b>" sa Mga Setting > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index 0435224..e9c3d5a 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Ek güvenlik için şifre gerekir"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz, yönetici tarafından kilitlendi"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihazın manuel olarak kilitlendi"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tanınmadı"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmadı"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Yüz Tanıma Kilidi\'ni kullanmak için Ayarlar > Gizlilik bölümünden "<b>"Kamera erişimi"</b>"\'ni açın"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index 96b53bf..ae2131c 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -93,7 +93,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Для додаткового захисту потрібно ввести пароль"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Адміністратор заблокував пристрій"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Пристрій заблоковано вручну"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не розпізнано"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не розпізнано"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Щоб використовувати фейсконтроль, увімкніть "<b>"Доступ до камери"</b>" в розділі \"Налаштування\" > \"Конфіденційність\""</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 18fc02f..3e1245e 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"اضافی سیکیورٹی کیلئے پاس ورڈ درکار ہے"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"آلہ منتظم کی جانب سے مقفل ہے"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"آلہ کو دستی طور پر مقفل کیا گیا تھا"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"تسلیم شدہ نہیں ہے"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"تسلیم شدہ نہیں ہے"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"فیس اَنلاک کا استعمال کرنے کے لیے، ترتیبات اور رازداری میں "<b>"کیمرے تک رسائی"</b>" کو آن کریں"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 733347b..e116919 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Qo‘shimcha xavfsizlik chorasi sifatida parol talab qilinadi"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Qurilma administrator tomonidan bloklangan"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Qurilma qo‘lda qulflangan"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Aniqlanmadi"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Aniqlanmadi"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Yuz bilan ochish uchun Sozlamalar va maxfiylik orqali "<b>"kameraga kirishga ruxsat bering"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 1a853ea..15e35c4 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Yêu cầu mật khẩu để bảo mật thêm"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Thiết bị đã bị quản trị viên khóa"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Thiết bị đã bị khóa theo cách thủ công"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Không nhận dạng được"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Không nhận dạng được"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Để dùng tính năng Mở khoá bằng khuôn mặt, hãy bật tuỳ chọn "<b>"Truy cập máy ảnh"</b>" trong phần Cài đặt > Quyền riêng tư"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 81ad96a..0deee177 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"需要输入密码以进一步确保安全"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理员已锁定设备"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"此设备已手动锁定"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"无法识别"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"无法识别"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如需使用人脸解锁功能,请在“设置”>“隐私权”中开启"<b>"摄像头使用权限"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index eca1028..145bd2b 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"請務必輸入密碼,以進一步確保安全"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"裝置已由管理員鎖定"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"使用者已手動將裝置上鎖"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"未能識別"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"未能識別"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如要使用「面孔解鎖」,請在 [設定] > [私隱] 開啟"<b>"相機存取權"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index 50ac79d..f34f78e 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"請輸入密碼,以進一步確保資訊安全"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理員已鎖定裝置"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"裝置已手動鎖定"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"無法識別"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"無法識別"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如要使用人臉解鎖功能,請前往「設定」>「隱私權」開啟"<b>"攝影機存取權"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index ab413bf..76e0580 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -89,7 +89,6 @@
<string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Iphasiwedi idingelwa ukuvikela okungeziwe"</string>
<string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Idivayisi ikhiywe ngumlawuli"</string>
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Idivayisi ikhiywe ngokwenza"</string>
- <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Akwaziwa"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Akwaziwa"</string>
<string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ukuze usebenzise Ukuvula ngobuso, vula "<b>"Ukufinyelela kwekhamera"</b>" kokuthi Amasethingi > Ubumfihlo"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
diff --git a/core/res/res/drawable/default_dream_preview.xml b/packages/SystemUI/res/drawable/ic_chevron_icon.xml
similarity index 60%
copy from core/res/res/drawable/default_dream_preview.xml
copy to packages/SystemUI/res/drawable/ic_chevron_icon.xml
index bf4a04b..acbbbcb 100644
--- a/core/res/res/drawable/default_dream_preview.xml
+++ b/packages/SystemUI/res/drawable/ic_chevron_icon.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
@@ -15,6 +15,14 @@
~ limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
- <solid android:color="@android:color/white"/>
-</shape>
\ No newline at end of file
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="18dp"
+ android:height="31dp"
+ android:viewportWidth="18"
+ android:viewportHeight="31">
+ <path
+ android:pathData="M0.0061,27.8986L2.6906,30.5831L17.9219,15.3518L2.6906,0.1206L0.0061,2.8051L12.5338,15.3518"
+ android:strokeAlpha="0.7"
+ android:fillColor="#FFFFFF"
+ android:fillAlpha="0.7"/>
+</vector>
diff --git a/packages/SystemUI/res/layout/controls_base_item.xml b/packages/SystemUI/res/layout/controls_base_item.xml
index 5d80da8..e1dbe69 100644
--- a/packages/SystemUI/res/layout/controls_base_item.xml
+++ b/packages/SystemUI/res/layout/controls_base_item.xml
@@ -113,4 +113,16 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
+ <ImageView
+ android:id="@+id/chevron_icon"
+ android:autoMirrored="true"
+ android:src="@drawable/ic_chevron_icon"
+ android:visibility="invisible"
+ android:layout_width="@dimen/control_chevron_icon_size"
+ android:layout_height="@dimen/control_chevron_icon_size"
+ android:clickable="false"
+ android:focusable="false"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
index 4824f4c..e066d38 100644
--- a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
@@ -20,6 +20,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/clock"
+ android:includeFontPadding="false"
android:textColor="@android:color/white"
android:format12Hour="h:mm"
android:format24Hour="kk:mm"
diff --git a/packages/SystemUI/res/layout/media_output_dialog.xml b/packages/SystemUI/res/layout/media_output_dialog.xml
index b7265b9..51211a0 100644
--- a/packages/SystemUI/res/layout/media_output_dialog.xml
+++ b/packages/SystemUI/res/layout/media_output_dialog.xml
@@ -86,6 +86,36 @@
</LinearLayout>
<LinearLayout
+ android:id="@+id/cast_app_section"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ android:layout_marginStart="@dimen/dialog_side_padding"
+ android:layout_marginEnd="@dimen/dialog_side_padding"
+ android:layout_marginBottom="@dimen/dialog_bottom_padding"
+ android:orientation="vertical"
+ android:visibility="gone">
+ <TextView
+ android:id="@+id/launch_app_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|start"
+ android:ellipsize="end"
+ android:textColor="?android:attr/textColorPrimary"
+ android:text="@string/media_output_dialog_launch_app_text"
+ android:maxLines="1"
+ android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
+ android:textSize="16sp"/>
+
+ <Button
+ android:id="@+id/launch_app_button"
+ style="@style/Widget.Dialog.Button.BorderButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:drawablePadding="5dp"/>
+ </LinearLayout>
+
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 39d7f4f..c7910afc 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -89,11 +89,6 @@
layout="@layout/keyguard_status_view"
android:visibility="gone"/>
- <include layout="@layout/idle_host_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone"/>
-
<include layout="@layout/dock_info_overlay"/>
<FrameLayout
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 309921c..42955caf 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Laat toe"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-ontfouting word nie toegelaat nie"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Die gebruiker wat tans by hierdie toestel aangemeld is, kan nie USB-ontfouting aanskakel nie. Skakel na die primêre gebruiker toe oor om hierdie kenmerk te gebruik."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Wil jy die stelseltaal na <xliff:g id="LANGUAGE">%1$s</xliff:g> verander?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"\'n Ander toestel het versoek om die stelseltaal te verander"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Verander taal"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Hou huidige taal"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Laat draadlose ontfouting op hierdie netwerk toe?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Netwerknaam (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adres (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Laat altyd toe op hierdie netwerk"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helderheid"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kleuromkering"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Kleurregstelling"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikerinstellings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Maak toe"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Jy sal nie jou volgende wekker <xliff:g id="WHEN">%1$s</xliff:g> hoor nie"</string>
<string name="alarm_template" msgid="2234991538018805736">"om <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Kitsinstellings, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Warmkol"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Werkprofiel"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Pret vir party mense, maar nie vir almal nie"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Aangemeld as <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"kies gebruiker"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Geen internet nie"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Maak besonderhede oop."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Maak <xliff:g id="ID_1">%s</xliff:g>-instellings oop."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Wysig volgorde van instellings."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aan/af-kieslys"</string>
@@ -884,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiewe programme</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiewe program</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiewe programme"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Gestop"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopieer"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Gekopieer"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Van <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Maak kopieer-UI toe"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Wysig gekopieerde teks"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Wysig gekopieerde prent"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Stuur na toestel in die omtrek"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 812776b..03ae0e4 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ፍቀድ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"የዩኤስቢ እርማት አይፈቀድም"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"የስርዓት ቋንቋውን ወደ <xliff:g id="LANGUAGE">%1$s</xliff:g> መቀየር ይፈልጋሉ?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"በሌላ መሳሪያ የተጠየቀ የስርዓት ቋንቋ ለውጥ"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ቋንቋ ቀይር"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"አሁን ያለውን ቋንቋ አቆይ"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"በዚህ አውታረ መረብ ላይ ገመድ-አልባ debugging ይፈቀድ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"የአውታረ መረብ ስም (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nየWi‑Fi አድራሻ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ሁልጊዜ በዚህ አውታረ መረብ ላይ ፍቀድ"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ብሩህነት"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ተቃራኒ ቀለም"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"የቀለም ማስተካከያ"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"ተጨማሪ ቅንብሮች"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"የተጠቃሚ ቅንብሮች"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ተከናውኗል"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ዝጋ"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"የእርስዎን ቀጣይ ማንቂያ <xliff:g id="WHEN">%1$s</xliff:g> አይሰሙም"</string>
<string name="alarm_template" msgid="2234991538018805736">"በ<xliff:g id="WHEN">%1$s</xliff:g> ላይ"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"በ<xliff:g id="WHEN">%1$s</xliff:g> ላይ"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ፈጣን ቅንብሮች፣ <xliff:g id="TITLE">%s</xliff:g>።"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"መገናኛ ነጥብ"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"የስራ መገለጫ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"ለአንዳንዶች አስደሳች ቢሆንም ለሁሉም አይደለም"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"እንደ <xliff:g id="ID_1">%s</xliff:g> ሆነው ገብተዋል"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ተጠቃሚ ይምረጡ"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ምንም በይነመረብ የለም"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"ዝርዝሮችን ክፈት።"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"የ<xliff:g id="ID_1">%s</xliff:g> ቅንብሮችን ክፈት።"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"የቅንብሮድ ቅደም-ተከተል አርትዕ።"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"የኃይል ምናሌ"</string>
@@ -884,13 +877,20 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ገቢር መተግበሪያዎች</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ገቢር መተግበሪያዎች</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ገቢር መተግበሪያዎች"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"መቆሚያ"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"ቆሟል"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ቅዳ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ተቀድቷል"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"ከ<xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"ዩአይ ቅዳን አሰናብት"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"የተቀዳ ጽሁፍ አርትዕ ያድርጉ"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"የተቀዳ ምስል አርትዕ ያድርጉ"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"በአቅራቢያ ወዳለ መሳሪያ ይላኩ"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index ebc43fe..38dcb89 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"سماح"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"لا يُسمح بتصحيح أخطاء USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تفعيل تصحيح الأخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"هل تريد تغيير لغة النظام إلى <xliff:g id="LANGUAGE">%1$s</xliff:g>؟"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"طلب جهاز آخر تغيير لغة النظام."</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"تغيير اللغة"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"الإبقاء على اللغة الحالية"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"هل تريد السماح باستخدام ميزة \"تصحيح الأخطاء اللاسلكي\" على هذه الشبكة؟"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"اسم الشبكة (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nعنوان شبكة Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"السماح باستخدام هذه الميزة على هذه الشبكة دائمًا"</string>
@@ -244,7 +240,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"السطوع"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"قلب الألوان"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"تصحيح الألوان"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"المزيد من الإعدادات"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"إعدادات المستخدم"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"تم"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"إغلاق"</string>
@@ -476,7 +471,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"لن تسمع المنبّه القادم في <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"في <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"يوم <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"الإعدادات السريعة، <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"نقطة اتصال"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"الملف الشخصي للعمل"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"متعة للبعض وليس للجميع"</string>
@@ -663,7 +657,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"تم تسجيل الدخول باعتبارك <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"اختيار مستخدم"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"لا يتوفر اتصال إنترنت."</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"فتح التفاصيل."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"فتح إعدادات <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"تعديل ترتيب الإعدادات."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"قائمة زر التشغيل"</string>
@@ -912,13 +905,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> تطبيق نشط</item>
<item quantity="one">تطبيق واحد (<xliff:g id="COUNT_0">%s</xliff:g>) نشط</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"# تطبيق نشط"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"إيقاف"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"متوقّف"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"نسخ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"تم النسخ."</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"من <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"إغلاق واجهة مستخدم النسخ"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 087d67e..8d8a0fb 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"অনুমতি দিয়ক"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"ইউএছবি ডিবাগিঙৰ অনুমতি নাই"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"আপুনি ছিষ্টেমৰ ভাষা <xliff:g id="LANGUAGE">%1$s</xliff:g>লৈ সলনি কৰিবলৈ বিচাৰেনে?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"অন্য এটা ডিভাইচে ছিষ্টেমৰ ভাষা সলনি কৰাৰ অনুৰোধ কৰিছে"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ভাষা সলনি কৰক"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"বৰ্তমানৰ ভাষাটো ৰাখক"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"এই নেটৱৰ্কত ৱায়াৰলেচ ডি\'বাগিংৰ অনুমতি দিবনে?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"নেটৱৰ্কৰ নাম (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nৱাই-ফাইৰ ঠিকনা (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"এই নেটৱৰ্কত সদায় অনুমতি দিয়ক"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"উজ্জ্বলতা"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ৰং বিপৰীতকৰণ"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ৰং শুধৰণী"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"অধিক ছেটিং"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ব্যৱহাৰকাৰীৰ ছেটিং"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন কৰা হ’ল"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"বন্ধ কৰক"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"আপুনি আপোনাৰ পিছৰটো এলাৰ্ম <xliff:g id="WHEN">%1$s</xliff:g> বজাত শুনা নাপাব"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ক্ষিপ্ৰ ছেটিং, <xliff:g id="TITLE">%s</xliff:g>।"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"হটস্পট"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"কিছুমানৰ বাবে আমোদজনক হয় কিন্তু সকলোৰে বাবে নহয়"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> হিচাপে ছাইন ইন হ’ল"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ব্যৱহাৰকাৰী বাছনি কৰক"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ইণ্টাৰনেট সংযোগ নাই"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"বিৱৰণসমূহ খোলক।"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g>ৰ ছেটিং খোলক।"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ছেটিঙৰ ক্ৰম সম্পাদনা কৰক।"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"পাৱাৰ মেনু"</string>
@@ -884,13 +877,20 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> টা সক্ৰিয় এপ্</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> টা সক্ৰিয় এপ্</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"সক্ৰিয় এপ্"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"বন্ধ কৰক"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"বন্ধ হ’ল"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"প্ৰতিলিপি কৰক"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"প্ৰতিলিপি কৰা হ’ল"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g>ৰ পৰা"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"প্ৰতিলিপি কৰা UI অগ্ৰাহ্য কৰক"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"প্ৰতিলিপি কৰা পাঠ সম্পাদনা কৰক"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"প্ৰতিলিপি কৰা প্ৰতিচ্ছবি সম্পাদনা কৰক"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"নিকটৱৰ্তী ডিভাইচলৈ পঠাওক"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 013c489..1fc28a8 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"İcazə verin"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ilə sazlama qadağandır"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Sistem dili <xliff:g id="LANGUAGE">%1$s</xliff:g> dilinə dəyişdirilsin?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Sistem dilinin dəyişdirilməsi başqa cihaz tərəfindən tələb olunur"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Dili dəyişin"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Cari dili saxlayın"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Bu şəbəkədə WiFi sazlamasına icazə verilsin?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Şəbəkə Adı (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Ünvanı (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Bu şəbəkədə həmişə icazə verilsin"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Parlaqlıq"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Rəng inversiyası"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Rəng korreksiyası"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Digər ayarlar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"İstifadəçi ayarları"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hazır"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bağlayın"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g> zaman növbəti xəbərdarlığınızı eşitməyəcəksiniz"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Sürətli Ayarlar, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"İş profili"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Hamı üçün deyil, bəziləri üçün əyləncəli"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> kimi daxil olunub"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"istifadəçi seçin"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"İnternet yoxdur"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Detalları açın."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını açın."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Ayarların sıralanmasını redaktə edin."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Qidalanma düyməsi menyusu"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiv tətbiq</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiv tətbiq</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiv tətbiqlər"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Dayandırın"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Dayandırılıb"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopyalayın"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopyalandı"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Mənbə: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI kopyalanmasını qapadın"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index f84560d..555b477 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Dozvoli"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Otklanjanje grešaka na USB-u nije dozvoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Da li želite da promenite jezik sistema na <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Drugi uređaj je zatražio promenu jezika sistema"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Promeni jezik"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Zadrži aktuelni jezik"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Želite da dozvolite bežično otklanjanje grešaka na ovoj mreži?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Naziv mreže (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi adresa (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Uvek dozvoli na ovoj mreži"</string>
@@ -241,7 +237,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Osvetljenost"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija boja"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korekcija boja"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Još podešavanja"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisnička podešavanja"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string>
@@ -467,7 +462,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nećete čuti sledeći alarm u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Brza podešavanja, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Poslovni profil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Zabava za neke, ali ne za sve"</string>
@@ -648,7 +642,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Prijavljeni ste kao <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"odabrali korisnika"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nema interneta"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Otvori detalje."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvori podešavanja za <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Izmeni redosled podešavanja."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni dugmeta za uključivanje"</string>
@@ -891,13 +884,23 @@
<item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacija</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zaustavi"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Zaustavljeno"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano je"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Iz: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Odbaci kopiranje korisničkog interfejsa"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index a3d4652..7446007 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дазволіць"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Адладка па USB забаронена"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Карыстальнік, які зараз увайшоў у гэту прыладу, не можа ўключыць адладку па USB. Каб выкарыстоўваць гэту функцыю, пераключыцеся на асноўнага карыстальніка."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Змяніць мову сістэмы на наступную: \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\"?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Іншая прылада запытала змяненне мовы сістэмы"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Змяніць мову"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Захаваць бягучую мову"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Дазволіць адладку па Wi-Fi у гэтай сетцы?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Назва сеткі (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nАдрас Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Заўсёды дазваляць у гэтай сетцы"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркасць"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Інверсія колераў"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Карэкцыя колераў"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Дадатковыя налады"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налады карыстальніка"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Гатова"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыць"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Вы не пачуеце наступны будзільнік <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Хуткія налады, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Хот-спот"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Працоўны профіль"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Цікава для некаторых, але не для ўсіх"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Вы ўвайшлі як <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"выбраць карыстальніка"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Няма падключэння да інтэрнэту"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Паказаць падрабязную інфармацыю."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Адкрыць налады <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Змяніць парадак налад."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопкі сілкавання"</string>
@@ -898,13 +891,23 @@
<item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> актыўных праграм</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> актыўнай праграмы</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Актыўныя праграмы"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Спыніць"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Спынена"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Капіраваць"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скапіравана"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"З праграмы \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Закрыць інтэрфейс капіравання"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 6245e47..f7a1ad6 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Разрешаване"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отстраняването на грешки през USB не е разрешено"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Искате ли да промените езика на системата на <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Друго устройство е заявило промяна на езика на системата"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Промяна на езика"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Текущ език: Запазване"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Разрешаване на безжичното отстраняване на грешки?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Име на мрежата (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nАдрес на Wi‑Fi мрежата (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Винаги да се разрешава в тази мрежа"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркост"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инвертиране на цветовете"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекция на цветове"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Още настройки"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Потребителски настройки"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затваряне"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Няма да чуете следващия си будилник в <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"в <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"в/ъв <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Бързи настройки (<xliff:g id="TITLE">%s</xliff:g>)."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Точка за достъп"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Потребителски профил в Work"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Забавно – но не за всички"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Влезли сте като <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"изберете потребител"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Няма връзка с интернет"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Отвaряне на страницата с подробности."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Отваряне на настройките за <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Редактиране на подредбата на настройките."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню за включване/изключване"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активни приложения</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> активно приложение</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активни приложения"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Спиране"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Спряно"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копиране"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"От <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Отхвърляне на ПИ за копиране"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 1d7e96d..36a5bc4 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"অনুমতি দিন"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ডিবাগিং অনুমোদিত নয়"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"আপনি কি সিস্টেমের ভাষা পরিবর্তন করে <xliff:g id="LANGUAGE">%1$s</xliff:g> করতে চান?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"অন্য ডিভাইসের দ্বারা সিস্টেমের ভাষা পরিবর্তনের অনুরোধ করা হয়েছে"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ভাষা পরিবর্তন করুন"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"বর্তমান ভাষা রাখুন"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"এই নেটওয়ার্কে ওয়্যারলেস ডিবাগিংয়ের অনুমতি দেবেন?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"নেটওয়ার্কের নাম (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nওয়াই-ফাই অ্যাড্রেস (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"এই নেটওয়ার্কে সবসময় অনুমতি দিন"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"উজ্জ্বলতা"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"কালার ইনভার্সন"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"রঙ সংশোধন"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"আরও সেটিংস"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ব্যবহারকারী সেটিংস"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন হয়েছে"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"বন্ধ করুন"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"আপনি আপনার পরবর্তী <xliff:g id="WHEN">%1$s</xliff:g> অ্যালার্ম শুনতে পাবেন না"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> -তে"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"দ্রুত সেটিংস, <xliff:g id="TITLE">%s</xliff:g>৷"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"হটস্পট"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"কাজের প্রোফাইল"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"কিছু ব্যক্তির জন্য মজাদার কিন্তু সকলের জন্য নয়"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> হিসেবে প্রবেশ করে রয়েছেন"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ব্যবহারকারী বেছে নিন"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ইন্টারনেট কানেকশন নেই"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"বিশদ বিবরণ খুলুন৷"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> সেটিংস খুলুন৷"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ক্রম বা সেটিংস সম্পাদনা করুন৷"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"পাওয়ার মেনু"</string>
@@ -884,13 +877,20 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g>টি অ্যাক্টিভ অ্যাপ</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g>টি অ্যাক্টিভ অ্যাপ</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"অ্যাক্টিভ অ্যাপ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"বন্ধ করুন"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"থামানো হয়েছে"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"কপি করুন"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"কপি করা হয়েছে"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> থেকে"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"কপি করা UI বাতিল করুন"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"কপি করা টেক্সট এডিট করুন"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"কপি করা ছবি এডিট করুন"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"আশেপাশের ডিভাইসে পাঠান"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 74575c2..1545c43 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Dozvoli"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Otklanjanje grešaka putem USB-a nije dozvoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka putem USB-a. Da koristite tu funkciju, prebacite se na primarnog korisnika."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Želite li promijeniti jezik sistema u <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Promjenu jezika sistema je zatražio drugi uređaj"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Promijeni jezik"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Zadrži trenutni jezik"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Dozvoliti bežično otklanjanje grešaka na ovoj mreži?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Naziv mreže (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa WiFi mreže (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Uvijek dozvoli na ovoj mreži"</string>
@@ -241,7 +237,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Osvjetljenje"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija boja"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Ispravka boje"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string>
@@ -467,7 +462,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nećete čuti sljedeći alarm u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Brze postavke, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Pristupna tačka"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil za posao"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Zabava za neke, ali ne za sve"</string>
@@ -648,7 +642,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Prijavljeni ste kao <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"odaberete korisnika"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nema internetske veze"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Otvori detalje."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvori postavke za: <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Urediti raspored postavki."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni napajanja"</string>
@@ -891,13 +884,20 @@
<item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacija</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zaustavi"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Zaustavljeno"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Iz aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Odbaci kopirani korisnički interfejs"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Uredi kopirani tekst"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Uredi kopiranu sliku"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Pošalji na uređaj u blizini"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 46500b7..621f5f9 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permet"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"No es permet la depuració per USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Vols canviar l\'idioma del sistema a <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Un altre dispositiu ha sol·licitat canviar l\'idioma del sistema"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Canvia l\'idioma"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mantén l\'idioma actual"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vols permetre la depuració sense fil en aquesta xarxa?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nom de la xarxa (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdreça Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permet sempre en aquesta xarxa"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillantor"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversió de colors"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correcció de color"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Més opcions"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuració d\'usuari"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fet"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tanca"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g> no sentiràs la pròxima alarma"</string>
<string name="alarm_template" msgid="2234991538018805736">"Hora: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"Dia: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Configuració ràpida, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Punt d\'accés Wi-Fi"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de treball"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversió per a uns quants, però no per a tothom"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"S\'ha iniciat la sessió com a <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"triar un usuari"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Sense connexió a Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Obre la informació detallada."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Obre la configuració per a <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edita l\'ordre de la configuració."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú d\'engegada"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplicacions actives</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicació activa</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicacions actives"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Atura"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Aturada"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copia"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"S\'ha copiat"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"De: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignora la IU de còpia"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 41ae7f7..ba97688 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Povolit"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ladění přes USB není povoleno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Uživatel aktuálně přihlášený k tomuto zařízení nemůže zapnout ladění přes USB. Chcete-li tuto funkci použít, přepněte na primárního uživatele."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Změnit systémový jazyk na <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Jiné zařízení požádalo o změnu systémového jazyka"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Změnit jazyk"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Zachovat stávající jazyk"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Povolit v této síti bezdrátové ladění?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Název sítě (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"V této síti vždy povolit"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jas"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Převrácení barev"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korekce barev"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Další nastavení"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uživatelské nastavení"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavřít"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Svůj další budík <xliff:g id="WHEN">%1$s</xliff:g> neuslyšíte"</string>
<string name="alarm_template" msgid="2234991538018805736">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Rychlé nastavení <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Pracovní profil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Zábava, která není pro každého"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Jste přihlášeni jako <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"zvolit uživatele"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nejste připojeni k internetu"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Otevřít podrobnosti."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otevřít nastavení aplikace <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Upravit pořadí nastavení."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Nabídka vypínače"</string>
@@ -898,13 +891,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivních aplikací</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktivních aplikací</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivní aplikace"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Konec"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Zastaveno"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopírovat"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Zkopírováno"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Z aplikace <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Zavřít uživatelské rozhraní kopírování"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index c1c4088..bbcb9bc 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Tillad"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-fejlretning er ikke tilladt"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Vil du ændre systemsproget til <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"En anden enhed har anmodet om en ændring af systemsproget"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Skift sprog"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Behold nuværende sprog"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vil du tillade trådløs fejlretning på dette netværk?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Netværksnavn (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adresse (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Tillad altid på dette netværk"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Lysstyrke"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ombytning af farver"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Farvekorrigering"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere indstillinger"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brugerindstillinger"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Udfør"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Luk"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Du vil ikke kunne høre din næste alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"på <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Kvikmenu <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Arbejdsprofil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Sjovt for nogle, men ikke for alle"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Logget ind som <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"vælge bruger"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Intet internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Åbn oplysninger."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Åbn <xliff:g id="ID_1">%s</xliff:g>-indstillinger."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Rediger rækkefølgen af indstillinger."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu for afbryderknappen"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktiv app</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktive apps</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktive apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stoppet"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiér"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopieret"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Fra <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Luk brugerfladen for kopi"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 6aa260c..2b9f725 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helligkeit"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Farbumkehr"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Farbkorrektur"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Weitere Einstellungen"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Nutzereinstellungen"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fertig"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Schließen"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Lautloser Weckruf <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"um <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"am <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Schnelleinstellungen (<xliff:g id="TITLE">%s</xliff:g>)"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Arbeitsprofil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Für einige ein Vergnügen, aber nicht für alle"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Angemeldet als <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"Auswählen des Nutzers"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Kein Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Details öffnen."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Einstellungen für <xliff:g id="ID_1">%s</xliff:g> öffnen."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Reihenfolge der Einstellungen bearbeiten."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Ein-/Aus-Menü"</string>
@@ -880,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktive Apps</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktive App</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktive Apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Beenden"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Beendet"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopieren"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiert"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Von <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Kopieren-Benutzeroberfläche schließen"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 0a727e3..6096749 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Να επιτρέπεται"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Δεν επιτρέπεται ο εντοπισμός σφαλμάτων USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Ο χρήστης που είναι συνδεδεμένος αυτήν τη στιγμή σε αυτήν τη συσκευή δεν μπορεί να ενεργοποιήσει τον εντοπισμό σφαλμάτων USB. Για να χρησιμοποιήσετε αυτήν τη λειτουργία, κάντε εναλλαγή στον κύριο χρήστη."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Θέλετε να αλλάξετε τη γλώσσα συστήματος σε <xliff:g id="LANGUAGE">%1$s</xliff:g>;"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Ζητήθηκε αλλαγή της γλώσσας συστήματος από άλλη συσκευή"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Αλλαγή γλώσσας"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Διατήρ. τρέχουσας γλώσσας"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Να επιτρέπεται ασύρματος εντοπ. σφαλ. στο δίκτυο;"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Όνομα δικτύου (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nΔιεύθυνση Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Να επιτρέπεται πάντα σε αυτό το δίκτυο"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Φωτεινότητα"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Αντιστροφή χρωμάτων"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Διόρθωση χρωμάτων"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Περισσότερες ρυθμίσεις"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ρυθμίσεις χρήστη"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Τέλος"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Κλείσιμο"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Δεν θα ακούσετε το επόμενο ξυπνητήρι σας <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"στις <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"στις <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Γρήγορες ρυθμίσεις, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Σημείο πρόσβασης Wi-Fi"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Προφίλ εργασίας"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Διασκέδαση για ορισμένους, αλλά όχι για όλους"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Σύνδεση ως <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"επιλογή χρήστη"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Δεν υπάρχει σύνδεση στο διαδίκτυο"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Άνοιγμα λεπτομερειών."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Άνοιγμα ρυθμίσεων <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Επεξεργασία σειράς ρυθμίσεων."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Μενού λειτουργίας"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ενεργές εφαρμογές</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ενεργή εφαρμογή</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ενεργές εφαρμογές"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Διακοπή"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Διακόπηκε"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Αντιγραφή"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Αντιγράφηκε"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Από <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Παράβλεψη διεπαφής χρήστη αντιγραφής"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index cbbb8a7..f6dc314 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Close"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Work profile"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Fun for some but not for all"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Signed in as <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"No Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Open details."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string>
@@ -880,6 +877,8 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
<string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
@@ -887,4 +886,11 @@
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
<string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edit copied text"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edit copied image"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Send to nearby device"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index cccfdd7..0b4e009 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Close"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Work profile"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Fun for some but not for all"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Signed in as <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"No Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Open details."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string>
@@ -880,6 +877,8 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
<string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
@@ -887,4 +886,11 @@
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
<string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edit copied text"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edit copied image"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Send to nearby device"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index cbbb8a7..f6dc314 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Close"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Work profile"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Fun for some but not for all"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Signed in as <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"No Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Open details."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string>
@@ -880,6 +877,8 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
<string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
@@ -887,4 +886,11 @@
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
<string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edit copied text"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edit copied image"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Send to nearby device"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index cbbb8a7..f6dc314 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Close"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Work profile"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Fun for some but not for all"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Signed in as <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"No Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Open details."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string>
@@ -880,6 +877,8 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
<string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
@@ -887,4 +886,11 @@
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
<string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edit copied text"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edit copied image"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Send to nearby device"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 9e87af7..18d87f3 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Color inversion"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Color correction"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Close"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Work profile"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Fun for some but not for all"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Signed in as <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choose user"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"No internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Open details."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit order of settings."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string>
@@ -880,6 +877,7 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
</plurals>
+ <string name="fgs_dot_content_description" msgid="2865071539464777240">"New information"</string>
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
<string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
@@ -887,4 +885,9 @@
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
<string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edit copied text"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edit copied image"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Send to nearby device"</string>
+ <string name="add" msgid="81036585205287996">"Add"</string>
+ <string name="manage_users" msgid="1823875311934643849">"Manage users"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index be7926b..3f1cc42 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"No tienes permitida la depuración por USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"El usuario al que accediste en este dispositivo no puede activar la depuración por USB. Para usar esta función, debes cambiar al usuario principal."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"¿Quiere cambiar el idioma del sistema a <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Cambio de idioma del sistema solicitado por otro dispositivo"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Cambiar idioma"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mantener el idioma actual"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"¿Quieres permitir la depuración inalámbrica en esta red?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nombre de red (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nDirección Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir siempre en esta red"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversión de color"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corrección de colores"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Más configuraciones"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración del usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Listo"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"No oirás la próxima alarma a la(s) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"a la(s) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"el <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Configuración rápida: <xliff:g id="TITLE">%s</xliff:g>"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de trabajo"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversión para algunos, pero no para todos"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Accediste como <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"elegir usuario"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Sin Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Abrir página de detalles"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configuración de <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar orden de configuración"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de encendido"</string>
@@ -876,21 +869,31 @@
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para cambiar de red, desconéctate de Ethernet"</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Para mejorar la experiencia con el dispositivo, las apps y los servicios pueden seguir buscando redes Wi-Fi en cualquier momento, incluso cuando la conexión Wi-Fi esté desactivada. Puedes cambiar este parámetro en la configuración de búsqueda de Wi-Fi. "<annotation id="link">"Cambiar"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Desactivar el modo de avión"</string>
- <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> quiere agregar el siguiente azulejo a la Configuración rápida"</string>
- <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Agregar azulejo"</string>
- <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"No agregar azulejo"</string>
+ <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> quiere agregar la siguiente tarjeta a la Configuración rápida"</string>
+ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Agregar tarjeta"</string>
+ <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"No agregar tarjeta"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleccionar usuario"</string>
<plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps activas</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> app activa</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps activas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Detener"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Detenida"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Se copió"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"De <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Descartar la copia de la IU"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 5aa0caa..b84ed65 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuración USB no permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"¿Quieres cambiar el idioma del sistema a <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Otro dispositivo ha solicitado un cambio en el idioma del sistema"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Cambiar idioma"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Seguir en este idioma"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"¿Permitir la depuración inalámbrica en esta red?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nombre de la red (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nDirección Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir siempre en esta red"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Invertir colores"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corrección de color"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Más ajustes"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ajustes de usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hecho"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"No oirás la próxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
<string name="alarm_template" msgid="2234991538018805736">"a las <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Ajustes rápidos, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Compartir Internet"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de trabajo"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversión solo para algunos"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Has iniciado sesión como <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"elegir un usuario"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Sin Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Abrir detalles."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir ajustes de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Cambiar el orden de los ajustes."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de encendido"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplicaciones activas</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicación activa</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicaciones activas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Detener"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Detenida"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Cerrar la interfaz de copia"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 36e09a2..91250c3 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Luba"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-silumine pole lubatud"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Kas soovite süsteemi keeleks määrata järgmise: <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Teine seade taotles süsteemi keele muutmist"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Muuda keelt"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Kasuta praegust keelt"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Kas lubada selles võrgus juhtmevaba silumine?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Võrgu nimi (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWiFi-võrgu aadress (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Luba selles võrgus alati"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Heledus"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Värvide ümberpööramine"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Värviparandus"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Rohkem seadeid"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kasutaja seaded"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sule"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Te ei kuule järgmist äratust kell <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"kell <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"kell <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Kiirseaded, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Kuumkoht"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Tööprofiil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Kõik ei pruugi sellest rõõmu tunda"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Sisse logitud kasutajana <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"valige kasutaja"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Interneti-ühendus puudub"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Ava üksikasjad."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ava teenuse <xliff:g id="ID_1">%s</xliff:g> seaded."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Muuda seadete järjestust."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Toitemenüü"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiivset rakendust</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiivne rakendus</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiivsed rakendused"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Peata"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Peatatud"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopeeri"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopeeritud"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Rakendusest <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Koopiast loobumise kasutajaliides"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 07d9cef..b531794 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Distira"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kolore-alderantzikatzea"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Koloreen zuzenketa"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Ezarpen gehiago"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Erabiltzaile-ezarpenak"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Eginda"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Itxi"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Ez duzu entzungo hurrengo alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
<string name="alarm_template" msgid="2234991538018805736">"ordua: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Ezarpen bizkorrak: <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Wifi-gunea"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Work profila"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Dibertsioa batzuentzat, baina ez guztientzat"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> gisa hasi duzu saioa"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"erabiltzailea aukeratzeko"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Ez dago Interneteko konexiorik"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Ireki xehetasunak."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ireki <xliff:g id="ID_1">%s</xliff:g> ezarpenak."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editatu ezarpenen ordena."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Itzaltzeko menua"</string>
@@ -880,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplikazio aktibo</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplikazio aktibo</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktibo dauden aplikazioak"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Gelditu"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Geldituta"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiatu"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiatu da"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Jatorria: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Kopiatutako UIa baztertzeko botoia"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 9545c31..642a826 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"اجازه دادن"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"اشکالزدایی USB مجاز نیست"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمیتواند اشکالزدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"آیا میخواهید زبان سیستم به <xliff:g id="LANGUAGE">%1$s</xliff:g> تغییر کند؟"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"دستگاه دیگری درخواست کرده است زبان سیستم تغییر کند"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"تغییر زبان"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"حفظ زبان فعلی"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"اشکالزدایی بیسیم در این شبکه مجاز شود؟"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"نام شبکه (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nنشانی Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"همیشه در این شبکه مجاز شود"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"روشنایی"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"وارونگی رنگ"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"تصحیح رنگ"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"تنظیمات بیشتر"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"تنظیمات کاربر"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"تمام"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"بستن"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"در ساعت <xliff:g id="WHEN">%1$s</xliff:g>، دیگر صدای زنگ ساعت را نمیشنوید"</string>
<string name="alarm_template" msgid="2234991538018805736">"در <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"در <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"تنظیمات سریع، <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"نقطه اتصال"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"نمایه کاری"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"برای بعضی افراد سرگرمکننده است اما نه برای همه"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"بهعنوان <xliff:g id="ID_1">%s</xliff:g> به سیستم وارد شدهاید"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"انتخاب کاربر"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"عدم اتصال به اینترنت"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"باز کردن جزئیات."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"باز کردن تنظیمات <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ویرایش ترتیب تنظیمات."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"منوی روشن/خاموش"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> برنامه فعال</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> برنامه فعال</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"برنامههای فعال"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"توقف"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"متوقف شد"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"کپی کردن"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"کپی شد"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"از <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"رد کردن رابط کاربری کپی کردن"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index f398871..a9c11bc 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Salli"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-vianetsintää ei sallita"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Haluatko, että järjestelmän kieli on jatkossa <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Toiselta laitteelta pyydetty järjestelmän kielen vaihtamista"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Vaihda kieltä"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Pidä nykyinen kieli"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Sallitaanko langaton virheenkorjaus tässä verkossa?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Verkon nimi (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi-Fin osoite (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Salli aina tässä verkossa"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kirkkaus"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Käänteiset värit"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Värinkorjaus"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Lisäasetukset"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Käyttäjäasetukset"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sulje"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Et kuule seuraavaa hälytystäsi (<xliff:g id="WHEN">%1$s</xliff:g>)."</string>
<string name="alarm_template" msgid="2234991538018805736">"kello <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"ajankohtana <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Pika-asetukset, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Työprofiili"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Ei sovellu kaikkien käyttöön"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Kirjautunut tilillä <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"valitse käyttäjä"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Ei internetyhteyttä"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Avaa tiedot."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Avaa kohteen <xliff:g id="ID_1">%s</xliff:g> asetukset."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Muokkaa asetusten järjestystä."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Virtavalikko"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiivista sovellusta</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiivinen sovellus</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiiviset sovellukset"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Lopeta"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Pysäytetty"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopioi"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopioitu"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Lähde: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Hylkää kopioitu UI"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 89ede7e..3ee8efa 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Autoriser"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Débogage USB non autorisé"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Voulez-vous changer la langue du système pour : <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Un autre appareil demande de changer la langue du système"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Changer la langue"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Garder la langue actuelle"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Autoriser le débogage sans fil sur ce réseau?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nom du réseau (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresse Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Toujours autoriser sur ce réseau"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosité"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversion des couleurs"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correction des couleurs"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Plus de paramètres"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Paramètres utilisateur"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Terminé"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Vous n\'entendrez pas votre prochaine alarme à <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"à <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Configuration rapide – <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Point d\'accès sans fil"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil professionnel"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Divertissant pour certains, mais pas pour tous"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Connecté comme <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choisir un utilisateur"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Aucune connexion Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Ouvrir les détails."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ouvrir les paramètres <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifier l\'ordre des paramètres."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu de l\'interrupteur"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> application active</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> applications actives</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Applications actives"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Arrêter"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Arrêtée"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copier"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copié"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"À partir de <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignorer la copie de l\'IU"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 3e7bdd6..0af35ba 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Autoriser"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Débogage USB non autorisé"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Voulez-vous définir la langue système sur <xliff:g id="LANGUAGE">%1$s</xliff:g> ?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Changement de langue système demandé par un autre appareil"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Changer de langue"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Garder la langue actuelle"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Autoriser le débogage sans fil sur ce réseau ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nom du réseau (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresse Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Toujours autoriser sur ce réseau"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosité"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversion des couleurs"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correction des couleurs"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Plus de paramètres"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Paramètres utilisateur"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"OK"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Vous n\'entendrez pas votre prochaine alarme <xliff:g id="WHEN">%1$s</xliff:g>."</string>
<string name="alarm_template" msgid="2234991538018805736">"à <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Réglages rapides – <xliff:g id="TITLE">%s</xliff:g>"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Point d\'accès"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil professionnel"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Divertissant pour certains, mais pas pour tous"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Connecté en tant que <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"choisir un utilisateur"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Aucun accès à Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Ouvrir les détails."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Ouvrir les paramètres <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifier l\'ordre des paramètres."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu Marche/Arrêt"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> appli active</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> applis actives</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Applis actives"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Arrêter"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Arrêtée"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copier"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copié"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"De <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Désactiver l\'interface de copie"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 9b7c20b..81efcb5 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Non se permite a depuración por USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"O usuario coa sesión iniciada actualmente neste dispositivo non pode activar a depuración por USB. Para utilizar esta función, cambia ao usuario principal."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Queres cambiar o idioma do sistema ao <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Outro dispositivo solicitou un cambio do idioma do sistema"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Cambiar idioma"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Manter idioma actual"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Queres permitir a depuración sen fíos nesta rede?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome de rede (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nEnderezo wifi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir sempre nesta rede"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversión da cor"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corrección da cor"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Máis opcións"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración de usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Feito"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Pechar"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Non escoitarás a alarma seguinte <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"ás <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Configuración rápida: <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Zona wifi"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de traballo"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversión só para algúns"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Sesión iniciada como <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escoller usuario"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Non hai conexión a Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Abrir detalles."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configuración de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar a orde das opcións de configuración."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de acendido"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplicacións activas</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicación activa</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicacións activas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Deter"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Detida"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiouse"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"De <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignorar interface de copia"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 565f9af..98510d5 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"મંજૂરી આપો"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ડીબગિંગની મંજૂરી નથી"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"હાલમાં આ ઉપકરણમાં સાઇન ઇન થયેલ વપરાશકર્તા USB ડિબગીંગ ચાલુ કરી શકતા નથી. આ સુવિધાનો ઉપયોગ કરવા માટે પ્રાથમિક વપરાશકર્તા પર સ્વિચ કરો."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"શું તમે સિસ્ટમની ભાષા બદલીને <xliff:g id="LANGUAGE">%1$s</xliff:g> કરવા માગો છો?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"બીજા ડિવાઇસ દ્વારા સિસ્ટમની ભાષા બદલવાની વિનંતી કરવામાં આવી છે"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ભાષા બદલો"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"વર્તમાન ભાષા રાખો"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"આ નેટવર્ક પર વાયરલેસ ડિબગીંગની મંજૂરી આપીએ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"નેટવર્કનું નામ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nવાઇ-ફાઇ ઍડ્રેસ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"આ નેટવર્ક પર હંમેશા મંજૂરી આપો"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"તેજ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"વિપરીત રંગમાં બદલવું"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"રંગ સુધારણા"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"વધુ સેટિંગ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"વપરાશકર્તા સેટિંગ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"થઈ ગયું"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"બંધ કરો"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"તમે <xliff:g id="WHEN">%1$s</xliff:g> એ તમારો આગલો એલાર્મ સાંભળશો નહીં"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> વાગ્યે"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> એ"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ઝડપી સેટિંગ, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"હૉટસ્પૉટ"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ઑફિસની પ્રોફાઇલ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"કેટલાક માટે મજા પરંતુ બધા માટે નહીં"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> તરીકે સાઇન ઇન કર્યું"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"વપરાશકર્તા પસંદ કરો"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"કોઈ ઇન્ટરનેટ નથી"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"વિગતો ખોલો."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> સેટિંગ ખોલો."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"સેટિંગના ક્રમમાં ફેરફાર કરો."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"પાવર મેનૂ"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> સક્રિય ઍપ</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> સક્રિય ઍપ</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"સક્રિય ઍપ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"રોકો"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"બંધ કરેલી છે"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"કૉપિ કરો"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"કૉપિ કરવામાં આવી"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g>માંથી"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"\'UI | યૂઝર ઇન્ટરફેસ (UI) કૉપિ કરો\'ને છોડી દો"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index f643c87..2631f55 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"स्क्रीन की रोशनी"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"रंग बदलने की सुविधा"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"रंग में सुधार करने की सुविधा"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"और सेटिंग"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"उपयोगकर्ता सेटिंग"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"हो गया"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बंद करें"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"आपको <xliff:g id="WHEN">%1$s</xliff:g> पर अपना अगला अलार्म नहीं सुनाई देगा"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> बजे"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> पर"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"तेज़ सेटिंग, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"हॉटस्पॉट"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"वर्क प्रोफ़ाइल"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"कुछ के लिए मज़ेदार लेकिन सबके लिए नहीं"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> के रूप में प्रवेश किया हुआ है"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"उपयोगकर्ता चुनें"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"इंटरनेट कनेक्शन नहीं है"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"विवरण खोलें."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> सेटिंग खोलें."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"सेटिंग के क्रम को बदलें"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पावर मेन्यू"</string>
@@ -880,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ऐप्लिकेशन चालू है</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ऐप्लिकेशन चालू हैं</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ये ऐप्लिकेशन चालू हैं"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"बंद करें"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"रुका हुआ है"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"कॉपी करें"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"कॉपी किया गया"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> से"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"कॉपी किया गया यूज़र इंटरफ़ेस (यूआई) खारिज करें"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 51b6131..da84b86 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Dopusti"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Želite li promijeniti jezik sustava u <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Drugi uređaj zatražio je promjenu jezika sustava"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Promijeni jezik"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Zadrži trenutačni jezik"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Dopustiti bežično otklanjanje pogrešaka na ovoj mreži?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Naziv mreže (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fija (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Uvijek dopusti na ovoj mreži"</string>
@@ -241,7 +237,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Svjetlina"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija boja"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korekcija boja"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string>
@@ -467,7 +462,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nećete čuti sljedeći alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Brze postavke, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Žarišna točka"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Poslovni profil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Zabava za neke, ali ne za sve"</string>
@@ -648,7 +642,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Prijavljeni ste kao <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"odaberi korisnika"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nema interneta"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Otvaranje pojedinosti."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvaranje postavki za <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Uređivanje redoslijeda postavki."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Izbornik tipke za uključivanje/isključivanje"</string>
@@ -891,13 +884,23 @@
<item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacija</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zaustavi"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Zaustavljeno"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Iz aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Odbaci kopiranje korisničkog sučelja"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index d6430f2..30a5be8 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Engedélyezés"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Az USB hibakeresése nem engedélyezett"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Kívánja <xliff:g id="LANGUAGE">%1$s</xliff:g> nyelvre módosítani a rendszer nyelvét?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Egy másik eszköz a rendszer nyelvének módosítását kéri"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Nyelvmódosítás"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Aktuális nyelv megtartása"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Engedélyezi a vezeték nélküli hibakeresést ezen a hálózaton?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Hálózat neve (SSID):\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-cím (BSSID):\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Mindig engedélyezze ezen a hálózaton"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Fényerő"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Színek invertálása"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Színjavítás"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"További beállítások"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Felhasználói beállítások"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Kész"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bezárás"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nem fogja hallani az ébresztést ekkor: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"ekkor: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"ezen a napon: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Gyorsbeállítások – <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Munkaprofil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Egyeseknek tetszik, másoknak nem"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Bejelentkezve mint <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"felhasználó kiválasztása"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nincs internetkapcsolat"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"A részletek megnyitása."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"A(z) <xliff:g id="ID_1">%s</xliff:g> beállításainak megnyitása."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Beállítások sorrendjének szerkesztése."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Bekapcsológombhoz tartozó menü"</string>
@@ -884,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktív alkalmazás</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktív alkalmazás</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktív alkalmazások"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Leállítás"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Leállítva"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Másolás"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Másolva"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Forrás: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Másolási UI elvetése"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Vágólapra másolt szöveg szerkesztése"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Vágólapra másolt kép szerkesztése"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Küldés közeli eszközre"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index daa48f7..443da54 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Թույլատրել"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-ով վրիպազերծումը թույլատրված չէ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Ընթացիկ հաշվի միջոցով չեք կարող միացնել USB-ով վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշիվ:"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Դարձնե՞լ համակարգի լեզուն <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Մեկ այլ սարք համակարգի լեզվի փոփոխության հարցում է ուղարկել"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Փոխել լեզուն"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Թողնել ընթացիկ լեզուն"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Թույլատրե՞լ անլար վրիպազերծումն այս ցանցում"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ցանցի անվանումը (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-ի հասցեն (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Միշտ թույլատրել այս ցանցում"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Պայծառություն"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Գունաշրջում"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Գունաշտկում"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Հավելյալ կարգավորումներ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Օգտատիրոջ կարգավորումներ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Պատրաստ է"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Փակել"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Ժամը <xliff:g id="WHEN">%1$s</xliff:g>-ի զարթուցիչը չի զանգի"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Արագ կարգավորումներ, <xliff:g id="TITLE">%s</xliff:g>:"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Թեժ կետ"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Աշխատանքային պրոֆիլ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Զվարճանք մեկ՝ որոշակի մարդու համար"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Մուտք է գործել որպես <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ընտրել օգտատեր"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Ինտերնետ կապ չկա"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Բացել մանրամասները:"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Բացել <xliff:g id="ID_1">%s</xliff:g> կարգավորումները:"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Խմբագրել կարգավորումների հերթականությունը:"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Սնուցման կոճակի ընտրացանկ"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ակտիվ հավելված</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ակտիվ հավելված</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ակտիվ հավելվածներ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Դադարեցնել"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Կանգնեցված է"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Պատճենել"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Պատճենվեց"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածից"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Փակել պատճենների միջերեսը"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index dd1a2fa..c7339c7 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Izinkan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Debug USB tidak diizinkan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Ingin mengubah bahasa sistem menjadi <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Perubahan bahasa sistem diminta oleh perangkat lain"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Ubah bahasa"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Pertahankan bahasa"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Izinkan proses debug nirkabel di perangkat ini?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nama Jaringan (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAlamat Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Selalu izinkan di jaringan ini"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kecerahan"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversi warna"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Koreksi warna"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Setelan lainnya"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setelan pengguna"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Anda tidak akan mendengar alarm berikutnya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"pukul <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Setelan Cepat, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil kerja"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Tidak semua orang menganggapnya baik"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Login sebagai <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"memilih pengguna"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Tidak ada internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Buka detail."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Buka setelan <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit urutan setelan."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu daya"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplikasi aktif</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplikasi aktif</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplikasi aktif"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Berhenti"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Dihentikan"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Salin"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Disalin"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Dari <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Tutup UI salin"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 624dca7..eddd246 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Leyfa"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-villuleit ekki leyfð"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Notandinn sem er skráður inn í þetta tæki núna getur ekki kveikt á USB-villuleit. Til þess að nota þennan eiginleika skaltu skipta yfir í aðalnotandann."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Viltu breyta tungumáli kerfis í <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Beiðni frá öðru tæki um að breyta tungumáli kerfis"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Breyta tungumáli"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Halda núverandi tungumáli"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Viltu leyfa þráðlausa villuleit á þessu neti?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Heiti netkerfis (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi vistfang (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Leyfa alltaf á þessu neti"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Birtustig"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Umsnúningur lita"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Litaleiðrétting"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Fleiri stillingar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Notandastillingar"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Lokið"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Loka"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Ekki mun heyrast í vekjaranum <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Flýtistillingar, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Heitur reitur"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Vinnusnið"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Þetta er ekki allra"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Skráð(ur) inn sem <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"velja notanda"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Engin nettenging"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Opna upplýsingasíðu."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Opna <xliff:g id="ID_1">%s</xliff:g> stillingar."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Breyta röð stillinga."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aflrofavalmynd"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> virkt forrit</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> virk forrit</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Virk forrit"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stöðva"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stöðvað"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Afrita"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Afritað"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Frá <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Loka afriti notendaviðmóts"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index b437bb1..6a07f79 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Consenti"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Debug USB non consentito"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Vuoi cambiare la lingua di sistema con la lingua <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Cambio della lingua di sistema richiesto da un altro dispositivo"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Cambia lingua"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mantieni lingua attuale"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Consentire il debug wireless su questa rete?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome della rete (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nIndirizzo Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Consenti sempre su questa rete"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosità"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversione dei colori"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correzione del colore"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Altre impostazioni"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Impostazioni utente"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fine"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Chiudi"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Non sentirai la tua prossima sveglia <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"alle <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Impostazioni rapide: <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profilo di lavoro"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Il divertimento riservato a pochi eletti"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Accesso eseguito come <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"selezionare l\'utente"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nessuna connessione a Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Apri i dettagli."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Apri le impostazioni <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifica l\'ordine delle impostazioni."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu del tasto di accensione"</string>
@@ -884,6 +877,8 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> app attiva</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> app attive</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"App attive"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Interrompi"</string>
<!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
@@ -893,4 +888,11 @@
<!-- no translation found for clipboard_edit_source (9156488177277788029) -->
<skip />
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignora copia UI"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Modifica testo copiato"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Modifica immagine copiata"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Invia a dispositivo nelle vicinanze"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index f6f094d..f959774 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"יש אישור"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"לא ניתן לבצע ניפוי באגים ב-USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"רוצה לשנות את שפת המערכת ל<xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"התקבלה בקשה ממכשיר אחר לשינוי שפת המערכת"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"שינוי שפה"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"השארת השפה הנוכחית"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"לאשר ניפוי באגים אלחוטי ברשת הזו?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"שם הרשת (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nכתובת Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"לאשר תמיד ברשת הזו"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"בהירות"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"היפוך צבעים"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"תיקון צבע"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"הגדרות נוספות"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"הגדרות המשתמש"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"בוצע"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"סגירה"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"לא ניתן יהיה לשמוע את ההתראה הבאה שלך <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"בשעה <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"ב-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"הגדרות מהירות, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"נקודת אינטרנט (hotspot)"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"פרופיל עבודה"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"מהנה בשביל חלק מהאנשים, אבל לא בשביל כולם"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"בוצעה כניסה בתור <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"בחירת משתמש"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"אין אינטרנט"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"פתיחת פרטים."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"פתיחת הגדרות של <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"עריכת סדר ההגדרות."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"תפריט הפעלה"</string>
@@ -898,13 +891,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> אפליקציות פעילות</item>
<item quantity="one">אפליקציה פעילה אחת (<xliff:g id="COUNT_0">%s</xliff:g>)</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"אפליקציות פעילות"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"עצירה"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"הופסקה"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"העתקה"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"הועתק"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"המקור: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"ביטול של העתקת ממשק המשתמש"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 4a57a0b..05ddace 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"許可"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB デバッグは許可されていません"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"このデバイスに現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"システム言語を<xliff:g id="LANGUAGE">%1$s</xliff:g>に変更しますか?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"他のデバイスからシステム言語の変更が要求されました"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"言語を変更"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"現在の言語を変更しない"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"このネットワークでワイヤレス デバッグを許可しますか?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ネットワーク名(SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi アドレス(BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"このネットワークで常に許可する"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"画面の明るさ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"色反転"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色補正"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"詳細設定"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ユーザー設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完了"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"閉じる"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"次回のアラーム(<xliff:g id="WHEN">%1$s</xliff:g>)は鳴りません"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"クイック設定、<xliff:g id="TITLE">%s</xliff:g>。"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"アクセスポイント"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"仕事用プロファイル"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"一部の方のみお楽しみいただける限定公開ツール"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> としてログインします"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ユーザーを選択"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"インターネットに接続されていません"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"詳細情報を開きます。"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> の設定を開きます。"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"設定の順序を編集します。"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源ボタン メニュー"</string>
@@ -884,13 +877,20 @@
<item quantity="other">有効なアプリ: <xliff:g id="COUNT_1">%s</xliff:g> 個</item>
<item quantity="one">有効なアプリ: <xliff:g id="COUNT_0">%s</xliff:g> 個</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"有効なアプリ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"停止中"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"コピー"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"コピーしました"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> から"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"コピー UI を閉じる"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"コピーしたテキストを編集"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"コピーした画像を編集"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"付近のデバイスに送信"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index d02a946..cf77cac 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"დაშვება"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ხარვეზების გამართვა ნებადართული არაა"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ამ მოწყობილობაზე ამჟამად შესულ მომხმარებელს არ შეუძლია USB ხარვეზების გამართვის ფუნქციის ჩართვა. ამ ფუნქციის გამოსაყენებლად, მიუერთდით მთავარ მომხმარებელს."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"გსურთ, სისტემის ენა შეიცვალოს და გახდეს <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"სისტემის ენის შეცვლა მოითხოვა სხვა მოწყობილობამ"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ენის შეცვლა"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"მიმდინარე ენის დატოვება"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"დაუშვებთ ამ ქსელში შეცდომების უსადენო გამართვას?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ქსელის სახელი (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi მისამართი (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ყოველთვის დაშვება ამ ქსელში"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"განათება"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ფერთა ინვერსია"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ფერთა კორექცია"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"დამატებითი პარამეტრები"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"მომხმარებლის პარამეტრები"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"დასრულდა"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"დახურვა"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"ვერ გაიგონებთ მომდევნო მაღვიძარას <xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"სწრაფი პარამეტრები, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"წვდომის წერტილი"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"სამსახურის პროფილი"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"ზოგისთვის გასართობია, მაგრამ არა ყველასთვის"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"შესული ხართ, როგორც <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"მომხმარებლის არჩევა"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ინტერნეტ-კავშირი არ არის"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"დეტალების გახსნა."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> პარამეტრების გახსნა."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"პარამეტრების მიმდევრობის რედაქტირება."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ჩართვის მენიუ"</string>
@@ -884,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> აქტიური აპი</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> აქტიური აპი</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"აქტიური აპები"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"შეწყვეტა"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"შეწყვეტილია"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"კოპირება"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"კოპირებულია"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g>-დან"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"მომხმარებლის ინტერფეისის ასლის გაუქმება"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"კოპირებული ტექსტის რედაქტირება"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"კოპირებული სურათის რედაქტირება"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ახლომახლო მოწყობილობაზე გაგზავნა"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index c4332fc..32d2e51 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Рұқсат беру"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB арқылы түзетуге рұқсат етілмеген"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Бұл құрылғыға қазір кірген пайдаланушы USB арқылы түзетуді іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Жүйе тілін басқа тілге (<xliff:g id="LANGUAGE">%1$s</xliff:g>) ауыстырғыңыз келе ме?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Басқа құрылғыдан жүйе тілін өзгерту туралы сұрау жіберілді."</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Тілді өзгерту"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Қазіргі тіл тұра берсін"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Бұл желіде сымсыз түзетуге рұқсат етілсін бе?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Желі атауы (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi мекенжайы (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Осы желіде үнемі рұқсат ету"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Жарықтығы"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Түс инверсиясы"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Түсті түзету"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Қосымша параметрлер"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пайдаланушы параметрлері"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Дайын"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Жабу"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Келесі <xliff:g id="WHEN">%1$s</xliff:g> дабылыңызды есітпейсіз"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Жылдам параметрлер, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Хотспот"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Жұмыс профилі"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Кейбіреулерге қызық, бірақ барлығына емес"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ретінде кірдіңіз"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"пайдаланушыны таңдаңыз"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Интернетпен байланыс жоқ"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Мәліметтерді ашу."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> параметрлерін ашу."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Параметрлер тәртібін өзгерту."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Қуат мәзірі"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> белсенді қолданба</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> белсенді қолданба</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Белсенді қолданбалар"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Тоқтату"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Тоқтатылған"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Көшіру"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Көшірілді"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> қолданбасынан"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Көшіру интерфейсін жабу"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 7ac68e3..581d3e6 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"អនុញ្ញាត"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"មិនអនុញ្ញាតការកែកំហុសតាម USB ទេ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"អ្នកប្រើដែលបច្ចុប្បន្នបានចូលគណនីនៅលើឧបករណ៍នេះមិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"តើអ្នកចង់ប្ដូរភាសាប្រព័ន្ធទៅភាសា<xliff:g id="LANGUAGE">%1$s</xliff:g>ដែរទេ?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"ការប្ដូរភាសាប្រព័ន្ធដែលបានស្នើសុំដោយឧបករណ៍ផ្សេងទៀត"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ប្ដូរភាសា"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"រក្សាភាសាបច្ចុប្បន្ន"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"អនុញ្ញាតការជួសជុលដោយឥតខ្សែនៅលើបណ្ដាញនេះឬ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ឈ្មោះបណ្ដាញ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nអាសយដ្ឋាន Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"អនុញ្ញាតនៅលើបណ្ដាញនេះជានិច្ច"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ពន្លឺ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ការបញ្ច្រាសពណ៌"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ការកែតម្រូវពណ៌"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"ការកំណត់ច្រើនទៀត"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ការកំណត់អ្នកប្រើប្រាស់"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"រួចរាល់"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"បិទ"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"អ្នកនឹងមិនលឺម៉ោងរោទ៍ <xliff:g id="WHEN">%1$s</xliff:g> បន្ទាប់របស់អ្នកទេ"</string>
<string name="alarm_template" msgid="2234991538018805736">"នៅ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"នៅ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ការកំណត់រហ័ស <xliff:g id="TITLE">%s</xliff:g>។"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ហតស្ប៉ត"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ប្រវត្តិរូបការងារ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"ល្អសម្រាប់អ្នកប្រើមួយចំនួន តែមិនសម្រាប់គ្រប់គ្នាទេ"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"បានចូលជា <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ជ្រើសរើសអ្នកប្រើប្រាស់"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"គ្មានអ៊ីនធឺណិតទេ"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"បើកព័ត៌មានលម្អិត"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"បើការកំណត់ <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"កែលំដាប់ការកំណត់"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ម៉ឺនុយថាមពល"</string>
@@ -884,13 +877,23 @@
<item quantity="other">កម្មវិធីសកម្ម <xliff:g id="COUNT_1">%s</xliff:g></item>
<item quantity="one">កម្មវិធីសកម្ម <xliff:g id="COUNT_0">%s</xliff:g></item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"កម្មវិធីសកម្ម"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ឈប់"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"បានឈប់"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ចម្លង"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"បានចម្លង"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"ពី <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"ច្រានចោល UI ចម្លង"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index dbf4f16..f1428a0 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ಪ್ರಕಾಶಮಾನ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ಕಲರ್ ಇನ್ವರ್ಶನ್"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ಬಣ್ಣದ ತಿದ್ದುಪಡಿ"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ಬಳಕೆದಾರರ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ಮುಗಿದಿದೆ"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ಮುಚ್ಚಿರಿ"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"ನಿಮ್ಮ ಮುಂದಿನ <xliff:g id="WHEN">%1$s</xliff:g> ಅಲಾರಮ್ ಅನ್ನು ನೀವು ಆಲಿಸುವುದಿಲ್ಲ"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> ರಲ್ಲಿ"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> ರಂದು"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ಹಾಟ್ಸ್ಪಾಟ್"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"ಕೆಲವರಿಗೆ ಮೋಜು ಆಗಿದೆ ಎಲ್ಲರಿಗೆ ಇಲ್ಲ"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ಅವರಂತೆ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ಬಳಕೆದಾರರನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ಸೆಟ್ಟಿಂಗ್ಗಳ ಕ್ರಮವನ್ನು ಎಡಿಟ್ ಮಾಡಿ."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ಪವರ್ ಮೆನು"</string>
@@ -880,13 +877,20 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ಸಕ್ರಿಯ ಆ್ಯಪ್ಗಳು</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ಸಕ್ರಿಯ ಆ್ಯಪ್ಗಳು</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ಸಕ್ರಿಯ ಆ್ಯಪ್ಗಳು"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ನಿಲ್ಲಿಸಿ"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"ನಿಲ್ಲಿಸಿದೆ"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ನಕಲಿಸಿ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ನಕಲಿಸಲಾಗಿದೆ"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> ನಿಂದ"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI ನಕಲನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"ನಕಲಿಸಿದ ಪಠ್ಯವನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"ನಕಲಿಸಿದ ಚಿತ್ರವನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಿ"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index eed00ee..02246b4 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"허용"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB 디버깅이 허용되지 않음"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"시스템 언어를 <xliff:g id="LANGUAGE">%1$s</xliff:g>로 변경하시겠습니까?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"다른 기기에서 시스템 언어 변경을 요청함"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"언어 변경"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"현재 언어 유지"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"이 네트워크에서 무선 디버깅을 허용하시겠습니까?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"네트워크 이름(SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi 주소(BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"이 네트워크에서 항상 허용"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"밝기"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"색상 반전"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"색상 보정"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"설정 더보기"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"사용자 설정"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"완료"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"닫기"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g>에 다음 알람을 들을 수 없습니다."</string>
<string name="alarm_template" msgid="2234991538018805736">"시간: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"일시: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"빠른 설정하기, <xliff:g id="TITLE">%s</xliff:g>"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"핫스팟"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"직장 프로필"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"마음에 들지 않을 수도 있음"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g>(으)로 로그인됨"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"사용자 선택"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"인터넷 연결 없음"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"세부정보 열기"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> 설정 열기"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"설정 순서 수정"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"전원 메뉴"</string>
@@ -884,13 +877,23 @@
<item quantity="other">활성 상태의 앱 <xliff:g id="COUNT_1">%s</xliff:g>개</item>
<item quantity="one">활성 상태의 앱 <xliff:g id="COUNT_0">%s</xliff:g>개</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"활성 상태의 앱"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"중지"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"중지됨"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"복사"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"복사됨"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"복사한 위치: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI 복사 닫기"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 343d52e..c8c56ca 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Уруксат берүү"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB мүчүлүштүктөрүн оңдоого уруксат жок"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү аныктоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Тутум тилин <xliff:g id="LANGUAGE">%1$s</xliff:g> тилине өзгөртөсүзбү?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Тутум тилин өзгөртүү сурамы башка түзмөктөн жөнөтүлдү"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Тилди өзгөртүү"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Учурдагы тилди калтыруу"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Ушул тармакта мүчүлүштүктөрдү Wi-Fi аркылуу аныктоого уруксат бересизби?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Тармактын аталышы (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi дареги (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Бул тармакта ар дайым уруксат берилсин"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Жарыктыгы"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Түстү инверсиялоо"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Түсүн тууралоо"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Дагы жөндөөлөр"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Колдонуучунун жөндөөлөрү"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Бүттү"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Жабуу"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g> боло турган кийинки эскертмени укпайсыз"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> болгондо"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> болгондо"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Ыкчам жөндөөлөр, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Байланыш түйүнү"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Жумуш профили"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Баарына эле жага бербейт"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> аккаунту менен кирди"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"колдонуучуну тандоо"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Интернет жок"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Чоо-жайын ачуу."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> жөндөөлөрүн ачуу."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Жөндөөлөрдүн иретин өзгөртүү."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Кубат баскычынын менюсу"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> жигердүү колдонмо</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> жигердүү колдонмо</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Жигердүү колдонмолор"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Токтотуу"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Токтотулду"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Көчүрүү"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Көчүрүлдү"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> колдонмосунан"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Көчүрмөнү жабуу интерфейси"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 3bdd675..6b96c1a 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ອະນຸຍາດ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"ບໍ່ອະນຸຍາດໃຫ້ມີການແກ້ໄຂບັນຫາ USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ຜູ້ໃຊ້ທີ່ກຳລັງເຂົ້າສູ່ລະບົບອຸປະກອນຢູ່ໃນຕອນນີ້ບໍ່ສາມາດເປີດໃຊ້ການດີບັກ USB ໄດ້. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ສະຫຼັບໄປໃຊ້ຜູ້ໃຊ້ຫຼັກ."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"ທ່ານຕ້ອງການປ່ຽນພາສາລະບົບເປັນ <xliff:g id="LANGUAGE">%1$s</xliff:g> ບໍ່?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"ມີການຮ້ອງຂໍໃຫ້ປ່ຽນພາສາລະບົບໂດຍອຸປະກອນອື່ນ"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ປ່ຽນພາສາ"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"ໃຊ້ພາສາປັດຈຸບັນ"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"ອະນຸຍາດການດີບັກໄຮ້ສາຍຢູ່ເຄືອຂ່າຍນີ້ບໍ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ຊື່ເຄືອຂ່າຍ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nທີ່ຢູ່ Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ອະນຸຍາດຕະຫຼອດຢູ່ເຄືອຂ່າຍນີ້"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ຄວາມແຈ້ງ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ການປີ້ນສີ"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ການແກ້ໄຂສີ"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ຕັ້ງຄ່າຜູ້ໃຊ້"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ແລ້ວໆ"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ປິດ"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"ທ່ານຈະບໍ່ໄດ້ຍິນສຽງໂມງປ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"ເວລາ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"ວັນ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ການຕັ້ງຄ່າດ່ວນ, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ຮັອດສະປອດ"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"ມ່ວນຊື່ນສຳລັບບາງຄົນ ແຕ່ບໍ່ແມ່ນສຳລັບທຸກຄົນ"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"ເຂົ້າສູ່ລະບົບເປັນ <xliff:g id="ID_1">%s</xliff:g> ແລ້ວ"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ເລືອກຜູ້ໃຊ້"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ບໍ່ມີອິນເຕີເນັດ"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"ເປີດລາຍລະອຽດ."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"ເປີດການຕັ້ງຄ່າ <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ແກ້ໄຂລຳດັບການຕັ້ງຄ່າ."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ເມນູເປີດປິດ"</string>
@@ -884,13 +877,20 @@
<item quantity="other">ແອັບທີ່ນຳໃຊ້ຢູ່ <xliff:g id="COUNT_1">%s</xliff:g> ແອັບ</item>
<item quantity="one">ແອັບທີ່ນຳໃຊ້ຢູ່ <xliff:g id="COUNT_0">%s</xliff:g> ແອັບ</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ແອັບທີ່ນຳໃຊ້ຢູ່"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ຢຸດ"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"ຢຸດແລ້ວ"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ສຳເນົາ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ສຳເນົາແລ້ວ"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"ຈາກ <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"ປິດການສຳເນົາສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ໄວ້"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"ແກ້ໄຂຂໍ້ຄວາມທີ່ສຳເນົາແລ້ວ"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"ແກ້ໄຂຮູບທີ່ສຳເນົາແລ້ວ"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ສົ່ງໄປຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index ebde4fc..5179ad9 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Leisti"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB derinimas neleidžiamas"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Ar norite pakeisti sistemos kalbą į <xliff:g id="LANGUAGE">%1$s</xliff:g> k.?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Užklausą dėl sistemos kalbos pakeitimo pateikė kitas įrenginys"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Keisti kalbą"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Palikti dabartinę kalbą"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Leisti belaidžio ryšio derinimą prisijungus prie šio tinklo?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tinklo pavadinimas (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\n„Wi‑Fi“ adresas (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Visada leisti naudojant šį tinklą"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Šviesumas"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Spalvų inversija"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Spalvų taisymas"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Daugiau nustatymų"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Naudotojo nustatymai"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Atlikta"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Uždaryti"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Negirdėsite kito signalo <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Spartieji nustatymai, „<xliff:g id="TITLE">%s</xliff:g>“."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Viešosios interneto prieigos taškas"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Darbo profilis"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Smagu, bet ne visada"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Prisijungta kaip <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"pasirinktumėte naudotoją"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nėra interneto ryšio"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Atidaryti išsamią informaciją."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Atidaryti „<xliff:g id="ID_1">%s</xliff:g>“ nustatymus."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Redaguoti nustatymų tvarką."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Įjungimo meniu"</string>
@@ -898,13 +891,20 @@
<item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> aktyvios programos</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktyvių programų</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktyvios programos"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Sustabdyti"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Sustabdyta"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopijuoti"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nukopijuota"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Iš „<xliff:g id="APPNAME">%1$s</xliff:g>“"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Atsisakyti kopijavimo NS"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Redaguoti nukopijuotą tekstą"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Redaguoti nukopijuotą vaizdą"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Siųsti į įrenginį netoliese"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 56b0bcd..63b6b2e 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Atļaut"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB atkļūdošana nav atļauta"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Vai vēlaties mainīt sistēmas valodu uz šādu: <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Sistēmas valodas maiņu pieprasīja cita ierīce."</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Mainīt valodu"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Paturēt pašreizējo valodu"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vai atļaut bezvadu atkļūdošanu šajā tīklā?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tīkla nosaukums (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi adrese (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Vienmēr atļaut šajā tīklā"</string>
@@ -241,7 +237,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Spilgtums"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Krāsu inversija"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Krāsu korekcija"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Vairāk iestatījumu"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Lietotāja iestatījumi"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gatavs"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Aizvērt"</string>
@@ -467,7 +462,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nākamais signāls (<xliff:g id="WHEN">%1$s</xliff:g>) netiks atskaņots."</string>
<string name="alarm_template" msgid="2234991538018805736">"plkst. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Ātrie iestatījumi: <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Tīklājs"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Darba profils"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Jautri dažiem, bet ne visiem"</string>
@@ -648,7 +642,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Pierakstījies kā <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"izvēlēties lietotāju"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nav piekļuves internetam"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Atvērt detalizēto informāciju."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Atvērt <xliff:g id="ID_1">%s</xliff:g> iestatījumus."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Rediģēt iestatījumu secību."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Barošanas izvēlne"</string>
@@ -891,13 +884,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktīva lietotne</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktīvas lietotnes</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktīvās lietotnes"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Apturēt"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Apturēta"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopēt"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nokopēts"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"No lietotnes <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Noraidīt ar kopēšanu saistīto lietotāja saskarnes elementu"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 8e645a3..7642a9a 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дозволи"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отстранувањето грешки на USB не е дозволено"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Дали сакате да го промените системскиот јазик на <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Побарана е промена на системскиот јазик од друг уред"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Промени го јазикот"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Зачувај го тековниот јазик"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Да се дозволи безжично отстранување грешки на мрежава?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Име на мрежата (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi адреса (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Секогаш дозволувај на оваа мрежа"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Осветленост"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверзија на боите"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекција на боите"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Повеќе поставки"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Поставки на корисникот"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Нема да го слушнете следниот аларм <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"во <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"во <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Брзи поставки, <xliff:g id="TITLE">%s</xliff:g>"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Точка на пристап"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Работен профил"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Забава за некои, но не за сите"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Најавени сте како <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"изберете корисник"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Нема интернет"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Отворете ги деталите."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Отворете ги поставките на <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Уредете го редоследот на поставките."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Мени на копчето за вклучување"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> активна апликација</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активни апликации</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активни апликации"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Крај"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Запрено"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копирај"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Од <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Отфрли го корисничкиот интерфејс за копирање"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index e79dd3e..1bde5a0 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"തെളിച്ചം"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"നിറം വിപരീതമാക്കൽ"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"നിറം ശരിയാക്കൽ"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"കൂടുതൽ ക്രമീകരണങ്ങൾ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ഉപയോക്തൃ ക്രമീകരണം"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"പൂർത്തിയാക്കി"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"അടയ്ക്കുക"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g>-നുള്ള നിങ്ങളുടെ അടുത്ത അലാറം കേൾക്കില്ല"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>-ന്"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>-ന്"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ദ്രുത ക്രമീകരണം, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ഹോട്ട്സ്പോട്ട്"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"ചിലർക്ക് വിനോദം, എന്നാൽ എല്ലാവർക്കുമില്ല"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ആയി സൈൻ ഇൻ ചെയ്തു"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ഉപയോക്താവിനെ തിരഞ്ഞെടുക്കുക"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ഇന്റർനെറ്റ് ഇല്ല"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"വിശദാംശങ്ങൾ തുറക്കുക."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ക്രമീകരണം തുറക്കുക."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ക്രമീകരണ ക്രമം എഡിറ്റുചെയ്യുക."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"പവർ മെനു"</string>
@@ -880,13 +877,20 @@
<item quantity="other">സജീവമായ <xliff:g id="COUNT_1">%s</xliff:g> ആപ്പുകൾ</item>
<item quantity="one">സജീവമായ <xliff:g id="COUNT_0">%s</xliff:g> ആപ്പ്</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"സജീവമായ ആപ്പുകൾ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"നിർത്തുക"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"നിർത്തി"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"പകർത്തുക"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"പകർത്തി"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> എന്നതിൽ നിന്ന്"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"പകർപ്പ് UI ഡിസ്മിസ് ചെയ്യുക"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"പകർത്തിയ ടെക്സ്റ്റ് എഡിറ്റ് ചെയ്യുക"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"പകർത്തിയ ചിത്രം എഡിറ്റ് ചെയ്യുക"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"സമീപത്തുള്ള ഉപകരണത്തിലേക്ക് അയയ്ക്കുക"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index c17be82..c63bd3d 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Зөвшөөрөх"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB алдаа засалт хийх боломжгүй"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Та системийн хэлийг <xliff:g id="LANGUAGE">%1$s</xliff:g> хэл болгож өөрчлөхийг хүсэж байна уу?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Өөр төхөөрөмжөөс системийн хэлийг өөрчлөх хүсэлт тавьсан"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Хэл солих"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Одоогийн хэлээр байлгах"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Энэ сүлжээн дээр wireless debugging-г зөвшөөрөх үү?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Сүлжээний нэр (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi хаяг (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Энэ сүлжээн дээр үргэлж зөвшөөрөх"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Тодрол"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Өнгө урвуулах"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Өнгөний засвар"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Бусад тохиргоо"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Хэрэглэгчийн тохиргоо"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Дууссан"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Хаах"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g>-т та дараагийн сэрүүлгээ сонсохгүй"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> цагт"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>-т"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Шуурхай тохиргоо, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Сүлжээний цэг"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Ажлын профайл"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Зарим хүнд хөгжилтэй байж болох ч бүх хүнд тийм биш"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g>-р нэвтэрсэн"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"хэрэглэгчийг сонгох"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Интернэт алга"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Дэлгэрэнгүй мэдээллийг нээнэ үү."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> тохиргоог нээнэ үү."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Тохиргооны дарааллыг өөрчилнө үү."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Асаах/унтраах цэс"</string>
@@ -884,13 +877,20 @@
<item quantity="other">Идэвхтэй <xliff:g id="COUNT_1">%s</xliff:g> апп</item>
<item quantity="one">Идэвхтэй <xliff:g id="COUNT_0">%s</xliff:g> апп</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Идэвхтэй аппууд"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Зогсоох"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Зогсоосон"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Хуулах"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Хууллаа"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g>-с"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Хуулах UI-г хаах"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Хуулсан текстийг засах"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Хуулсан зургийг засах"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Ойролцоох төхөөрөмж рүү илгээх"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 36da8df..fca67d2 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"चमक"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"कलर इन्व्हर्जन"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"रंग सुधारणा"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"अधिक सेटिंग्ज"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"वापरकर्ता सेटिंग्ज"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"पूर्ण झाले"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बंद करा"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"तुम्ही तुमचा <xliff:g id="WHEN">%1$s</xliff:g> वाजता होणारा पुढील अलार्म ऐकणार नाही"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> वाजता"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> रोजी"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"द्रुत सेटिंग्ज, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"हॉटस्पॉट"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"कार्य प्रोफाईल"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"सर्वांसाठी नाही तर काहींसाठी मजेदार असू शकते"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> म्हणून साइन इन केले"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"वापरकर्ता निवडा"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"इंटरनेट नाही"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"तपशील उघडा."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> सेटिंग्ज उघडा."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"सेटिंग्जचा क्रम संपादित करा."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पॉवर मेनू"</string>
@@ -880,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> अॅक्टिव्ह ॲप्स</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> अॅक्टिव्ह ॲप</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"अॅक्टिव्ह ॲप्स"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"थांबवा"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"थांबवले"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"कॉपी करा"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"कॉपी केले"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> वरून"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"कॉपी केलेले UI डिसमिस करा"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"कॉपी केलेला मजकूर संपादित करा"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"कॉपी केलेली इमेज संपादित करा"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"जवळपासच्या डिव्हाइसवर पाठवा"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 13525e7..b87a79c 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Benarkan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Penyahpepijatan USB tidak dibenarkan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Adakah anda ingin menukar bahasa sistem kepada <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Permintaan pertukaran bahasa sistem oleh peranti lain"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Tukar bahasa"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Kekalkan bahasa semasa"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Benarkan penyahpepijatan wayarles pada rangkaian ini?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nama Rangkaian (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAlamat Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Sentiasa benarkan pada rangkaian ini"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kecerahan"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Penyongsangan warna"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Pembetulan warna"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Lagi tetapan"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Tetapan pengguna"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Anda tidak akan mendengar penggera yang seterusnya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Tetapan Pantas, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Tempat liputan"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil kerja"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Menarik untuk sesetengah orang tetapi bukan untuk semua"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Dilog masuk sebagai <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"pilih pengguna"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Tiada Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Buka butiran."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Buka tetapan <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edit susunan tetapan."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu kuasa"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apl aktif</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> apl aktif</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apl aktif"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Berhenti"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Dihentikan"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Salin"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Disalin"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Daripada <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ketepikan penyalinan UI"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 837a550..0248d10 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ခွင့်ပြုရန်"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB အမှားပြင်ဆင်ခြင်း ခွင့်မပြုပါ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ဤစက်ပစ္စည်းသို့ လက်ရှိဝင်ရောက်ထားသည့် အသုံးပြုသူသည် USB အမှားပြင်ဆင်ခြင်းကို ဖွင့်၍မရပါ။ ဤဝန်ဆောင်မှုကို အသုံးပြုရန် အဓိကအသုံးပြုသူအဖြစ်သို့ ပြောင်းပါ။"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"စနစ်၏ ဘာသာစကားကို <xliff:g id="LANGUAGE">%1$s</xliff:g> သို့ ပြောင်းလိုသလား။"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"စက်နောက်တစ်ခုက စနစ်၏ ဘာသာစကားပြောင်းရန် တောင်းဆိုထားသည်"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ဘာသာစကားပြောင်းရန်"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"လက်ရှိဘာသာစကားဆက်သုံးရန်"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"ဤကွန်ရက်တွင် ကြိုးမဲ့ အမှားရှာပြင်ခြင်းကို ခွင့်ပြုမလား။"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ကွန်ရက်အမည် (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi လိပ်စာ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ဤကွန်ရက်ကို အမြဲခွင့်ပြုပါ"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"အလင်းတောက်ပမှု"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"အရောင်ပြောင်းပြန်ပြုလုပ်ရန်"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"အရောင် အမှန်ပြင်ခြင်း"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"နောက်ထပ် ဆက်တင်များ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"အသုံးပြုသူ ဆက်တင်များ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ပြီးပါပြီ"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ပိတ်ရန်"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g> ၌သင့်နောက်ထပ် နှိုးစက်ကို ကြားမည်မဟုတ်ပါ"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> ၌"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> တွင်"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"အမြန်ချိန်ညှိခြင်း၊ <xliff:g id="TITLE">%s</xliff:g>။"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ဟော့စပေါ့"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"အလုပ် ပရိုဖိုင်"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"အချို့သူများ အတွက် ပျော်စရာ ဖြစ်ပေမဲ့ အားလုံး အတွက် မဟုတ်ပါ"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> အဖြစ် လက်မှတ်ထိုးဝင်ထားသည်။"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"အသုံးပြုသူရွေးရန်"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"အင်တာနက် မရှိပါ"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"အသေးစိတ်များကို ဖွင့်ပါ။"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ဆက်တင်များကို ဖွင့်ပါ။"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ဆက်တင်များ၏ အစီအစဉ်ကို တည်းဖြတ်ပါ။"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ပါဝါမီနူး"</string>
@@ -884,13 +877,23 @@
<item quantity="other">ပွင့်နေသည့်အက်ပ် <xliff:g id="COUNT_1">%s</xliff:g> ခု</item>
<item quantity="one">ပွင့်နေသည့်အက်ပ် <xliff:g id="COUNT_0">%s</xliff:g> ခု</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ပွင့်နေသည့်အက်ပ်များ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ရပ်ရန်"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"ရပ်ထားသည်"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"မိတ္တူကူးရန်"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ကူးပြီးပါပြီ"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> ထံမှ"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI မိတ္တူမကူးတော့ရန်"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 68af3d5..76cfef5 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Tillat"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-feilsøking er ikke tillatt"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Vil du bytte systemspråk til <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Bytte av systemspråk er forespurt av en annen enhet"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Bytt språk"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Behold gjeldende språk"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vil du tillate trådløs feilsøking på dette nettverket?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nettverksnavn (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adresse (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Tillat alltid på dette nettverket"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Lysstyrke"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Fargeinvertering"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Fargekorrigering"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere innstillinger"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brukerinnstillinger"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Ferdig"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Lukk"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Du hører ikke neste innstilte alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Hurtiginnstillinger, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Wi-Fi-sone"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Work-profil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Gøy for noen – ikke for alle"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Logget på som <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"velge en bruker"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Ingen internettilkobling"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Åpne informasjonen."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Åpne <xliff:g id="ID_1">%s</xliff:g>-innstillingene."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Endre rekkefølgen på innstillingene."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Av/på-meny"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktive apper</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiv app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktive apper"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stopp"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stoppet"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiér"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiert"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Fra <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Lukk kopi-UI"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 2ca03b6..158a891 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"उज्यालपन"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"कलर इन्भर्सन"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"रङ सच्याउने कार्य"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"थप सेटिङहरू"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"प्रयोगकर्तासम्बन्धी सेटिङ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"भयो"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बन्द गर्नुहोस्"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"तपाईँले आफ्नो अर्को अलार्म <xliff:g id="WHEN">%1$s</xliff:g> सुन्नुहुने छैन"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> मा"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> मा"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"द्रुत सेटिङ, <xliff:g id="TITLE">%s</xliff:g>।"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"कार्य प्रोफाइल"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"केहीका लागि रमाइलो हुन्छ तर सबैका लागि होइन"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> को रूपमा साइन इन गरियो"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"प्रयोगकर्ता छान्नुहोस्"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"इन्टरनेट छैन"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"विवरणहरूलाई खोल्नुहोस्।"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> सम्बन्धी सेटिङहरूलाई खोल्नुहोस्।"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"सेटिङहरूको क्रमलाई सम्पादन गर्नुहोस्।"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पावर मेनु"</string>
@@ -880,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> वटा सक्रिय एप</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> सक्रिय एप</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"सक्रिय एपहरू"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"रोक्नुहोस्"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"रोकिएको छ"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"कपी गर्नुहोस्"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"कपी गरियो"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> बाट"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"कपी UI खारेज गर्नुहोस्"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"कपी गरिएको टेक्स्ट सम्पादन गर्नुहोस्"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"कपी गरिएको फोटो सम्पादन गर्नुहोस्"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"नजिकैको डिभाइसमा पठाउनुहोस्"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml
index b318bbc..f1e93c2 100644
--- a/packages/SystemUI/res/values-night/colors.xml
+++ b/packages/SystemUI/res/values-night/colors.xml
@@ -67,10 +67,10 @@
<!-- media output dialog-->
<color name="media_dialog_background">@android:color/system_neutral1_900</color>
- <color name="media_dialog_active_item_main_content">@android:color/system_accent2_800</color>
- <color name="media_dialog_inactive_item_main_content">@android:color/system_accent1_100</color>
- <color name="media_dialog_item_status">@android:color/system_accent1_100</color>
- <color name="media_dialog_item_background">@android:color/system_neutral2_800</color>
+ <color name="media_dialog_active_item_main_content">@android:color/system_neutral1_900</color>
+ <color name="media_dialog_inactive_item_main_content">@android:color/system_neutral1_900</color>
+ <color name="media_dialog_item_status">@android:color/system_neutral1_900</color>
+ <color name="media_dialog_item_background">@android:color/system_accent2_50</color>
<!-- Biometric dialog colors -->
<color name="biometric_dialog_gray">#ffcccccc</color>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index a5a1b81..f85bbee 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Toestaan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-foutopsporing niet toegestaan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet aanzetten. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Wil je de systeemtaal wijzigen naar het <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Wijziging van systeemtaal aangevraagd door een ander apparaat"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Taal wijzigen"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Huidige taal houden"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Draadloze foutopsporing toestaan in dit netwerk?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Netwerknaam (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWifi-adres (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Altijd toestaan in dit netwerk"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helderheid"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kleurinversie"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Kleurcorrectie"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellingen"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikersinstellingen"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sluiten"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"om <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Snelle instellingen, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Werkprofiel"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Leuk voor sommige gebruikers, maar niet voor iedereen"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Ingelogd als <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"gebruiker kiezen"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Geen internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Details openen."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g>-instellingen openen."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Volgorde van instellingen bewerken."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aan/uit-menu"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> actieve apps</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> actieve app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Actieve apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stoppen"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Gestopt"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiëren"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Gekopieerd"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Uit <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI voor kopiëren sluiten"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index f1698f4..dab199b 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USBରେ ଡିବଗ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ସମ୍ପ୍ରତି ସାଇନ୍-ଇନ୍ କରିଥିବା ୟୁଜର୍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍ରେ ସାଇନ୍-ଇନ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"ଆପଣ ସିଷ୍ଟମ ଭାଷା <xliff:g id="LANGUAGE">%1$s</xliff:g>କୁ ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ଚାହାଁନ୍ତି?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"ଅନ୍ୟ ଏକ ଡିଭାଇସ ଦ୍ୱାରା ସିଷ୍ଟମ ଭାଷା ପରିବର୍ତ୍ତନ ପାଇଁ ଅନୁରୋଧ କରାଯାଇଛି"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ଭାଷା ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"ବର୍ତ୍ତମାନର ଭାଷା ରଖନ୍ତୁ"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"ଏହି ନେଟୱାର୍କରେ ୱାୟାରଲେସ୍ ଡିବଗିଂ ପାଇଁ ଅନୁମତି ଦେବେ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ନେଟୱାର୍କ ନାମ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nୱାଇଫାଇ ଠିକଣା (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ସର୍ବଦା ଏହି ନେଟୱାର୍କରେ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ଉଜ୍ଜ୍ୱଳତା"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ରଙ୍ଗ ଇନଭାର୍ସନ"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ରଙ୍ଗ ସଂଶୋଧନ"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"ଅଧିକ ସେଟିଂସ୍"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ଉପଯୋଗକର୍ତ୍ତା ସେଟିଂସ୍"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ହୋଇଗଲା"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ବନ୍ଦ କରନ୍ତୁ"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g>ବେଳେ ଆପଣ ନିଜର ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ଶୁଣିପାରିବେ ନାହିଁ"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> ହେଲେ"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> ବେଳେ"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"କ୍ୱିକ୍ ସେଟିଂସ୍, <xliff:g id="TITLE">%s</xliff:g>।"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ହଟସ୍ପଟ୍"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"କେତେକଙ୍କ ପାଇଁ ମଜାଦାର, କିନ୍ତୁ ସମସ୍ତଙ୍କ ପାଇଁ ନୁହେଁ"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ଭାବରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ଉପଯୋଗକର୍ତ୍ତା ବାଛନ୍ତୁ"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"କୌଣସି ଇଣ୍ଟରନେଟ୍ କନେକ୍ସନ୍ ନାହିଁ"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"ବିବରଣୀ ଖୋଲନ୍ତୁ"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ସେଟିଙ୍ଗର କ୍ରମ ସଂଶୋଧନ କରନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ପାୱାର ମେନୁ"</string>
@@ -884,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g>ଟି ସକ୍ରିୟ ଆପ</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g>ଟି ସକ୍ରିୟ ଆପ</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ସକ୍ରିୟ ଆପଗୁଡ଼ିକ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ବନ୍ଦ କରନ୍ତୁ"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"ବନ୍ଦ ହୋଇଛି"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"କପି କରନ୍ତୁ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"କପି କରାଯାଇଛି"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g>ରୁ"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"କପି କରାଯାଇଥିବା UIକୁ ଖାରଜ କରନ୍ତୁ"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"କପି କରାଯାଇଥିବା ଟେକ୍ସଟକୁ ଏଡିଟ କରନ୍ତୁ"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"କପି କରାଯାଇଥିବା ଇମେଜକୁ ଏଡିଟ କରନ୍ତୁ"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ନିକଟସ୍ଥ ଡିଭାଇସକୁ ପଠାନ୍ତୁ"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 72811c4..20b5bf2 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ਕਰਨ ਦਿਓ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"ਕੀ ਤੁਸੀਂ ਸਿਸਟਮ ਦੀ ਭਾਸ਼ਾ ਬਦਲ ਕੇ <xliff:g id="LANGUAGE">%1$s</xliff:g> ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ ਵੱਲੋਂ ਸਿਸਟਮ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਗਈ"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ਭਾਸ਼ਾ ਬਦਲੋ"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"ਮੌਜੂਦਾ ਭਾਸ਼ਾ ਰੱਖੋ"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"ਕੀ ਇਸ ਨੈੱਟਵਰਕ \'ਤੇ ਵਾਇਰਲੈੱਸ ਡੀਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ਨੈੱਟਵਰਕ ਨਾਮ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nਵਾਈ-ਫਾਈ ਪਤਾ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ਇਸ ਨੈੱਟਵਰਕ \'ਤੇ ਹਮੇਸ਼ਾਂ ਆਗਿਆ ਦਿਓ"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ਚਮਕ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ਰੰਗ ਪਲਟਨਾ"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ਰੰਗ ਸੁਧਾਈ"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ਵਰਤੋਂਕਾਰ ਸੈਟਿੰਗਾਂ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ਹੋ ਗਿਆ"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ਬੰਦ ਕਰੋ"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"ਤੁਸੀਂ <xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ ਆਪਣਾ ਅਗਲਾ ਅਲਾਰਮ ਨਹੀਂ ਸੁਣੋਗੇ"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ, <xliff:g id="TITLE">%s</xliff:g>।"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ਹੌਟਸਪੌਟ"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"ਕੁਝ ਵਾਸਤੇ ਤਾਂ ਮਜ਼ੇਦਾਰ ਹੈ ਲੇਕਿਨ ਸਾਰਿਆਂ ਵਾਸਤੇ ਨਹੀਂ"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ਵਜੋਂ ਸਾਈਨ ਇਨ ਕੀਤਾ"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"ਵਰਤੋਂਕਾਰ ਚੁਣੋ"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ਇੰਟਰਨੈੱਟ ਨਹੀਂ।"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"ਵੇਰਵੇ ਖੋਲ੍ਹੋ।"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ।"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ਸੈਟਿੰਗਾਂ ਦੇ ਕ੍ਰਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ।"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ਪਾਵਰ ਮੀਨੂ"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ਕਿਰਿਆਸ਼ੀਲ ਐਪ</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ਕਿਰਿਆਸ਼ੀਲ ਐਪਾਂ</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ਕਿਰਿਆਸ਼ੀਲ ਐਪਾਂ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ਬੰਦ ਕਰੋ"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"ਬੰਦ ਹੈ"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ਕਾਪੀ ਕਰੋ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ਕਾਪੀ ਕੀਤੀ ਗਈ"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> ਤੋਂ"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"ਕਾਪੀ ਕੀਤੇ UI ਨੂੰ ਖਾਰਜ ਕਰੋ"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 783d154..4572922 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Zezwalaj"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Debugowanie USB jest niedozwolone"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Użytkownik obecnie zalogowany na tym urządzeniu nie może włączyć debugowania USB. Aby użyć tej funkcji, przełącz się na użytkownika głównego."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Czy chcesz zmienić język systemu na <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Inny użytkownik poprosił o zmianę języka systemu"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Zmień język"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Zachowaj bieżący język"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Zezwolić na debugowanie bezprzewodowe w tej sieci?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nazwa sieci (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdres Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Zawsze zezwalaj w tej sieci"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jasność"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Odwrócenie kolorów"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korekcja kolorów"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Więcej ustawień"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ustawienia użytkownika"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotowe"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zamknij"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nie usłyszysz swojego następnego alarmu <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Szybkie ustawienia, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil służbowy"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Dobra zabawa, ale nie dla każdego"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Zalogowany użytkownik: <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"wybrać użytkownika"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Brak internetu"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Otwórz szczegóły."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otwórz ustawienia: <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Edytuj kolejność ustawień."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu zasilania"</string>
@@ -898,13 +891,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktywnej aplikacji</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktywna aplikacja</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktywne aplikacje"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zatrzymaj"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Zatrzymano"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiuj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Skopiowano"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Od: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Zamknij UI kopiowania"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 5af949b..1c902b0 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -37,7 +37,7 @@
<string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"Abrir o app <xliff:g id="APPLICATION">%1$s</xliff:g> para lidar com o <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
<string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"Nenhum apl. instalado funciona com o USB. Saiba mais sobre o acessório em <xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="1236358027511638648">"Acessório USB"</string>
- <string name="label_view" msgid="6815442985276363364">"Visualizar"</string>
+ <string name="label_view" msgid="6815442985276363364">"Ver"</string>
<string name="always_use_device" msgid="210535878779644679">"Sempre abrir o app <xliff:g id="APPLICATION">%1$s</xliff:g> quando <xliff:g id="USB_DEVICE">%2$s</xliff:g> for conectado"</string>
<string name="always_use_accessory" msgid="1977225429341838444">"Sempre abrir o app <xliff:g id="APPLICATION">%1$s</xliff:g> quando <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> for conectado"</string>
<string name="usb_debugging_title" msgid="8274884945238642726">"Permitir a depuração USB?"</string>
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Quer mudar o idioma do sistema para <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Mudança do idioma do sistema solicitada por outro dispositivo"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Alterar idioma"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Manter idioma atual"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Permitir a depuração por Wi-Fi nesta rede?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome da rede (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nEndereço do Wi-Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Sempre permitir nesta rede"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção de cor"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais configurações"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Config. do usuário"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fechar"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Você não ouvirá o próximo alarme às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Configurações rápidas, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Ponto de acesso"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de trabalho"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversão para alguns, mas não para todos"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Login efetuado como <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escolher o usuário"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Sem Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Abrir detalhes."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar ordem das configurações."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu liga/desliga"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> app ativo</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps ativos</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativos"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Parar"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Parado"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Do app <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dispensar cópia da IU"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 48d4bde..1562abc 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção da cor"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais definições"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Definições do utilizador"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fechar"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Não vai ouvir o próximo alarme às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"em <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Definições rápidas, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Zona Wi-Fi"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de trabalho"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversão para alguns, mas não para todos"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Sessão iniciada como <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escolher o utilizador"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Sem Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Abrir os detalhes."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir as definições de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar a ordem das definições."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu ligar/desligar"</string>
@@ -880,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> app ativa</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps ativas</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Parar"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Parada"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Da app <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignorar cópia de IU"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 5af949b..1c902b0 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -37,7 +37,7 @@
<string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"Abrir o app <xliff:g id="APPLICATION">%1$s</xliff:g> para lidar com o <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
<string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"Nenhum apl. instalado funciona com o USB. Saiba mais sobre o acessório em <xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="1236358027511638648">"Acessório USB"</string>
- <string name="label_view" msgid="6815442985276363364">"Visualizar"</string>
+ <string name="label_view" msgid="6815442985276363364">"Ver"</string>
<string name="always_use_device" msgid="210535878779644679">"Sempre abrir o app <xliff:g id="APPLICATION">%1$s</xliff:g> quando <xliff:g id="USB_DEVICE">%2$s</xliff:g> for conectado"</string>
<string name="always_use_accessory" msgid="1977225429341838444">"Sempre abrir o app <xliff:g id="APPLICATION">%1$s</xliff:g> quando <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> for conectado"</string>
<string name="usb_debugging_title" msgid="8274884945238642726">"Permitir a depuração USB?"</string>
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Quer mudar o idioma do sistema para <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Mudança do idioma do sistema solicitada por outro dispositivo"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Alterar idioma"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Manter idioma atual"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Permitir a depuração por Wi-Fi nesta rede?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome da rede (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nEndereço do Wi-Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Sempre permitir nesta rede"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção de cor"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais configurações"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Config. do usuário"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fechar"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Você não ouvirá o próximo alarme às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Configurações rápidas, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Ponto de acesso"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Perfil de trabalho"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diversão para alguns, mas não para todos"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Login efetuado como <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"escolher o usuário"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Sem Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Abrir detalhes."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editar ordem das configurações."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu liga/desliga"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> app ativo</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps ativos</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativos"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Parar"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Parado"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Do app <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dispensar cópia da IU"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index c94d0c0..d520d50 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permiteți"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Remedierea erorilor prin USB nu este permisă"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Schimbați limba de sistem la <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Alt dispozitiv solicită schimbarea limbii de sistem"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Schimbați limba"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Păstrați limba actuală"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Permiteți remedierea erorilor wireless în această rețea?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Numele rețelei (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permiteți întotdeauna în această rețea"</string>
@@ -241,7 +237,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminozitate"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversarea culorilor"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corecția culorii"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mai multe setări"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setări de utilizator"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Terminat"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Închideți"</string>
@@ -467,7 +462,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nu veți auzi următoarea alarmă <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"la <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Setări rapide, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil de serviciu"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Distractiv pentru unii, dar nu pentru toată lumea"</string>
@@ -648,7 +642,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Conectat(ă) ca <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"alege utilizatorul"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Fără conexiune la internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Deschideți detaliile."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Deschideți setările <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Editați ordinea setărilor."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meniul de pornire"</string>
@@ -891,13 +884,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> de aplicații active</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicație activă</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicații active"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Opriți"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Oprită"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiați"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"S-a copiat"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Din <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Închideți copierea interfeței de utilizare"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Editați textul copiat"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Editați imaginea copiată"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Trimiteți către un dispozitiv din apropiere"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index db651db..310a87e 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Разрешить"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отладка по USB запрещена"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"В этом аккаунте нельзя включить отладку по USB. Перейдите в аккаунт основного пользователя."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Изменить системный язык на <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Получен запрос на изменение системного языка от другого устройства."</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Изменить язык"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Оставить текущий язык"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Разрешить отладку по Wi-Fi в этой сети?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Название сети (SSID):\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nMAC-адрес точки доступа (BSSID):\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Всегда разрешать отладку в этой сети"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркость"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверсия цветов"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Коррекция цвета"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Настройки"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пользовательские настройки"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыть"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Следующий будильник: <xliff:g id="WHEN">%1$s</xliff:g>. Звук отключен."</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Быстрые настройки, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Точка доступа"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Рабочий профиль"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Внимание!"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Выполнен вход под именем <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"выбрать пользователя"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Нет подключения к Интернету."</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Показать подробности."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Открыть настройки <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Изменить порядок быстрых настроек."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопки питания"</string>
@@ -898,13 +891,23 @@
<item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> активных приложений</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активного приложения</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активные приложения"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Остановить"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Остановлено"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копировать"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скопировано."</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Из приложения \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Закрыть меню копирования"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 56b2522..e730bb0 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ඉඩ දෙන්න"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB නිදොස්කරණය වෙත අවසර නැහැ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"දැනට මෙම උපාංගයට පුරා ඇති පරිශීලකයාට USB නිදොස්කරණය ක්රියාත්මක කළ නොහැක. මෙම විශේෂාංගය භාවිතා කිරීම සඳහා, මූලික පරිශීලකයා වෙත මාරු වෙන්න."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"ඔබට පද්ධති භාෂාව <xliff:g id="LANGUAGE">%1$s</xliff:g> භාෂාවට වෙනස් කිරීමට අවශ්යද?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"වෙනත් උපාංගයකින් පද්ධති භාෂාව වෙනස් කිරීම ඉල්ලා ඇත"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"භාෂාව වෙනස් කරන්න"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"වත්මන් භාෂාව තබා ගන්න"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"මෙම ජාලයේ නොරැහැන් නිදොස්කරණය ඉඩ දෙන්නද?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ජාල නම (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi ලිපිනය (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"මෙම ජාලයේ සැමවිට ඉඩ දෙන්න"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"දීප්තිමත් බව"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"වර්ණ අපවර්තනය"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"වර්ණ නිවැරදි කිරීම"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"තව සැකසීම්"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"පරිශීලක සැකසීම්"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"නිමයි"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"වසන්න"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"ඔබට ඔබේ ඊළඟ එලාමය <xliff:g id="WHEN">%1$s</xliff:g> නොඇසෙනු ඇත"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> ට"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> දී"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ඉක්මන් සැකසුම්, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"හොට්ස්පොට්"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"කාර්යාල පැතිකඩ"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"සමහරක් දේවල් වලට විනෝදයි, නමුත් සියල්ලටම නොවේ"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ලෙස පුරන්න"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"පරිශීලක තෝරන්න"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"අන්තර්ජාලය නැත"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"විස්තර විවෘත කරන්න."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> සැකසීම් විවෘත කරන්න."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"සැකසීම්වල අනුපිළිවෙළ සංංස්කරණය කරන්න."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"බල මෙනුව"</string>
@@ -884,13 +877,23 @@
<item quantity="one">සක්රිය යෙදුම් <xliff:g id="COUNT_1">%s</xliff:g></item>
<item quantity="other">සක්රිය යෙදුම් <xliff:g id="COUNT_1">%s</xliff:g></item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"සක්රිය යෙදුම්"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"නවත්වන්න"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"නවත්වන ලදි"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"පිටපත් කරන්න"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"පිටපත් කරන ලදි"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> සිට"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 2e4db00..a3bbe44 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Povoliť"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ladenie cez USB nie je povolené"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Používateľ, ktorý je práve prihlásený v tomto zariadení, nemôže zapnúť ladenie USB. Ak chcete použiť túto funkciu, prepnite na hlavného používateľa."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Chcete zmeniť jazyk systému na možnosť <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Zmenu jazyka systému vyžiadalo iné zariadenie"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Zmeniť jazyk"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Ponechať aktuálny jazyk"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Chcete povoliť bezdrôtové ladenie v tejto sieti?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Názov siete (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Vždy povoliť v tejto sieti"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jas"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzia farieb"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Úprava farieb"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Ďalšie nastavenia"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Používateľské nastavenia"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavrieť"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Váš budík o <xliff:g id="WHEN">%1$s</xliff:g> sa nespustí"</string>
<string name="alarm_template" msgid="2234991538018805736">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Rýchle nastavenia, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Pracovný profil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Pri používaní tuneru postupujte opatrne"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Prihlásený používateľ <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"vybrať používateľa"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Žiadny internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Otvoriť podrobnosti"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Otvoriť nastavenia <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Upraviť poradie nastavení"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Ponuka vypínača"</string>
@@ -898,13 +891,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktívnych aplikácií</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktívna aplikácia</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktívne aplikácie"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ukončiť"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Zastavená"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopírovať"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Skopírované"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Z aplikácie <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Používateľské rozhranie zahodenia kópie"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Upraviť skopírovaný text"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Upraviť skopírovaný obrázok"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Odoslať do zariadenia v okolí"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 43577f1d..d657277 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -238,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Svetlost"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija barv"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Popravljanje barv"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Več nastavitev"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uporabniške nastavitve"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Končano"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zapri"</string>
@@ -466,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Naslednjega alarma ob <xliff:g id="WHEN">%1$s</xliff:g> ne boste slišali"</string>
<string name="alarm_template" msgid="2234991538018805736">"ob <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"ob tem času: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Hitre nastavitve, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Dostopna točka"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Delovni profil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Zabavno za nekatere, a ne za vse"</string>
@@ -649,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Prijavljeni ste kot <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"izbiro uporabnika"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Brez internetne povezave"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Odpri podrobnosti."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Odpri nastavitve za <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Uredi vrstni red nastavitev."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni za vklop/izklop"</string>
@@ -894,13 +891,20 @@
<item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacij</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ustavi"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Ustavljeno"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Iz aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Opusti kopiranje uporabniškega vmesnika"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Uredi kopirano besedilo"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Uredi kopirano sliko"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Pošlji v napravo v bližini"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 14cc511..f8ba65af 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Lejo"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Korrigjimi përmes USB-së nuk lejohet"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin përmes USB-së. Për ta përdorur këtë veçori, kalo te përdoruesi parësor."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Dëshiron ta ndryshosh gjuhën e sistemit në <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Një pajisje tjetër kërkoi ndryshimin e gjuhës së sistemit"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Ndrysho gjuhën"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mbaj gjuhën aktuale"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Të lejohet korrigjimi përmes Wi-Fi në këtë rrjet?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Emri i rrjetit (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Lejo gjithmonë në këtë rrjet"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ndriçimi"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Anasjellja e ngjyrës"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korrigjimi i ngjyrës"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Cilësime të tjera"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cilësimet e përdoruesit"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"U krye"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Mbyll"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nuk do ta dëgjosh alarmin e radhës në <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"në <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"në <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Cilësimet e shpejta, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Zona e qasjes për internet"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profili i punës"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Argëtim për disa, por jo për të gjithë!"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Identifikuar si <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"zgjidh përdoruesin"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Nuk ka internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Hap detajet."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Hap cilësimet e <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Modifiko rendin e cilësimeve."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menyja e energjisë"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplikacione aktive</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplikacion aktiv</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplikacionet aktive"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ndalo"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Ndaluar"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopjo"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"U kopjua"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Nga <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Hiq kopjen e ndërfaqes së përdoruesit"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 8affbe4..5d89cf1 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дозволи"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отклањање грешака на USB-у није дозвољено"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Да ли желите да промените језик система на <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Други уређај је затражио промену језика система"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Промени језик"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Задржи актуелни језик"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Желите да дозволите бежично отклањање грешака на овој мрежи?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Назив мреже (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi адреса (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Увек дозволи на овој мрежи"</string>
@@ -241,7 +237,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Осветљеност"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверзија боја"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекција боја"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Још подешавања"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Корисничка подешавања"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string>
@@ -467,7 +462,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Нећете чути следећи аларм у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Брза подешавања, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Хотспот"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Пословни профил"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Забава за неке, али не за све"</string>
@@ -648,7 +642,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Пријављени сте као <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"одабрали корисника"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Нема интернета"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Отвори детаље."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Отвори подешавања за <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Измени редослед подешавања."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Мени дугмета за укључивање"</string>
@@ -891,13 +884,23 @@
<item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> активне апликације</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активних апликација</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активне апликације"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Заустави"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Заустављено"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копирај"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано је"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Из: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Одбаци копирање корисничког интерфејса"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 1cd6668..b9a3ab1 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Tillåt"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-felsökning är inte tillåtet"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Vill du ändra systemspråket till <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Ändring av systemspråk har begärts av en annan enhet"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Ändra språk"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Behåll nuvarande språk"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vill du tillåta trådlös felsökning i det här nätverket?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nätverksnamn (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adress (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Tillåt alltid i det här nätverket"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ljusstyrka"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Färginvertering"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Färgkorrigering"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Fler inställningar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Användarinställningar"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klart"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Stäng"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Nästa alarm, kl. <xliff:g id="WHEN">%1$s</xliff:g>, kommer inte att höras"</string>
<string name="alarm_template" msgid="2234991538018805736">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Snabbinställningar, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Surfzon"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Jobbprofil"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Kul för vissa, inte för alla"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Inloggad som <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"välj användare"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Inget internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Visa information."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Öppna <xliff:g id="ID_1">%s</xliff:g>-inställningarna."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Ändra ordning på inställningarna."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Startmeny"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiva appar</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiv app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiva appar"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stoppa"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stoppad"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiera"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopierades"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Från <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Stäng användargränssnittet för kopiering"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 63819f1..803a2b5 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Ruhusu"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Utatuzi wa USB hauruhusiwi"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Ungependa kubadilisha lugha ya mfumo kuwa <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Mabadiliko ya lugha ya mfumo yameombwa na kifaa kingine"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Badilisha lugha"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Usibadilishe lugha ya sasa"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Ungependa kuruhusu utatuzi usiotumia waya kwenye mtandao huu?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Jina la Mtandao (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAnwani ya Wi-Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Ruhusu kila wakati kwenye mtandao huu"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ung\'avu"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ugeuzaji rangi"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Usahihishaji wa rangirangi"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mipangilio zaidi"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mipangilio ya mtumiaji"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Nimemaliza"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Funga"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Hutasikia kengele yako inayofuata ya saa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"saa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"siku ya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Mipangilio ya Haraka, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Mtandaopepe"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Wasifu wa kazini"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Kinafurahisha kwa baadhi ya watu lakini si wote"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Umeingia katika akaunti ya <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"chagua mtumiaji"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Hakuna intaneti"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Fungua maelezo."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Fungua mipangilio ya <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Badilisha orodha ya mipangilio."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menyu ya kuzima/kuwasha"</string>
@@ -884,13 +877,23 @@
<item quantity="other">Programu <xliff:g id="COUNT_1">%s</xliff:g> zinatumika</item>
<item quantity="one">Programu <xliff:g id="COUNT_0">%s</xliff:g> inatumika</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Programu zinazotumika"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Simamisha"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Imesimamishwa"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Nakili"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Imenakiliwa"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Kutoka <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ondoa kiolesura cha nakala"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 5fe90d6..094559f 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ஒளிர்வு"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"கலர் இன்வெர்ஷன்"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"கலர் கரெக்ஷன்"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"அமைப்பில் மாற்று"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"பயனர் அமைப்புகள்"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"முடிந்தது"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"மூடுக"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"அடுத்த அலாரத்தை <xliff:g id="WHEN">%1$s</xliff:g> மணிக்கு கேட்க மாட்டீர்கள்"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> மணிக்கு"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> மணிக்கு"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"விரைவு அமைப்புகள், <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ஹாட்ஸ்பாட்"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"பணிக் கணக்கு"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"சில வேடிக்கையாக இருந்தாலும் கவனம் தேவை"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> என்ற பெயரில் உள்நுழைந்துள்ளீர்கள்"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"பயனரைத் தேர்வுசெய்யவும்"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"இணைய இணைப்பு இல்லை"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"விவரங்களைத் திற."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> அமைப்புகளைத் திற."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"அமைப்புகளின் வரிசை முறையைத் திருத்து."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"பவர் மெனு"</string>
@@ -880,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ஆப்ஸ் செயலில் உள்ளன</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ஆப்ஸ் செயலில் உள்ளது</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"செயலிலுள்ள ஆப்ஸ்"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"நிறுத்து"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"இயங்கவில்லை"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"நகலெடு"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"நகலெடுக்கப்பட்டது"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> ஆப்ஸிலிருந்து"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"கிளிப்போர்டு மேலடுக்கை மூடுக"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"நகலெடுத்த வார்த்தைகளைத் திருத்து"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"நகலெடுத்த படத்தைத் திருத்து"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"அருகிலுள்ள சாதனத்திற்கு அனுப்பு"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index c087dc8..59e8ef4 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ప్రకాశం"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"కలర్ మార్పిడి"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"కలర్ కరెక్షన్"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"మరిన్ని సెట్టింగ్లు"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"యూజర్ సెట్టింగ్లు"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయి"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"మీరు <xliff:g id="WHEN">%1$s</xliff:g> సెట్ చేసిన మీ తర్వాత అలారం మీకు వినిపించదు"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"శీఘ్ర సెట్టింగ్లు, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"హాట్స్పాట్"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"ఆఫీస్ ప్రొఫైల్"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"కొందరికి సరదాగా ఉంటుంది కానీ అందరికీ అలాగే ఉండదు"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> లాగా సైన్ ఇన్ చేశారు"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"యూజర్ను ఎంపిక చేయండి"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ఇంటర్నెట్ లేదు"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"వివరాలను తెరవండి."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> సెట్టింగ్లను తెరవండి."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"సెట్టింగ్ల క్రమాన్ని ఎడిట్ చేయండి."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"పవర్ మెనూ"</string>
@@ -880,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> యాక్టివ్గా ఉన్న యాప్లు</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> యాక్టివ్గా ఉన్న యాప్</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"యాక్టివ్గా ఉన్న యాప్లు"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ఆపివేయండి"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"ఆపివేయబడింది"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"కాపీ చేయండి"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"కాపీ అయింది"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> నుండి"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"కాపీ UIని విస్మరించండి"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"కాపీ చేసిన టెక్స్ట్ను ఎడిట్ చేయండి"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"కాపీ చేసిన ఇమేజ్లను ఎడిట్ చేయండి"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"సమీపంలోని పరికరానికి పంపండి"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index df48f0b..a207447 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"อนุญาต"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"คุณต้องการเปลี่ยนภาษาของระบบเป็นภาษา<xliff:g id="LANGUAGE">%1$s</xliff:g>ใช่ไหม"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"คำขอเปลี่ยนภาษาของระบบโดยอุปกรณ์อื่น"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"เปลี่ยนภาษา"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"ใช้ภาษาปัจจุบันต่อไป"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"อนุญาตให้แก้ไขข้อบกพร่องผ่าน Wi-Fi ในเครือข่ายนี้ใช่ไหม"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ชื่อเครือข่าย (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nที่อยู่ Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"อนุญาตเสมอในเครือข่ายนี้"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ความสว่าง"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"การกลับสี"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"การแก้สี"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"การตั้งค่าเพิ่มเติม"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"การตั้งค่าของผู้ใช้"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"เสร็จสิ้น"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ปิด"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"คุณจะไม่ได้ยินเสียงปลุกครั้งถัดไปในเวลา <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"เวลา <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"ในวันที่ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"การตั้งค่าด่วน <xliff:g id="TITLE">%s</xliff:g>"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ฮอตสปอต"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"โปรไฟล์งาน"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"เพลิดเพลินกับบางส่วนแต่ไม่ใช่ทั้งหมด"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"ลงชื่อเข้าใช้เป็น <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"เลือกผู้ใช้"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ไม่มีอินเทอร์เน็ต"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"เปิดรายละเอียด"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"เปิดการตั้งค่า <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"แก้ไขลำดับการตั้งค่า"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"เมนูเปิด/ปิด"</string>
@@ -884,13 +877,23 @@
<item quantity="other">มี <xliff:g id="COUNT_1">%s</xliff:g> แอปที่ใช้งานอยู่</item>
<item quantity="one">มี <xliff:g id="COUNT_0">%s</xliff:g> แอปที่ใช้งานอยู่</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"แอปที่ใช้งานอยู่"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"หยุด"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"หยุดแล้ว"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"คัดลอก"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"คัดลอกแล้ว"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"จาก <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"ปิด UI การคัดลอก"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index cb96cbf..db9c788 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Payagan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Gusto mo bang gawing <xliff:g id="LANGUAGE">%1$s</xliff:g> ang wika ng system?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Hiniling ng ibang device na palitan ang wika ng system"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Palitan ang wika"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Huwag palitan ang wika"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Payagan ang wireless na pag-debug sa network na ito?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Pangalan ng Network (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAddress ng Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Palaging payagan sa network na ito"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Pag-invert ng kulay"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Pagtatama ng kulay"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Higit pang setting"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mga setting ng user"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Tapos na"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Isara"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Hindi mo maririnig ang iyong susunod na alarm ng <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"ng <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"sa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Mga Maikling Setting, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Profile sa trabaho"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Masaya para sa ilan ngunit hindi para sa lahat"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Naka-sign in bilang <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"pumili ng user"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Walang internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Buksan ang mga detalye."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Buksan ang mga setting ng <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"I-edit ang pagkakasunud-sunod ng mga setting."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string>
@@ -884,13 +877,23 @@
<item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktibong app</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> na aktibong app</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Mga aktibong app"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ihinto"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Inihinto"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopyahin"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nakopya"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Mula sa <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"I-dismiss ang UI ng pagkopya"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index a3d07c8..308af4f 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"İzin ver"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB hata ayıklama işlevine izin verilmiyor"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Bu cihazda geçerli olarak oturum açmış olan kullanıcı, USB hata ayıklama özelliğini açamaz. Bu özelliği kullanmak için birincil kullanıcıya geçin."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Sistem dilini <xliff:g id="LANGUAGE">%1$s</xliff:g> olarak değiştirmek istiyor musunuz?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Başka bir cihaz tarafından sistem dilinin değiştirilmesi istendi"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Dili değiştir"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mevcut dili koru"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Bu ağda kablosuz hata ayıklamaya izin verilsin mi?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ağ Adı (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nKablosuz Adresi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Bu ağda her zaman izin ver"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Parlaklık"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Rengi ters çevirme"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Renk düzeltme"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Diğer ayarlar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kullanıcı ayarları"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Bitti"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Kapat"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g> olarak ayarlanmış bir sonraki alarmınızı duymayacaksınız"</string>
<string name="alarm_template" msgid="2234991538018805736">"saat: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"gün ve saat: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Hızlı Ayarlar, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"İş profili"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Bazıları için eğlenceliyken diğerleri için olmayabilir"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> olarak oturum açıldı"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"kullanıcı seç"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"İnternet yok"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Ayrıntıları aç."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını aç."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Ayarların sırasını düzenle."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Güç menüsü"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> etkin uygulama</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> etkin uygulama</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Etkin uygulamalar"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Durdur"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Durduruldu"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopyala"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopyalandı"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulamasından"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Kopyalanan kullanıcı arayüzünü kapat"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 55f7a27..0161060 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дозволити"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ви не можете вмикати налагодження USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Змінити мову системи на таку: <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Запит на змінення мови системи надіслано з іншого пристрою"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Змінити мову"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Залишити поточну мову"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Дозволити налагодження через Wi-Fi у цій мережі?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ім\'я мережі (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nАдреса Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Завжди дозволяти в цій мережі"</string>
@@ -242,7 +238,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яскравість"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Інверсія кольорів"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекція кольору"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Більше налаштувань"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налаштування користувача"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрити"</string>
@@ -470,7 +465,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Наступний сигнал о <xliff:g id="WHEN">%1$s</xliff:g> не пролунає"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Швидкі налаштування, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Точка доступу"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Робочий профіль"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Це цікаво, але будьте обачні"</string>
@@ -653,7 +647,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Ви ввійшли як <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"вибрати користувача"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Немає Інтернету"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Відкрити деталі."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Відкрити налаштування <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Змінити порядок налаштувань."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопки живлення"</string>
@@ -898,13 +891,23 @@
<item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> активних додатків</item>
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активного додатка</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активні додатки"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Зупинити"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Зупинено"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копіювати"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скопійовано"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"З додатка <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Закрити вікно копіювання"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index d9420c4..ce492dd 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"چمکیلا پن"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"رنگوں کی تقلیب"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"رنگ کی اصلاح"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"مزید ترتیبات"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"صارف کی ترتیبات"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ہو گیا"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"بند کریں"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"آپ کو <xliff:g id="WHEN">%1$s</xliff:g> بجے اپنا اگلا الارم سنائی نہیں دے گا"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> بجے"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> بجے"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"فوری ترتیبات، <xliff:g id="TITLE">%s</xliff:g>۔"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ہاٹ اسپاٹ"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"دفتری پروفائل"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"کچھ کیلئے دلچسپ لیکن سبھی کیلئے نہیں"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> کے بطور سائن ان ہے"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"صارف منتخب کریں"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"انٹرنیٹ نہیں ہے"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"تفصیلات کھولیں۔"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ترتیبات کھولیں۔"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ترتیبات کی ترتیب میں ترمیم کریں۔"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"پاور مینو"</string>
@@ -880,13 +877,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> فعال ایپس</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> فعال ایپ</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"فعال ایپس"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"روکیں"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"رکی ہوئی ہے"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"کاپی کریں"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"کاپی کر دیا گیا ہے"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> سے"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"کاپی شدہ UI کو برخاست کریں"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"کاپی کردہ ٹیکسٹ میں ترمیم کریں"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"کاپی کردہ تصویر میں ترمیم کریں"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"قریبی آلے کو بھیجیں"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index e92e060..6d6c371 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Ruxsat berish"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB orqali nosozliklarni tuzatishga ruxsat berilmagan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni aniqlash funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Tizim tilini <xliff:g id="LANGUAGE">%1$s</xliff:g> tiliga oʻzgartirishni istaysizmi?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Tizim tilini oʻzgartirishni boshqa qurilma soʻragan"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Tilni almashtirish"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Joriy tilni qoldirish"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Wi-Fi orqali debagging uchun ruxsat berilsinmi?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tarmoq nomi (SSID):\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Manzil (BSSID):\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Bu tarmoqda doim ruxsat etilsin"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Yorqinlik"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ranglarni akslantirish"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Ranglarni tuzatish"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Boshqa sozlamalar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Foydalanuvchi sozlamalari"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Tayyor"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Yopish"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Keyingi signal (<xliff:g id="WHEN">%1$s</xliff:g>) chalinmaydi"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Tezkor sozlamalar, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Ish profili"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Diqqat!"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> sifatida kirgansiz"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"foydalanuvchini tanlash"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Internetga ulanmagansiz"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Tafsilotlarini ko‘rsatish."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> sozlamalarini ochish."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Sozlamalar tartibini o‘zgartirish."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Quvvat menyusi"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ta faol ilova</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ta faol ilova</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Faol ilovalar"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Toʻxtatildi"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Nusxa olish"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nusxa olindi"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Manba: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI nusxasini bekor qilish"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 9527711..5d69e03 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Cho phép"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Không cho phép chế độ gỡ lỗi qua USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Bạn có muốn thay đổi ngôn ngữ hệ thống thành <xliff:g id="LANGUAGE">%1$s</xliff:g> không?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Thiết bị khác yêu cầu thay đổi ngôn ngữ hệ thống"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Thay đổi ngôn ngữ"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Giữ ngôn ngữ hiện tại"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Cho phép gỡ lỗi qua Wi-Fi trên mạng này?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tên mạng (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nĐịa chỉ Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Luôn cho phép trên mạng này"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Độ sáng"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Đảo màu"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Chỉnh màu"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Chế độ cài đặt khác"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cài đặt người dùng"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Xong"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Đóng"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Bạn sẽ không nghe thấy báo thức tiếp theo lúc <xliff:g id="WHEN">%1$s</xliff:g> của mình"</string>
<string name="alarm_template" msgid="2234991538018805736">"lúc <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"vào <xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Cài đặt nhanh, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Điểm phát sóng"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Hồ sơ công việc"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Thú vị đối với một số người nhưng không phải tất cả"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Đã đăng nhập là <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"chọn người dùng"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Không có Internet"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Mở chi tiết."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Mở cài đặt <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Chỉnh sửa thứ tự cài đặt."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Trình đơn nguồn"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ứng dụng đang hoạt động</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ứng dụng đang hoạt động</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ứng dụng đang hoạt động"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Dừng"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Đã dừng"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Sao chép"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Đã sao chép"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Từ <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Đóng giao diện người dùng sao chép"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index ecf5c77..f032907 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"允许"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"不允许使用 USB 调试功能"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"是否要将系统语言更改为<xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"另一台设备请求更改系统语言"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"更改语言"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"保持当前语言"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"要允许通过此网络进行无线调试吗?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"网络名称 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWLAN 地址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"始终允许通过此网络进行调试"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"颜色反转"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色彩校正"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"更多设置"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"用户设置"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"关闭"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"您在<xliff:g id="WHEN">%1$s</xliff:g>将不会听到下次闹钟响铃"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"快捷设置,<xliff:g id="TITLE">%s</xliff:g>。"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"热点"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"工作资料"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"并不适合所有用户"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"目前登录的用户名为<xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"选择用户"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"未连接到互联网"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"打开详情页面。"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"打开<xliff:g id="ID_1">%s</xliff:g>设置。"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"修改设置顺序。"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"电源菜单"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> 个使用中的应用</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> 个使用中的应用</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"使用中的应用"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"已停止"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"复制"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已复制"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"来自<xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"关闭复制界面"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index c85e2630..dbb4ffc 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -236,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"色彩反轉"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色彩校正"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string>
@@ -460,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"您不會<xliff:g id="WHEN">%1$s</xliff:g>聽到鬧鐘"</string>
<string name="alarm_template" msgid="2234991538018805736">"在 <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"在<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"<xliff:g id="TITLE">%s</xliff:g>的快速設定。"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"熱點"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"工作設定檔"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"這只是測試版本,並不包含完整功能"</string>
@@ -639,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"已登入為<xliff:g id="ID_1">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"揀使用者"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"沒有互聯網連線"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"開啟詳細資料頁面。"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"開啟<xliff:g id="ID_1">%s</xliff:g>設定頁面。"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"編輯設定次序。"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源選單"</string>
@@ -880,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> 個使用中的應用程式</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> 個使用中的應用程式</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"使用中的應用程式"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"已停止"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"複製"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已複製"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"來自「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"關閉剪貼簿使用者介面"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 19c2b3a..d7185a4 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"允許"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"無權使用 USB 偵錯功能"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。"</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"要將系統語言變更為<xliff:g id="LANGUAGE">%1$s</xliff:g>嗎?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"另一部裝置要求變更系統語言"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"變更語言"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"繼續使用目前的語言"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"要允許透過這個網路執行無線偵錯嗎?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"網路名稱 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi 位址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"一律允許透過這個網路執行"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"色彩反轉"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色彩校正"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"你不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g> 的鬧鐘"</string>
<string name="alarm_template" msgid="2234991538018805736">"於<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"於<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"快速設定,<xliff:g id="TITLE">%s</xliff:g>。"</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"無線基地台"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"工作資料夾"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"有趣與否,見仁見智"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"以「<xliff:g id="ID_1">%s</xliff:g>」的身分登入"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"選擇使用者"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"沒有網際網路連線"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"開啟詳細資料。"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"開啟「<xliff:g id="ID_1">%s</xliff:g>」設定。"</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"編輯設定順序。"</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源按鈕選單"</string>
@@ -884,13 +877,23 @@
<item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> 個使用中的應用程式</item>
<item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> 個使用中的應用程式</item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"使用中的應用程式"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"已停止"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"複製"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已複製"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"來自「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"關閉剪貼簿 UI"</string>
+ <!-- no translation found for clipboard_edit_text_description (805254383912962103) -->
+ <skip />
+ <!-- no translation found for clipboard_edit_image_description (8904857948976041306) -->
+ <skip />
+ <!-- no translation found for clipboard_send_nearby_description (4629769637846717650) -->
+ <skip />
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 8d8a8ac..5425b26 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -46,14 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Vumela"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ukususa iphutha kwe-USB akuvunyelwe"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Umsebenzisi manje ongene ngemvume kule divayisi entsha akakwazi ukuvula ukulungisa amaphutha ku-USB. Ukuze usebenzise lesi sici, shintshela kumsebenzisi oyinhloko."</string>
- <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
- <skip />
- <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
- <skip />
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Ingabe ufuna ukushintsha ulimi lwesistimu lube isi-<xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Ushintsho lolimi lwesistimu lucelwe enye idivayisi"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Shintsha ulimi"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Gcina ulimi lwamanje"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vumela ukulungisa amaphutha okungenantambo kule nethiwekhi?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Igama Lenethiwekhi (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nIkheli le-Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Njalo nje vumela le nethiwekhi"</string>
@@ -240,7 +236,6 @@
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ukugqama"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ukuguqulwa kombala"</string>
<string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Ukulungiswa kombala"</string>
- <string name="quick_settings_more_settings" msgid="2878235926753776694">"Izilungiselelo eziningi"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Amasethingi womsebenzisi"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Kwenziwe"</string>
<string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Vala"</string>
@@ -464,7 +459,6 @@
<string name="zen_alarm_warning" msgid="7844303238486849503">"Ngeke uzwe i-alamu yakho elandelayo ngo-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="2234991538018805736">"ngo-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"nge-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Izilungiselelo ezisheshayo, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"I-Hotspot"</string>
<string name="accessibility_managed_profile" msgid="4703836746209377356">"Iphrofayela yomsebenzi"</string>
<string name="tuner_warning_title" msgid="7721976098452135267">"Kuyajabulisa kwabanye kodwa hhayi bonke"</string>
@@ -643,7 +637,6 @@
<string name="accessibility_quick_settings_user" msgid="505821942882668619">"Ungene ngemvume njengo-<xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"khetha umsebenzisi"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"Ayikho i-inthanethi"</string>
- <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Vula imininingwane."</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Vula izilungiselelo ze-<xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Hlela uhlelo lwezilungiselelo."</string>
<string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Imenyu yamandla"</string>
@@ -884,13 +877,20 @@
<item quantity="one">ama-app asebenzayo angu-<xliff:g id="COUNT_1">%s</xliff:g></item>
<item quantity="other">ama-app asebenzayo angu-<xliff:g id="COUNT_1">%s</xliff:g></item>
</plurals>
+ <!-- no translation found for fgs_dot_content_description (2865071539464777240) -->
+ <skip />
<string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ama-app asebenzayo"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Misa"</string>
- <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
- <skip />
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Imisiwe"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopisha"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Ikopishiwe"</string>
- <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
- <skip />
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"Kusukela ku-<xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="clipboard_dismiss_description" msgid="7544573092766945657">"Chitha ukukopisha i-UI"</string>
+ <string name="clipboard_edit_text_description" msgid="805254383912962103">"Hlela umbhalo okopishiwe"</string>
+ <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Hlela umfanekiso okopishiwe"</string>
+ <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Thumela kudivayisi eseduze"</string>
+ <!-- no translation found for add (81036585205287996) -->
+ <skip />
+ <!-- no translation found for manage_users (1823875311934643849) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index faf518e..cbda439 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -155,6 +155,7 @@
<color name="GM2_grey_900">#202124</color>
<color name="GM2_red_300">#F28B82</color>
+ <color name="GM2_red_500">#EA4335</color>
<color name="GM2_red_700">#C5221F</color>
<color name="GM2_blue_300">#8AB4F8</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index bb1ffa8..178f93a 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -608,10 +608,6 @@
<!-- Component name of communal source service -->
<string name="config_communalSourceComponent" translatable="false">@null</string>
- <!-- Whether idle mode should be enabled. When enabled, the lock screen will timeout to an idle
- screen on inactivity. -->
- <bool name="config_enableIdleMode">false</bool>
-
<!-- This value is used when calculating whether the device is in ambient light mode. It is
light mode when the light sensor sample value exceeds above this value. -->
<integer name="config_ambientLightModeThreshold">5</integer>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index d1f4f19..3704134 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -43,6 +43,8 @@
<dimen name="navigation_edge_panel_height">96dp</dimen>
<!-- The threshold to drag to trigger the edge action -->
<dimen name="navigation_edge_action_drag_threshold">16dp</dimen>
+ <!-- The threshold to progress back animation for edge swipe -->
+ <dimen name="navigation_edge_action_progress_threshold">400dp</dimen>
<!-- The minimum display position of the arrow on the screen -->
<dimen name="navigation_edge_arrow_min_y">64dp</dimen>
<!-- The amount by which the arrow is shifted to avoid the finger-->
@@ -1036,6 +1038,7 @@
<dimen name="control_spinner_padding_horizontal">20dp</dimen>
<dimen name="control_text_size">14sp</dimen>
<dimen name="control_icon_size">24dp</dimen>
+ <dimen name="control_chevron_icon_size">20dp</dimen>
<dimen name="control_spacing">8dp</dimen>
<dimen name="control_list_divider">1dp</dimen>
<dimen name="control_corner_radius">14dp</dimen>
@@ -1119,6 +1122,7 @@
<dimen name="media_output_dialog_header_icon_padding">16dp</dimen>
<dimen name="media_output_dialog_icon_corner_radius">16dp</dimen>
<dimen name="media_output_dialog_title_anim_y_delta">12.5dp</dimen>
+ <dimen name="media_output_dialog_app_tier_icon_size">20dp</dimen>
<!-- Distance that the full shade transition takes in order for qs to fully transition to the
shade -->
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 3b7e9d4..d4cc718 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2205,6 +2205,11 @@
<string name="media_output_dialog_connect_failed">Can\'t switch. Tap to try again.</string>
<!-- Title for pairing item [CHAR LIMIT=60] -->
<string name="media_output_dialog_pairing_new">Pair new device</string>
+ <!-- Title for launch app [CHAR LIMIT=60] -->
+ <string name="media_output_dialog_launch_app_text">To cast this session, please open the app.</string>
+ <!-- App name when can't get app name [CHAR LIMIT=60] -->
+ <string name="media_output_dialog_unknown_launch_app_name">Unknown app</string>
+
<!-- Label for clip data when copying the build number off QS [CHAR LIMIT=NONE]-->
<string name="build_number_clip_data_label">Build number</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index b983545..09ae3f9 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -399,6 +399,11 @@
<!-- that would otherwise be intercepted by the Shade. -->
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
+
+ <!-- Empty enter/exit animation, we will animate in-window. Note that the implementation -->
+ <!-- of ActionsDialogLite relies on this to be null (resource=0) to detect when to run -->
+ <!-- the in-window animation. -->
+ <item name="android:windowAnimationStyle">@null</item>
</style>
<style name="QSBorderlessButton">
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesProvider.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesProvider.aidl
deleted file mode 100644
index 6db06f0..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesProvider.aidl
+++ /dev/null
@@ -1,43 +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.systemui.shared.media;
-
-import com.android.systemui.shared.media.INearbyMediaDevicesUpdateCallback;
-import com.android.systemui.shared.media.NearbyDevice;
-
-/**
- * An interface that provides information about nearby devices that are able to play media.
- *
- * External clients will implement this interface and System UI will invoke it if it's passed to
- * SystemUI via {@link INearbyMediaDevicesService.registerProvider}.
- */
-interface INearbyMediaDevicesProvider {
- /**
- * Returns a list of nearby devices that are able to play media.
- */
- List<NearbyDevice> getCurrentNearbyDevices() = 1;
-
- /**
- * Registers a callback that will be notified each time the status of a nearby device changes.
- */
- oneway void registerNearbyDevicesCallback(in INearbyMediaDevicesUpdateCallback callback) = 2;
-
- /**
- * Unregisters a callback. See {@link registerNearbyDevicesCallback}.
- */
- oneway void unregisterNearbyDevicesCallback(in INearbyMediaDevicesUpdateCallback callback) = 3;
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesService.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesService.aidl
deleted file mode 100644
index 4f3e10d..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesService.aidl
+++ /dev/null
@@ -1,33 +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.systemui.shared.media;
-
-import com.android.systemui.shared.media.INearbyMediaDevicesProvider;
-
-/**
- * An interface that can be invoked to notify System UI of nearby media devices.
- *
- * External clients wanting to notify System UI about the status of nearby media devices should
- * implement {@link INearbyMediaDevicesProvider} and then register it with system UI using this
- * service.
- *
- * System UI will implement this interface and external clients will invoke it.
- */
-interface INearbyMediaDevicesService {
- /** Registers a new provider. */
- oneway void registerProvider(INearbyMediaDevicesProvider provider) = 1;
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesUpdateCallback.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesUpdateCallback.aidl
deleted file mode 100644
index a835f52..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/media/INearbyMediaDevicesUpdateCallback.aidl
+++ /dev/null
@@ -1,41 +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.systemui.shared.media;
-
-/**
- * A callback used to notify implementors of changes in the status of nearby devices that are able
- * to play media.
- *
- * External clients may allow registration of these callbacks and external clients will be
- * responsible for notifying the callbacks appropriately. System UI is only a mediator between the
- * external client and these callbacks.
- */
-interface INearbyMediaDevicesUpdateCallback {
- /** Unknown distance range. */
- const int RANGE_UNKNOWN = 0;
- /** Distance is very far away from the peer device. */
- const int RANGE_FAR = 1;
- /** Distance is relatively long from the peer device, typically a few meters. */
- const int RANGE_LONG = 2;
- /** Distance is close to the peer device, typically with one or two meter. */
- const int RANGE_CLOSE = 3;
- /** Distance is very close to the peer device, typically within one meter or less. */
- const int RANGE_WITHIN_REACH = 4;
-
- /** Invoked by external clients when media device changes are detected. */
- oneway void nearbyDeviceUpdate(in String routeId, in int rangeZone) = 1;
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.kt
deleted file mode 100644
index 9cab3ab..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/media/NearbyDevice.kt
+++ /dev/null
@@ -1,50 +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.systemui.shared.media
-
-import android.os.Parcel
-import android.os.Parcelable
-
-/**
- * A parcelable representing a nearby device that can be used for media transfer.
- *
- * This class includes:
- * - [routeId] identifying the media route
- * - [rangeZone] specifying how far away the device with the media route is from this device.
- */
-class NearbyDevice(
- val routeId: String?,
- @RangeZone val rangeZone: Int
-) : Parcelable {
-
- private constructor(parcel: Parcel) : this(
- routeId = parcel.readString() ?: null,
- rangeZone = parcel.readInt()
- )
-
- override fun describeContents() = 0
-
- override fun writeToParcel(out: Parcel, flags: Int) {
- out.writeString(routeId)
- out.writeInt(rangeZone)
- }
-
- companion object CREATOR : Parcelable.Creator<NearbyDevice?> {
- override fun createFromParcel(parcel: Parcel) = NearbyDevice(parcel)
- override fun newArray(size: Int) = arrayOfNulls<NearbyDevice?>(size)
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/media/RangeZone.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/media/RangeZone.kt
deleted file mode 100644
index b5eaff6..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/media/RangeZone.kt
+++ /dev/null
@@ -1,31 +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.systemui.shared.media
-
-import androidx.annotation.IntDef
-import kotlin.annotation.AnnotationRetention
-
-@IntDef(
- INearbyMediaDevicesUpdateCallback.RANGE_UNKNOWN,
- INearbyMediaDevicesUpdateCallback.RANGE_FAR,
- INearbyMediaDevicesUpdateCallback.RANGE_LONG,
- INearbyMediaDevicesUpdateCallback.RANGE_CLOSE,
- INearbyMediaDevicesUpdateCallback.RANGE_WITHIN_REACH
-)
-@Retention(AnnotationRetention.SOURCE)
-/** The various range zones a device can be in, in relation to the current device. */
-annotation class RangeZone
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
index bc366ab..5c9f5db 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
@@ -20,6 +20,7 @@
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_DEVICE_ADMIN;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NONE;
+import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PREPARE_FOR_UPDATE;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
@@ -101,6 +102,8 @@
return R.string.kg_prompt_reason_user_request;
case PROMPT_REASON_PREPARE_FOR_UPDATE:
return R.string.kg_prompt_reason_timeout_password;
+ case PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT:
+ return R.string.kg_prompt_reason_timeout_password;
case PROMPT_REASON_NONE:
return 0;
default:
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java
index 0b4bc9e..41f9240 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java
@@ -327,6 +327,9 @@
case PROMPT_REASON_PREPARE_FOR_UPDATE:
mMessageAreaController.setMessage(R.string.kg_prompt_reason_timeout_pattern);
break;
+ case PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT:
+ mMessageAreaController.setMessage(R.string.kg_prompt_reason_timeout_pattern);
+ break;
case PROMPT_REASON_NONE:
break;
default:
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
index 0b8868f..4723af2 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -18,6 +18,7 @@
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_DEVICE_ADMIN;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NONE;
+import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PREPARE_FOR_UPDATE;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART;
import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
@@ -113,6 +114,8 @@
return R.string.kg_prompt_reason_user_request;
case PROMPT_REASON_PREPARE_FOR_UPDATE:
return R.string.kg_prompt_reason_timeout_pin;
+ case PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT:
+ return R.string.kg_prompt_reason_timeout_pin;
case PROMPT_REASON_NONE:
return 0;
default:
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 99e0ec1..37f4564 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -2027,6 +2027,7 @@
mAuthController.addCallback(new AuthController.Callback() {
@Override
public void onAllAuthenticatorsRegistered() {
+ mainExecutor.execute(() -> updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE));
}
@Override
@@ -2156,6 +2157,10 @@
return;
}
+ // don't start running fingerprint until they're registered
+ if (!mAuthController.areAllAuthenticatorsRegistered()) {
+ return;
+ }
final boolean shouldListenForFingerprint = shouldListenForFingerprint(isUdfpsSupported());
final boolean runningOrRestarting = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING
|| mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING;
@@ -3523,6 +3528,8 @@
final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId);
BiometricAuthenticated fingerprint = mUserFingerprintAuthenticated.get(userId);
pw.println(" Fingerprint state (user=" + userId + ")");
+ pw.println(" areAllAuthenticatorsRegistered="
+ + mAuthController.areAllAuthenticatorsRegistered());
pw.println(" allowed="
+ (fingerprint != null
&& isUnlockingWithBiometricAllowed(fingerprint.mIsStrongBiometric)));
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 11fffd0..f5084f5 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -21,6 +21,7 @@
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.os.Handler;
+import android.os.HandlerThread;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -28,6 +29,7 @@
import com.android.systemui.dagger.GlobalRootComponent;
import com.android.systemui.dagger.SysUIComponent;
import com.android.systemui.dagger.WMComponent;
+import com.android.wm.shell.dagger.WMShellConcurrencyModule;
import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider;
import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider;
import com.android.wm.shell.transition.ShellTransitions;
@@ -96,8 +98,9 @@
&& android.os.Process.myUserHandle().isSystem()
&& ActivityThread.currentProcessName().equals(ActivityThread.currentPackageName());
mRootComponent = buildGlobalRootComponent(context);
+
// Stand up WMComponent
- mWMComponent = mRootComponent.getWMComponentBuilder().build();
+ setupWmComponent(context);
if (mInitializeComponents) {
// Only initialize when not starting from tests since this currently initializes some
// components that shouldn't be run in the test environment
@@ -124,8 +127,8 @@
.setDisplayAreaHelper(mWMComponent.getDisplayAreaHelper())
.setTaskSurfaceHelper(mWMComponent.getTaskSurfaceHelper())
.setRecentTasks(mWMComponent.getRecentTasks())
- .setCompatUI(Optional.of(mWMComponent.getCompatUI()))
- .setDragAndDrop(Optional.of(mWMComponent.getDragAndDrop()))
+ .setCompatUI(mWMComponent.getCompatUI())
+ .setDragAndDrop(mWMComponent.getDragAndDrop())
.setBackAnimation(mWMComponent.getBackAnimation());
} else {
// TODO: Call on prepareSysUIComponentBuilder but not with real components. Other option
@@ -161,6 +164,36 @@
}
/**
+ * Sets up {@link #mWMComponent}. On devices where the Shell runs on its own main thread,
+ * this will pre-create the thread to ensure that the components are constructed on the
+ * same thread, to reduce the likelihood of side effects from running the constructors on
+ * a different thread than the rest of the class logic.
+ */
+ private void setupWmComponent(Context context) {
+ WMComponent.Builder wmBuilder = mRootComponent.getWMComponentBuilder();
+ if (!mInitializeComponents || !WMShellConcurrencyModule.enableShellMainThread(context)) {
+ // If running under tests or shell thread is not enabled, we don't need anything special
+ mWMComponent = wmBuilder.build();
+ return;
+ }
+
+ // If the shell main thread is enabled, initialize the component on that thread
+ HandlerThread shellThread = WMShellConcurrencyModule.createShellMainThread();
+ shellThread.start();
+
+ // Use an async handler since we don't care about synchronization
+ Handler shellHandler = Handler.createAsync(shellThread.getLooper());
+ boolean built = shellHandler.runWithScissors(() -> {
+ wmBuilder.setShellMainThread(shellThread);
+ mWMComponent = wmBuilder.build();
+ }, 5000);
+ if (!built) {
+ Log.w(TAG, "Failed to initialize WMComponent");
+ throw new RuntimeException();
+ }
+ }
+
+ /**
* Prepares the SysUIComponent builder before it is built.
* @param sysUIBuilder the builder provided by the root component's getSysUIComponent() method
* @param wm the built WMComponent from the root component's getWMComponent() method
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index fe5e36e..dfb8c18 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -136,6 +136,7 @@
@NonNull private final SparseBooleanArray mUdfpsEnrolledForUser;
@NonNull private final SensorPrivacyManager mSensorPrivacyManager;
private final WakefulnessLifecycle mWakefulnessLifecycle;
+ private boolean mAllAuthenticatorsRegistered;
private class BiometricTaskStackListener extends TaskStackListener {
@Override
@@ -226,6 +227,13 @@
}
}
+ /**
+ * Whether all authentictors have been registered.
+ */
+ public boolean areAllAuthenticatorsRegistered() {
+ return mAllAuthenticatorsRegistered;
+ }
+
private void handleAllAuthenticatorsRegistered(
List<FingerprintSensorPropertiesInternal> sensors) {
mExecution.assertIsMainThread();
@@ -233,6 +241,7 @@
Log.d(TAG, "handleAllAuthenticatorsRegistered | sensors: " + Arrays.toString(
sensors.toArray()));
}
+ mAllAuthenticatorsRegistered = true;
mFpProps = sensors;
List<FingerprintSensorPropertiesInternal> udfpsProps = new ArrayList<>();
List<FingerprintSensorPropertiesInternal> sidefpsProps = new ArrayList<>();
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
index 40689ee..a17ddc8 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
@@ -151,11 +151,7 @@
mWindow = FloatingWindowUtil.getFloatingWindow(mContext);
mWindow.setWindowManager(mWindowManager, null, null);
- if (!mAccessibilityManager.isTouchExplorationEnabled()) {
- setWindowFocusable(true);
- } else {
- setWindowFocusable(false);
- }
+ setWindowFocusable(false);
mContainer = (FrameLayout)
LayoutInflater.from(mContext).inflate(R.layout.clipboard_overlay, null);
diff --git a/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java b/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java
deleted file mode 100644
index 2d59e13..0000000
--- a/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * 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.systemui.communal.conditions;
-
-import android.database.ContentObserver;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.wifi.WifiInfo;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.util.condition.Condition;
-import com.android.systemui.util.settings.SecureSettings;
-
-import java.util.Arrays;
-import java.util.HashSet;
-
-import javax.inject.Inject;
-
-/**
- * Monitors Wi-Fi connections and triggers callback, if any, when the device is connected to and
- * disconnected from a trusted network.
- */
-public class CommunalTrustedNetworkCondition extends Condition {
- private final String mTag = getClass().getSimpleName();
- private final ConnectivityManager mConnectivityManager;
- private final ContentObserver mTrustedNetworksObserver;
- private final SecureSettings mSecureSettings;
-
- // The SSID of the connected Wi-Fi network. Null if not connected to Wi-Fi.
- private String mWifiSSID;
-
- // Set of SSIDs of trusted networks.
- private final HashSet<String> mTrustedNetworks = new HashSet<>();
-
- /**
- * The deliminator used to separate trusted network keys saved as a string in secure settings.
- */
- public static final String SETTINGS_STRING_DELIMINATOR = ",/";
-
- @Inject
- public CommunalTrustedNetworkCondition(@Main Handler handler,
- ConnectivityManager connectivityManager, SecureSettings secureSettings) {
- mConnectivityManager = connectivityManager;
- mSecureSettings = secureSettings;
-
- mTrustedNetworksObserver = new ContentObserver(handler) {
- @Override
- public void onChange(boolean selfChange) {
- fetchTrustedNetworks();
- }
- };
- }
-
- /**
- * Starts monitoring for trusted network connection. Ignores if already started.
- */
- @Override
- protected void start() {
- if (shouldLog()) Log.d(mTag, "start listening for wifi connections");
-
- fetchTrustedNetworks();
-
- final NetworkRequest wifiNetworkRequest = new NetworkRequest.Builder().addTransportType(
- NetworkCapabilities.TRANSPORT_WIFI).build();
- mConnectivityManager.registerNetworkCallback(wifiNetworkRequest, mNetworkCallback);
- mSecureSettings.registerContentObserverForUser(
- Settings.Secure.COMMUNAL_MODE_TRUSTED_NETWORKS, false, mTrustedNetworksObserver,
- UserHandle.USER_SYSTEM);
- }
-
- /**
- * Stops monitoring for trusted network connection.
- */
- @Override
- protected void stop() {
- if (shouldLog()) Log.d(mTag, "stop listening for wifi connections");
-
- mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
- mSecureSettings.unregisterContentObserver(mTrustedNetworksObserver);
- }
-
- private void updateWifiInfo(WifiInfo wifiInfo) {
- if (wifiInfo == null) {
- mWifiSSID = null;
- } else {
- // Remove the wrapping quotes around the SSID.
- mWifiSSID = wifiInfo.getSSID().replace("\"", "");
- }
-
- checkIfConnectedToTrustedNetwork();
- }
-
- private void fetchTrustedNetworks() {
- final String trustedNetworksString = mSecureSettings.getStringForUser(
- Settings.Secure.COMMUNAL_MODE_TRUSTED_NETWORKS, UserHandle.USER_SYSTEM);
- mTrustedNetworks.clear();
-
- if (shouldLog()) Log.d(mTag, "fetched trusted networks: " + trustedNetworksString);
-
- if (TextUtils.isEmpty(trustedNetworksString)) {
- return;
- }
-
- mTrustedNetworks.addAll(
- Arrays.asList(trustedNetworksString.split(SETTINGS_STRING_DELIMINATOR)));
-
- checkIfConnectedToTrustedNetwork();
- }
-
- private void checkIfConnectedToTrustedNetwork() {
- final boolean connectedToTrustedNetwork = mWifiSSID != null && mTrustedNetworks.contains(
- mWifiSSID);
-
- if (shouldLog()) {
- Log.d(mTag, (connectedToTrustedNetwork ? "connected to" : "disconnected from")
- + " a trusted network");
- }
-
- updateCondition(connectedToTrustedNetwork);
- }
-
- private final ConnectivityManager.NetworkCallback mNetworkCallback =
- new ConnectivityManager.NetworkCallback(
- ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO) {
- private boolean mIsConnected = false;
- private WifiInfo mWifiInfo;
-
- @Override
- public void onAvailable(@NonNull Network network) {
- super.onAvailable(network);
-
- if (shouldLog()) Log.d(mTag, "connected to wifi");
-
- mIsConnected = true;
- if (mWifiInfo != null) {
- updateWifiInfo(mWifiInfo);
- }
- }
-
- @Override
- public void onLost(@NonNull Network network) {
- super.onLost(network);
-
- if (shouldLog()) Log.d(mTag, "disconnected from wifi");
-
- mIsConnected = false;
- mWifiInfo = null;
- updateWifiInfo(null);
- }
-
- @Override
- public void onCapabilitiesChanged(@NonNull Network network,
- @NonNull NetworkCapabilities networkCapabilities) {
- super.onCapabilitiesChanged(network, networkCapabilities);
-
- mWifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
-
- if (mIsConnected) {
- updateWifiInfo(mWifiInfo);
- }
- }
- };
-
- private boolean shouldLog() {
- return Log.isLoggable(mTag, Log.DEBUG);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java
index e1f1ac4..814b251 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java
+++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.java
@@ -20,8 +20,6 @@
import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
-import android.view.View;
-import android.widget.FrameLayout;
import androidx.annotation.Nullable;
@@ -30,9 +28,6 @@
import com.android.systemui.communal.PackageObserver;
import com.android.systemui.communal.conditions.CommunalSettingCondition;
import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.idle.AmbientLightModeMonitor;
-import com.android.systemui.idle.LightSensorEventsDebounceAlgorithm;
-import com.android.systemui.idle.dagger.IdleViewComponent;
import com.android.systemui.util.condition.Condition;
import com.android.systemui.util.condition.Monitor;
import com.android.systemui.util.condition.dagger.MonitorComponent;
@@ -46,7 +41,6 @@
import javax.inject.Named;
import javax.inject.Provider;
-import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.ElementsIntoSet;
@@ -58,22 +52,12 @@
*/
@Module(subcomponents = {
CommunalViewComponent.class,
- IdleViewComponent.class,
})
public interface CommunalModule {
- String IDLE_VIEW = "idle_view";
String COMMUNAL_CONDITIONS = "communal_conditions";
/** */
@Provides
- @Named(IDLE_VIEW)
- static View provideIdleView(Context context) {
- FrameLayout view = new FrameLayout(context);
- return view;
- }
-
- /** */
- @Provides
static Optional<CommunalSource.Observer> provideCommunalSourcePackageObserver(
Context context, @Main Resources resources) {
final String componentName = resources.getString(R.string.config_communalSourceComponent);
@@ -87,15 +71,6 @@
}
/**
- * Provides LightSensorEventsDebounceAlgorithm as an instance to DebounceAlgorithm interface.
- * @param algorithm the instance of algorithm that is bound to the interface.
- * @return the interface that is bound to.
- */
- @Binds
- AmbientLightModeMonitor.DebounceAlgorithm ambientLightDebounceAlgorithm(
- LightSensorEventsDebounceAlgorithm algorithm);
-
- /**
* Provides a set of conditions that need to be fulfilled in order for Communal Mode to display.
*/
@Provides
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
index 47e749c..4819bf5 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
@@ -118,6 +118,7 @@
private var nextStatusText: CharSequence = ""
val title: TextView = layout.requireViewById(R.id.title)
val subtitle: TextView = layout.requireViewById(R.id.subtitle)
+ val chevronIcon: ImageView = layout.requireViewById(R.id.chevron_icon)
val context: Context = layout.getContext()
val clipLayer: ClipDrawable
lateinit var cws: ControlWithState
@@ -163,6 +164,7 @@
cws.control?.let {
title.setText(it.title)
subtitle.setText(it.subtitle)
+ chevronIcon.visibility = if (usePanel()) View.VISIBLE else View.INVISIBLE
}
}
@@ -469,6 +471,7 @@
updateContentDescription()
status.setTextColor(color)
+ chevronIcon.imageTintList = color
control?.getCustomIcon()?.let {
icon.setImageIcon(it)
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index 81fa99a..701972a 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -26,6 +26,7 @@
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionCli;
+import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.media.taptotransfer.MediaTttCommandLineHelper;
import com.android.systemui.media.taptotransfer.receiver.MediaTttChipControllerReceiver;
import com.android.systemui.media.taptotransfer.sender.MediaTttChipControllerSender;
@@ -152,6 +153,7 @@
getMediaTttChipControllerReceiver();
getMediaTttCommandLineHelper();
getMediaMuteAwaitConnectionCli();
+ getNearbyMediaDevicesManager();
getUnfoldLatencyTracker().init();
getFoldStateLoggingProvider().ifPresent(FoldStateLoggingProvider::init);
getFoldStateLogger().ifPresent(FoldStateLogger::init);
@@ -231,6 +233,9 @@
/** */
Optional<MediaMuteAwaitConnectionCli> getMediaMuteAwaitConnectionCli();
+ /** */
+ Optional<NearbyMediaDevicesManager> getNearbyMediaDevicesManager();
+
/**
* Returns {@link CoreStartable}s that should be started with the application.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index b96c5ae..13067bf 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -42,6 +42,7 @@
import com.android.systemui.flags.FlagsModule;
import com.android.systemui.fragments.FragmentService;
import com.android.systemui.log.dagger.LogModule;
+import com.android.systemui.lowlightclock.LowLightClockController;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -86,6 +87,7 @@
import com.android.systemui.wallet.dagger.WalletModule;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
+import com.android.wm.shell.dagger.DynamicOverride;
import java.util.Optional;
import java.util.concurrent.Executor;
@@ -214,4 +216,19 @@
groupManager, entryManager, notifCollection, notifPipeline, sysUiState,
notifPipelineFlags, dumpManager, sysuiMainExecutor));
}
+
+ @BindsOptionalOf
+ @DynamicOverride
+ abstract LowLightClockController optionalLowLightClockController();
+
+ @SysUISingleton
+ @Provides
+ static Optional<LowLightClockController> provideLowLightClockController(
+ @DynamicOverride Optional<LowLightClockController> optionalController) {
+ if (optionalController.isPresent() && optionalController.get().isLowLightClockEnabled()) {
+ return optionalController;
+ } else {
+ return Optional.empty();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
index b926692..b02074a 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
@@ -17,6 +17,9 @@
package com.android.systemui.dagger;
import android.content.Context;
+import android.os.HandlerThread;
+
+import androidx.annotation.Nullable;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.tv.TvWMComponent;
@@ -26,6 +29,7 @@
import com.android.wm.shell.apppairs.AppPairs;
import com.android.wm.shell.back.BackAnimation;
import com.android.wm.shell.bubbles.Bubbles;
+import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.compatui.CompatUI;
import com.android.wm.shell.dagger.TvWMShellModule;
import com.android.wm.shell.dagger.WMShellModule;
@@ -44,6 +48,7 @@
import java.util.Optional;
+import dagger.BindsInstance;
import dagger.Subcomponent;
/**
@@ -64,6 +69,10 @@
*/
@Subcomponent.Builder
interface Builder {
+
+ @BindsInstance
+ Builder setShellMainThread(@Nullable @ShellMainThread HandlerThread t);
+
WMComponent build();
}
@@ -120,10 +129,10 @@
Optional<RecentTasks> getRecentTasks();
@WMSingleton
- CompatUI getCompatUI();
+ Optional<CompatUI> getCompatUI();
@WMSingleton
- DragAndDrop getDragAndDrop();
+ Optional<DragAndDrop> getDragAndDrop();
@WMSingleton
Optional<BackAnimation> getBackAnimation();
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index befb648..789ad62 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -118,9 +118,11 @@
switch (this) {
case UNINITIALIZED:
case INITIALIZED:
- case DOZE_REQUEST_PULSE:
return parameters.shouldControlScreenOff() ? Display.STATE_ON
: Display.STATE_OFF;
+ case DOZE_REQUEST_PULSE:
+ return parameters.getDisplayNeedsBlanking() ? Display.STATE_OFF
+ : Display.STATE_ON;
case DOZE_AOD_PAUSED:
case DOZE:
return Display.STATE_OFF;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 239109a..c8720e4 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -288,7 +288,7 @@
for (TriggerSensor triggerSensor : mTriggerSensors) {
triggerSensor.setListening(false);
}
- mProximitySensor.pause();
+ mProximitySensor.destroy();
mDevicePostureController.removeCallback(mDevicePostureCallback);
mAuthController.removeCallback(mAuthControllerCallback);
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 68b74bd..8bff3ba 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -228,6 +228,7 @@
@Override
public void destroy() {
mDozeSensors.destroy();
+ mProxCheck.destroy();
}
private void onNotification(Runnable onPulseSuppressedListener) {
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
index 4dacf65..338a8b2 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
@@ -132,6 +132,7 @@
public void onStartDream(@NonNull WindowManager.LayoutParams layoutParams) {
setCurrentState(Lifecycle.State.STARTED);
mExecutor.execute(() -> {
+ mStateController.setShouldShowComplications(shouldShowComplications());
addOverlayWindowLocked(layoutParams);
setCurrentState(Lifecycle.State.RESUMED);
mStateController.setOverlayActive(true);
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java
index bc5a52a..fc71e2f 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java
@@ -16,6 +16,7 @@
package com.android.systemui.dreams;
+import android.service.dreams.DreamService;
import android.util.Log;
import androidx.annotation.NonNull;
@@ -84,6 +85,8 @@
@Complication.ComplicationType
private int mAvailableComplicationTypes = Complication.COMPLICATION_TYPE_NONE;
+ private boolean mShouldShowComplications = DreamService.DEFAULT_SHOW_COMPLICATIONS;
+
private final Collection<Complication> mComplications = new HashSet();
@VisibleForTesting
@@ -131,7 +134,12 @@
.filter(complication -> {
@Complication.ComplicationType
final int requiredTypes = complication.getRequiredTypeAvailability();
- return (requiredTypes & getAvailableComplicationTypes()) == requiredTypes;
+ // If it should show complications, show ones whose required types are
+ // available. Otherwise, only show ones that don't require types.
+ if (mShouldShowComplications) {
+ return (requiredTypes & getAvailableComplicationTypes()) == requiredTypes;
+ }
+ return requiredTypes == Complication.COMPLICATION_TYPE_NONE;
})
.collect(Collectors.toCollection(HashSet::new))
: mComplications);
@@ -221,7 +229,24 @@
public void setAvailableComplicationTypes(@Complication.ComplicationType int types) {
mExecutor.execute(() -> {
mAvailableComplicationTypes = types;
- mCallbacks.forEach(callback -> callback.onAvailableComplicationTypesChanged());
+ mCallbacks.forEach(Callback::onAvailableComplicationTypesChanged);
+ });
+ }
+
+ /**
+ * Returns whether the dream overlay should show complications.
+ */
+ public boolean getShouldShowComplications() {
+ return mShouldShowComplications;
+ }
+
+ /**
+ * Sets whether the dream overlay should show complications.
+ */
+ public void setShouldShowComplications(boolean shouldShowComplications) {
+ mExecutor.execute(() -> {
+ mShouldShowComplications = shouldShowComplications;
+ mCallbacks.forEach(Callback::onAvailableComplicationTypesChanged);
});
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java
index f3b721c..df60599 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java
@@ -30,11 +30,13 @@
import android.content.IntentFilter;
import android.content.res.Resources;
import android.os.Bundle;
+import android.os.RemoteException;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
@@ -70,6 +72,7 @@
private final Supplier<Map<Integer, Flag<?>>> mFlagsCollector;
private final Map<Integer, Boolean> mBooleanFlagCache = new TreeMap<>();
private final Map<Integer, String> mStringFlagCache = new TreeMap<>();
+ private final IStatusBarService mBarService;
@Inject
public FeatureFlagsDebug(
@@ -78,7 +81,8 @@
SecureSettings secureSettings,
@Main Resources resources,
DumpManager dumpManager,
- @Nullable Supplier<Map<Integer, Flag<?>>> flagsCollector) {
+ @Nullable Supplier<Map<Integer, Flag<?>>> flagsCollector,
+ IStatusBarService barService) {
mFlagManager = flagManager;
mSecureSettings = secureSettings;
mResources = resources;
@@ -91,6 +95,7 @@
context.registerReceiver(mReceiver, filter, null, null,
Context.RECEIVER_EXPORTED_UNAUDITED);
dumpManager.registerDumpable(TAG, this);
+ mBarService = barService;
}
@Override
@@ -212,6 +217,14 @@
System.exit(0);
}
+ private void restartAndroid() {
+ Log.i(TAG, "Restarting Android");
+ try {
+ mBarService.restart();
+ } catch (RemoteException e) {
+ }
+ }
+
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.java b/packages/SystemUI/src/com/android/systemui/flags/Flags.java
index 1ba6e34..dd36fd6 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.java
@@ -111,7 +111,7 @@
public static final ResourceBooleanFlag QS_USER_DETAIL_SHORTCUT =
new ResourceBooleanFlag(503, R.bool.flag_lockscreen_qs_user_detail_shortcut);
- public static final BooleanFlag NEW_FOOTER = new BooleanFlag(504, false);
+ public static final BooleanFlag NEW_FOOTER = new BooleanFlag(504, true);
public static final BooleanFlag NEW_HEADER = new BooleanFlag(505, false);
public static final ResourceBooleanFlag FULL_SCREEN_USER_SWITCHER =
@@ -146,6 +146,7 @@
public static final BooleanFlag MEDIA_TAP_TO_TRANSFER = new BooleanFlag(900, true);
public static final BooleanFlag MEDIA_SESSION_ACTIONS = new BooleanFlag(901, true);
public static final BooleanFlag MEDIA_SESSION_LAYOUT = new BooleanFlag(902, false);
+ public static final BooleanFlag MEDIA_NEARBY_DEVICES = new BooleanFlag(903, true);
public static final BooleanFlag MEDIA_MUTE_AWAIT = new BooleanFlag(904, true);
// 1000 - dock
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index f0371fc..84fa6a6 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -31,6 +31,7 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.Dialog;
@@ -76,8 +77,10 @@
import android.view.IWindowManager;
import android.view.LayoutInflater;
import android.view.MotionEvent;
+import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
+import android.view.Window;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -109,6 +112,7 @@
import com.android.systemui.MultiListLayout;
import com.android.systemui.MultiListLayout.MultiListAdapter;
import com.android.systemui.animation.DialogLaunchAnimator;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Background;
@@ -2170,6 +2174,7 @@
private Optional<StatusBar> mStatusBarOptional;
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private LockPatternUtils mLockPatternUtils;
+ private float mWindowDimAmount;
protected ViewGroup mContainer;
@@ -2251,6 +2256,7 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initializeLayout();
+ mWindowDimAmount = getWindow().getAttributes().dimAmount;
}
@Override
@@ -2459,6 +2465,96 @@
mNotificationShadeWindowController.setRequestTopUi(true, TAG);
mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, true)
.commitUpdate(mContext.getDisplayId());
+
+ // By default this dialog windowAnimationStyle is null, and therefore windowAnimations
+ // should be equal to 0 which means we need to animate the dialog in-window. If it's not
+ // equal to 0, it means it has been overridden to animate (e.g. by the
+ // DialogLaunchAnimator) so we don't run the animation.
+ boolean shouldAnimateInWindow = getWindow().getAttributes().windowAnimations == 0;
+ if (shouldAnimateInWindow) {
+ startAnimation(true /* isEnter */, null /* then */);
+
+ // Override the dialog dismiss so that we can animate in-window before dismissing
+ // the dialog.
+ setDismissOverride(() -> {
+ startAnimation(false /* isEnter */, /* then */ () -> {
+ setDismissOverride(null);
+
+ // Hide then dismiss to instantly dismiss.
+ hide();
+ dismiss();
+ });
+ });
+ }
+ }
+
+ /** Run either the enter or exit animation, then run {@code then}. */
+ private void startAnimation(boolean isEnter, @Nullable Runnable then) {
+ ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
+
+ // Note: these specs should be the same as in popup_enter_material and
+ // popup_exit_material.
+ float translationPx;
+ Resources resources = getContext().getResources();
+ if (isEnter) {
+ translationPx = resources.getDimension(R.dimen.popup_enter_animation_from_y_delta);
+ animator.setInterpolator(Interpolators.STANDARD);
+ animator.setDuration(resources.getInteger(R.integer.config_activityDefaultDur));
+ } else {
+ translationPx = resources.getDimension(R.dimen.popup_exit_animation_to_y_delta);
+ animator.setInterpolator(Interpolators.STANDARD_ACCELERATE);
+ animator.setDuration(resources.getInteger(R.integer.config_activityShortDur));
+ }
+
+ Window window = getWindow();
+ int rotation = window.getWindowManager().getDefaultDisplay().getRotation();
+
+ animator.addUpdateListener(valueAnimator -> {
+ float progress = (float) valueAnimator.getAnimatedValue();
+
+ float alpha = isEnter ? progress : 1 - progress;
+ mGlobalActionsLayout.setAlpha(alpha);
+ window.setDimAmount(mWindowDimAmount * alpha);
+
+ // TODO(b/213872558): Support devices that don't have their power button on the
+ // right.
+ float translation =
+ isEnter ? translationPx * (1 - progress) : translationPx * progress;
+ switch (rotation) {
+ case Surface.ROTATION_0:
+ mGlobalActionsLayout.setTranslationX(translation);
+ break;
+ case Surface.ROTATION_90:
+ mGlobalActionsLayout.setTranslationY(-translation);
+ break;
+ case Surface.ROTATION_180:
+ mGlobalActionsLayout.setTranslationX(-translation);
+ break;
+ case Surface.ROTATION_270:
+ mGlobalActionsLayout.setTranslationY(translation);
+ break;
+ }
+ });
+
+ animator.addListener(new AnimatorListenerAdapter() {
+ private int mPreviousLayerType;
+
+ @Override
+ public void onAnimationStart(Animator animation, boolean isReverse) {
+ mPreviousLayerType = mGlobalActionsLayout.getLayerType();
+ mGlobalActionsLayout.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mGlobalActionsLayout.setLayerType(mPreviousLayerType, null);
+ if (then != null) {
+ then.run();
+ }
+ }
+ });
+
+ animator.start();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/idle/AmbientLightModeMonitor.kt b/packages/SystemUI/src/com/android/systemui/idle/AmbientLightModeMonitor.kt
deleted file mode 100644
index fa00dbb..0000000
--- a/packages/SystemUI/src/com/android/systemui/idle/AmbientLightModeMonitor.kt
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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.systemui.idle
-
-import android.annotation.IntDef
-import android.hardware.Sensor
-import android.hardware.SensorEvent
-import android.hardware.SensorEventListener
-import android.hardware.SensorManager
-import android.util.Log
-import com.android.systemui.util.sensors.AsyncSensorManager
-import javax.inject.Inject
-
-/**
- * Monitors ambient light signals, applies a debouncing algorithm, and produces the current
- * ambient light mode.
- *
- * @property algorithm the debounce algorithm which transforms light sensor events into an
- * ambient light mode.
- * @property sensorManager the sensor manager used to register sensor event updates.
- */
-class AmbientLightModeMonitor @Inject constructor(
- private val algorithm: DebounceAlgorithm,
- private val sensorManager: AsyncSensorManager
-) {
- companion object {
- private const val TAG = "AmbientLightModeMonitor"
- private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
-
- const val AMBIENT_LIGHT_MODE_LIGHT = 0
- const val AMBIENT_LIGHT_MODE_DARK = 1
- const val AMBIENT_LIGHT_MODE_UNDECIDED = 2
- }
-
- // Light sensor used to detect ambient lighting conditions.
- private val lightSensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
-
- // Represents all ambient light modes.
- @Retention(AnnotationRetention.SOURCE)
- @IntDef(AMBIENT_LIGHT_MODE_LIGHT, AMBIENT_LIGHT_MODE_DARK, AMBIENT_LIGHT_MODE_UNDECIDED)
- annotation class AmbientLightMode
-
- /**
- * Start monitoring the current ambient light mode.
- *
- * @param callback callback that gets triggered when the ambient light mode changes.
- */
- fun start(callback: Callback) {
- if (DEBUG) Log.d(TAG, "start monitoring ambient light mode")
-
- if (lightSensor == null) {
- if (DEBUG) Log.w(TAG, "light sensor not available")
- return
- }
-
- algorithm.start(callback)
- sensorManager.registerListener(mSensorEventListener, lightSensor,
- SensorManager.SENSOR_DELAY_NORMAL)
- }
-
- /**
- * Stop monitoring the current ambient light mode.
- */
- fun stop() {
- if (DEBUG) Log.d(TAG, "stop monitoring ambient light mode")
-
- algorithm.stop()
- sensorManager.unregisterListener(mSensorEventListener)
- }
-
- private val mSensorEventListener: SensorEventListener = object : SensorEventListener {
- override fun onSensorChanged(event: SensorEvent) {
- if (event.values.isEmpty()) {
- if (DEBUG) Log.w(TAG, "SensorEvent doesn't have any value")
- return
- }
-
- algorithm.onUpdateLightSensorEvent(event.values[0])
- }
-
- override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
- // Do nothing.
- }
- }
-
- /**
- * Interface of the ambient light mode callback, which gets triggered when the mode changes.
- */
- interface Callback {
- fun onChange(@AmbientLightMode mode: Int)
- }
-
- /**
- * Interface of the algorithm that transforms light sensor events to an ambient light mode.
- */
- interface DebounceAlgorithm {
- // Setting Callback to nullable so mockito can verify without throwing NullPointerException.
- fun start(callback: Callback?)
- fun stop()
- fun onUpdateLightSensorEvent(value: Float)
- }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/idle/IdleHostView.java b/packages/SystemUI/src/com/android/systemui/idle/IdleHostView.java
deleted file mode 100644
index 7d79279..0000000
--- a/packages/SystemUI/src/com/android/systemui/idle/IdleHostView.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.systemui.idle;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.FrameLayout;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * {@link IdleHostView} houses a surface to be displayed when the device idle.
- */
-public class IdleHostView extends FrameLayout {
- public IdleHostView(@NonNull Context context) {
- this(context, null);
- }
-
- public IdleHostView(@NonNull Context context,
- @Nullable AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public IdleHostView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/idle/IdleHostViewController.java b/packages/SystemUI/src/com/android/systemui/idle/IdleHostViewController.java
deleted file mode 100644
index 624d01f..0000000
--- a/packages/SystemUI/src/com/android/systemui/idle/IdleHostViewController.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * 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.systemui.idle;
-
-import static com.android.systemui.communal.dagger.CommunalModule.IDLE_VIEW;
-
-import android.annotation.IntDef;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.os.PowerManager;
-import android.os.SystemClock;
-import android.util.Log;
-import android.view.View;
-
-import com.android.systemui.R;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.util.ViewController;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Provider;
-
-/**
- * {@link IdleHostViewController} processes signals to control the lifecycle of the idle screen.
- */
-public class IdleHostViewController extends ViewController<IdleHostView> {
- private static final String TAG = "IdleHostViewController";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- @Retention(RetentionPolicy.RUNTIME)
- @IntDef({STATE_IDLE_MODE_ENABLED, STATE_KEYGUARD_SHOWING, STATE_DOZING, STATE_DREAMING,
- STATE_LOW_LIGHT})
- public @interface State {}
-
- // Set at construction to indicate idle mode is available.
- private static final int STATE_IDLE_MODE_ENABLED = 1 << 0;
-
- // Set when keyguard is present, even below a dream or AOD. AKA the device is locked.
- private static final int STATE_KEYGUARD_SHOWING = 1 << 1;
-
- // Set when the device has entered a dozing / low power state.
- private static final int STATE_DOZING = 1 << 2;
-
- // Set when the device has entered a dreaming state, which includes dozing.
- private static final int STATE_DREAMING = 1 << 3;
-
- // Set when the device is in a low light environment.
- private static final int STATE_LOW_LIGHT = 1 << 4;
-
- // The aggregate current state.
- private int mState;
- private boolean mIsMonitoringLowLight;
- private boolean mIsMonitoringDream;
-
- private final BroadcastDispatcher mBroadcastDispatcher;
-
- private final PowerManager mPowerManager;
-
- // Keyguard state controller for monitoring keyguard show state.
- private final KeyguardStateController mKeyguardStateController;
-
- // Status bar state controller for monitoring when the device is dozing.
- private final StatusBarStateController mStatusBarStateController;
-
- // Intent filter for receiving dream broadcasts.
- private IntentFilter mDreamIntentFilter;
-
- // Monitor for the current ambient light mode. Used to trigger / exit low-light mode.
- private final AmbientLightModeMonitor mAmbientLightModeMonitor;
-
- private final KeyguardStateController.Callback mKeyguardCallback =
- new KeyguardStateController.Callback() {
- @Override
- public void onKeyguardShowingChanged() {
- setState(STATE_KEYGUARD_SHOWING, mKeyguardStateController.isShowing());
- }
- };
-
- private final StatusBarStateController.StateListener mStatusBarCallback =
- new StatusBarStateController.StateListener() {
- @Override
- public void onDozingChanged(boolean isDozing) {
- setState(STATE_DOZING, isDozing);
- }
- };
-
- private final BroadcastReceiver mDreamStateReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_DREAMING_STARTED.equals(intent.getAction())) {
- setState(STATE_DREAMING, true);
- } else if (Intent.ACTION_DREAMING_STOPPED.equals(intent.getAction())) {
- setState(STATE_DREAMING, false);
- }
- }
- };
-
- private final AmbientLightModeMonitor.Callback mAmbientLightModeCallback =
- mode -> {
- boolean shouldBeLowLight;
- switch (mode) {
- case AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_UNDECIDED:
- return;
- case AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT:
- shouldBeLowLight = false;
- break;
- case AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK:
- shouldBeLowLight = true;
- break;
- default:
- Log.w(TAG, "invalid ambient light mode");
- return;
- }
-
- if (DEBUG) Log.d(TAG, "ambient light mode changed to " + mode);
-
- final boolean isLowLight = getState(STATE_LOW_LIGHT);
- if (shouldBeLowLight != isLowLight) {
- setState(STATE_LOW_LIGHT, shouldBeLowLight);
- }
- };
-
- final Provider<View> mIdleViewProvider;
-
- @Inject
- protected IdleHostViewController(
- BroadcastDispatcher broadcastDispatcher,
- PowerManager powerManager,
- IdleHostView view,
- @Main Resources resources,
- @Named(IDLE_VIEW) Provider<View> idleViewProvider,
- KeyguardStateController keyguardStateController,
- StatusBarStateController statusBarStateController,
- AmbientLightModeMonitor ambientLightModeMonitor) {
- super(view);
- mBroadcastDispatcher = broadcastDispatcher;
- mPowerManager = powerManager;
- mIdleViewProvider = idleViewProvider;
- mKeyguardStateController = keyguardStateController;
- mStatusBarStateController = statusBarStateController;
- mAmbientLightModeMonitor = ambientLightModeMonitor;
-
- mState = STATE_KEYGUARD_SHOWING;
-
- final boolean enabled = resources.getBoolean(R.bool.config_enableIdleMode);
- if (enabled) {
- mState |= STATE_IDLE_MODE_ENABLED;
- }
-
- setState(mState, true);
-
- if (DEBUG) {
- Log.d(TAG, "initial state:" + mState + " enabled:" + enabled);
- }
- }
-
- @Override
- public void init() {
- super.init();
-
- setState(STATE_KEYGUARD_SHOWING, mKeyguardStateController.isShowing());
- setState(STATE_DOZING, mStatusBarStateController.isDozing());
- }
-
- private void setState(@State int state, boolean active) {
- final int oldState = mState;
-
- if (active) {
- mState |= state;
- } else {
- mState &= ~state;
- }
-
- if (oldState == mState) {
- return;
- }
-
- if (DEBUG) {
- Log.d(TAG, "set " + getStateName(state) + " to " + active);
- logCurrentState();
- }
-
- final boolean inCommunalMode = getState(STATE_IDLE_MODE_ENABLED)
- && getState(STATE_KEYGUARD_SHOWING);
-
- enableDreamMonitoring(inCommunalMode);
- enableLowLightMonitoring(inCommunalMode);
-
- if (state == STATE_LOW_LIGHT) {
- enableLowLightMode(inCommunalMode && active);
- }
- }
-
- private void enableDreamMonitoring(boolean enable) {
- if (mIsMonitoringDream == enable) {
- return;
- }
-
- mIsMonitoringDream = enable;
-
- if (DEBUG) {
- Log.d(TAG, (enable ? "enable" : "disable") + " dream monitoring");
- }
-
- if (mDreamIntentFilter == null) {
- mDreamIntentFilter = new IntentFilter();
- mDreamIntentFilter.addAction(Intent.ACTION_DREAMING_STARTED);
- mDreamIntentFilter.addAction(Intent.ACTION_DREAMING_STOPPED);
- }
-
- if (enable) {
- mBroadcastDispatcher.registerReceiver(mDreamStateReceiver, mDreamIntentFilter);
- } else {
- mBroadcastDispatcher.unregisterReceiver(mDreamStateReceiver);
- }
- }
-
- private void enableLowLightMonitoring(boolean enable) {
- if (enable == mIsMonitoringLowLight) {
- return;
- }
-
- mIsMonitoringLowLight = enable;
-
- if (mIsMonitoringLowLight) {
- if (DEBUG) Log.d(TAG, "enable low light monitoring");
- mAmbientLightModeMonitor.start(mAmbientLightModeCallback);
- } else {
- if (DEBUG) Log.d(TAG, "disable low light monitoring");
- mAmbientLightModeMonitor.stop();
- }
- }
-
- private void enableLowLightMode(boolean enable) {
- if (enable == getState(STATE_DOZING)) {
- return;
- }
-
- if (enable) {
- if (DEBUG) Log.d(TAG, "enter low light, start dozing");
-
- mPowerManager.goToSleep(
- SystemClock.uptimeMillis(),
- PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0);
- } else {
- if (DEBUG) Log.d(TAG, "exit low light, stop dozing");
- mPowerManager.wakeUp(SystemClock.uptimeMillis(),
- PowerManager.WAKE_REASON_APPLICATION, "Exit low light condition");
- }
- }
-
- @Override
- protected void onViewAttached() {
- if (DEBUG) {
- Log.d(TAG, "onViewAttached");
- }
-
- mKeyguardStateController.addCallback(mKeyguardCallback);
- mStatusBarStateController.addCallback(mStatusBarCallback);
- }
-
- @Override
- protected void onViewDetached() {
- mKeyguardStateController.removeCallback(mKeyguardCallback);
- mStatusBarStateController.removeCallback(mStatusBarCallback);
- }
-
- private String getStateName(@State int state) {
- switch (state) {
- case STATE_IDLE_MODE_ENABLED:
- return "STATE_IDLE_MODE_ENABLED";
- case STATE_KEYGUARD_SHOWING:
- return "STATE_KEYGUARD_SHOWING";
- case STATE_DOZING:
- return "STATE_DOZING";
- case STATE_DREAMING:
- return "STATE_DREAMING";
- case STATE_LOW_LIGHT:
- return "STATE_LOW_LIGHT";
- default:
- return "STATE_UNKNOWN";
- }
- }
-
- private boolean getState(@State int state) {
- return getState(state, mState);
- }
-
- private boolean getState(@State int state, int oldState) {
- return (oldState & state) == state;
- }
-
- private String getStateLog(@State int state) {
- return getStateName(state) + " = " + getState(state);
- }
-
- private void logCurrentState() {
- Log.d(TAG, "current state: {\n"
- + "\t" + getStateLog(STATE_IDLE_MODE_ENABLED) + "\n"
- + "\t" + getStateLog(STATE_KEYGUARD_SHOWING) + "\n"
- + "\t" + getStateLog(STATE_DOZING) + "\n"
- + "\t" + getStateLog(STATE_DREAMING) + "\n"
- + "\t" + getStateLog(STATE_LOW_LIGHT) + "\n"
- + "}");
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/idle/InputMonitorFactory.java b/packages/SystemUI/src/com/android/systemui/idle/InputMonitorFactory.java
deleted file mode 100644
index be0a378..0000000
--- a/packages/SystemUI/src/com/android/systemui/idle/InputMonitorFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.systemui.idle;
-
-import com.android.systemui.dagger.qualifiers.DisplayId;
-import com.android.systemui.shared.system.InputMonitorCompat;
-
-import javax.inject.Inject;
-
-/**
- * {@link InputMonitorFactory} generates instances of {@link InputMonitorCompat}.
- */
-public class InputMonitorFactory {
- private final int mDisplayId;
-
- @Inject
- public InputMonitorFactory(@DisplayId int displayId) {
- mDisplayId = displayId;
- }
-
- /**
- * Generates a new {@link InputMonitorCompat}.
- *
- * @param identifier Identifier to generate monitor with.
- * @return A {@link InputMonitorCompat} instance.
- */
- public InputMonitorCompat getInputMonitor(String identifier) {
- return new InputMonitorCompat(identifier, mDisplayId);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/idle/LightSensorEventsDebounceAlgorithm.kt b/packages/SystemUI/src/com/android/systemui/idle/LightSensorEventsDebounceAlgorithm.kt
deleted file mode 100644
index 7b06b96..0000000
--- a/packages/SystemUI/src/com/android/systemui/idle/LightSensorEventsDebounceAlgorithm.kt
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * 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.systemui.idle
-
-import android.content.res.Resources
-import android.util.Log
-import com.android.systemui.R
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.util.concurrency.DelayableExecutor
-import javax.inject.Inject
-
-/**
- * An algorithm that receives light sensor events, debounces the signals, and transforms into an
- * ambient light mode: light, dark, or undecided.
- *
- * More about the algorithm at go/titan-light-sensor-debouncer.
- */
-class LightSensorEventsDebounceAlgorithm @Inject constructor(
- @Main private val executor: DelayableExecutor,
- @Main resources: Resources
-) : AmbientLightModeMonitor.DebounceAlgorithm {
- companion object {
- private const val TAG = "LightDebounceAlgorithm"
- private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
- }
-
- // The ambient mode is considered light mode when the light sensor value increases exceeding
- // this value.
- private val lightModeThreshold =
- resources.getInteger(R.integer.config_ambientLightModeThreshold)
-
- // The ambient mode is considered dark mode when the light sensor value drops below this
- // value.
- private val darkModeThreshold = resources.getInteger(R.integer.config_ambientDarkModeThreshold)
-
- // Each sample for calculating light mode contains light sensor events collected for this
- // duration of time in milliseconds.
- private val lightSamplingSpanMillis =
- resources.getInteger(R.integer.config_ambientLightModeSamplingSpanMillis)
-
- // Each sample for calculating dark mode contains light sensor events collected for this
- // duration of time in milliseconds.
- private val darkSamplingSpanMillis =
- resources.getInteger(R.integer.config_ambientDarkModeSamplingSpanMillis)
-
- // The calculations for light mode is performed at this frequency in milliseconds.
- private val lightSamplingFrequencyMillis =
- resources.getInteger(R.integer.config_ambientLightModeSamplingFrequencyMillis)
-
- // The calculations for dark mode is performed at this frequency in milliseconds.
- private val darkSamplingFrequencyMillis =
- resources.getInteger(R.integer.config_ambientDarkModeSamplingFrequencyMillis)
-
- // Registered callback, which gets triggered when the ambient light mode changes.
- private var callback: AmbientLightModeMonitor.Callback? = null
-
- // Queue of bundles used for calculating [isLightMode], ordered from oldest to latest.
- val bundlesQueueLightMode = ArrayList<ArrayList<Float>>()
-
- // Queue of bundles used for calculating [isDarkMode], ordered from oldest to latest
- val bundlesQueueDarkMode = ArrayList<ArrayList<Float>>()
-
- // The current ambient light mode.
- @AmbientLightModeMonitor.AmbientLightMode
- var mode = AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_UNDECIDED
- set(value) {
- if (field == value) return
- field = value
-
- if (DEBUG) Log.d(TAG, "ambient light mode changed to $value")
-
- callback?.onChange(value)
- }
-
- // The latest claim of whether it should be light mode.
- var isLightMode = false
- set(value) {
- if (field == value) return
- field = value
-
- if (DEBUG) Log.d(TAG, "isLightMode: $value")
-
- mode = when {
- isDarkMode -> AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK
- value -> AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT
- else -> AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_UNDECIDED
- }
- }
-
- // The latest claim of whether it should be dark mode.
- var isDarkMode = false
- set(value) {
- if (field == value) return
- field = value
-
- if (DEBUG) Log.d(TAG, "isDarkMode: $value")
-
- mode = when {
- value -> AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK
- isLightMode -> AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT
- else -> AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_UNDECIDED
- }
- }
-
- // The latest average of the light mode bundle.
- var bundleAverageLightMode = 0.0
- set(value) {
- field = value
-
- if (DEBUG) Log.d(TAG, "light mode average: $value")
-
- isLightMode = value > lightModeThreshold
- }
-
- // The latest average of the dark mode bundle.
- var bundleAverageDarkMode = 0.0
- set(value) {
- field = value
-
- if (DEBUG) Log.d(TAG, "dark mode average: $value")
-
- isDarkMode = value < darkModeThreshold
- }
-
- // The latest bundle for calculating light mode claim.
- var bundleLightMode = ArrayList<Float>()
- set(value) {
- field = value
-
- val average = value.average()
-
- if (!average.isNaN()) {
- bundleAverageLightMode = average
- }
- }
-
- // The latest bundle for calculating dark mode claim.
- var bundleDarkMode = ArrayList<Float>()
- set(value) {
- field = value
-
- val average = value.average()
-
- if (!average.isNaN()) {
- bundleAverageDarkMode = average
- }
- }
-
- // The latest light level from light sensor event updates.
- var lightSensorLevel = 0.0f
- set(value) {
- field = value
-
- bundlesQueueLightMode.forEach { bundle -> bundle.add(value) }
- bundlesQueueDarkMode.forEach { bundle -> bundle.add(value) }
- }
-
- // Creates a new bundle that collects light sensor events for calculating the light mode claim,
- // and adds it to the end of the queue. It schedules a call to dequeue this bundle after
- // [LIGHT_SAMPLING_SPAN_MILLIS]. Once started, it also repeatedly calls itself at
- // [LIGHT_SAMPLING_FREQUENCY_MILLIS].
- val enqueueLightModeBundle: Runnable = object : Runnable {
- override fun run() {
- if (DEBUG) Log.d(TAG, "enqueueing a light mode bundle")
-
- bundlesQueueLightMode.add(ArrayList())
-
- executor.executeDelayed(dequeueLightModeBundle, lightSamplingSpanMillis.toLong())
- executor.executeDelayed(this, lightSamplingFrequencyMillis.toLong())
- }
- }
-
- // Creates a new bundle that collects light sensor events for calculating the dark mode claim,
- // and adds it to the end of the queue. It schedules a call to dequeue this bundle after
- // [DARK_SAMPLING_SPAN_MILLIS]. Once started, it also repeatedly calls itself at
- // [DARK_SAMPLING_FREQUENCY_MILLIS].
- val enqueueDarkModeBundle: Runnable = object : Runnable {
- override fun run() {
- if (DEBUG) Log.d(TAG, "enqueueing a dark mode bundle")
-
- bundlesQueueDarkMode.add(ArrayList())
-
- executor.executeDelayed(dequeueDarkModeBundle, darkSamplingSpanMillis.toLong())
- executor.executeDelayed(this, darkSamplingFrequencyMillis.toLong())
- }
- }
-
- // Collects the oldest bundle from the light mode bundles queue, and as a result triggering a
- // calculation of the light mode claim.
- val dequeueLightModeBundle: Runnable = object : Runnable {
- override fun run() {
- if (bundlesQueueLightMode.isEmpty()) return
-
- bundleLightMode = bundlesQueueLightMode.removeAt(0)
-
- if (DEBUG) Log.d(TAG, "dequeued a light mode bundle of size ${bundleLightMode.size}")
- }
- }
-
- // Collects the oldest bundle from the dark mode bundles queue, and as a result triggering a
- // calculation of the dark mode claim.
- val dequeueDarkModeBundle: Runnable = object : Runnable {
- override fun run() {
- if (bundlesQueueDarkMode.isEmpty()) return
-
- bundleDarkMode = bundlesQueueDarkMode.removeAt(0)
-
- if (DEBUG) Log.d(TAG, "dequeued a dark mode bundle of size ${bundleDarkMode.size}")
- }
- }
-
- /**
- * Start the algorithm.
- *
- * @param callback callback that gets triggered when the ambient light mode changes.
- */
- override fun start(callback: AmbientLightModeMonitor.Callback?) {
- if (DEBUG) Log.d(TAG, "start algorithm")
-
- if (callback == null) {
- if (DEBUG) Log.w(TAG, "callback is null")
- return
- }
-
- if (this.callback != null) {
- if (DEBUG) Log.w(TAG, "already started")
- return
- }
-
- this.callback = callback
-
- executor.execute(enqueueLightModeBundle)
- executor.execute(enqueueDarkModeBundle)
- }
-
- /**
- * Stop the algorithm.
- */
- override fun stop() {
- if (DEBUG) Log.d(TAG, "stop algorithm")
-
- if (callback == null) {
- if (DEBUG) Log.w(TAG, "haven't started")
- return
- }
-
- callback = null
-
- // Resets bundle queues.
- bundlesQueueLightMode.clear()
- bundlesQueueDarkMode.clear()
-
- // Resets ambient light mode.
- mode = AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_UNDECIDED
- }
-
- /**
- * Update the light sensor event value.
- *
- * @param value light sensor update value.
- */
- override fun onUpdateLightSensorEvent(value: Float) {
- if (callback == null) {
- if (DEBUG) Log.w(TAG, "ignore light sensor event because algorithm not started")
- return
- }
-
- lightSensorLevel = value
- }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/idle/dagger/IdleViewComponent.java b/packages/SystemUI/src/com/android/systemui/idle/dagger/IdleViewComponent.java
deleted file mode 100644
index 9754b1f..0000000
--- a/packages/SystemUI/src/com/android/systemui/idle/dagger/IdleViewComponent.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.systemui.idle.dagger;
-
-import com.android.systemui.idle.IdleHostView;
-import com.android.systemui.idle.IdleHostViewController;
-
-import dagger.BindsInstance;
-import dagger.Subcomponent;
-
-/**
- * Subcomponent for working with {@link IdleHostView}.
- */
-@Subcomponent
-public interface IdleViewComponent {
- /** Simple factory for {@link Factory}. */
- @Subcomponent.Factory
- interface Factory {
- IdleViewComponent build(@BindsInstance IdleHostView idleHostView);
- }
-
- /** Builds a {@link IdleHostViewController}. */
- IdleHostViewController getIdleHostViewController();
-}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index b96eee7..88555ed 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -102,7 +102,7 @@
"persist.wm.enable_remote_keyguard_animation";
private static final int sEnableRemoteKeyguardAnimation =
- SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 2);
+ SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
/**
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
diff --git a/packages/SystemUI/src/com/android/systemui/lowlightclock/LowLightClockController.java b/packages/SystemUI/src/com/android/systemui/lowlightclock/LowLightClockController.java
new file mode 100644
index 0000000..0b15f4f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/lowlightclock/LowLightClockController.java
@@ -0,0 +1,48 @@
+/*
+ * 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.systemui.lowlightclock;
+
+import android.view.ViewGroup;
+
+/**
+ * A controller responsible for attaching and showing an optional low-light clock while dozing.
+ */
+public interface LowLightClockController {
+ /**
+ * Returns {@code true} if the low-light clock is enabled.
+ */
+ boolean isLowLightClockEnabled();
+
+ /**
+ * Attach the low light-clock to the given parent {@link ViewGroup}.
+ * @param parent The parent {@link ViewGroup} to which the low-light clock view should be
+ * attached.
+ */
+ void attachLowLightClockView(ViewGroup parent);
+
+ /**
+ * Show or hide the low-light clock.
+ * @param show Whether to show the low-light clock.
+ * @return {@code true} if the low-light clock was shown.
+ */
+ boolean showLowLightClock(boolean show);
+
+ /**
+ * An opportunity to perform burn-in prevention.
+ */
+ void dozeTimeTick();
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
index e146768..dd35a9a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
@@ -42,4 +42,10 @@
* Check whether we support displaying information about mute await connections.
*/
fun areMuteAwaitConnectionsEnabled() = featureFlags.isEnabled(Flags.MEDIA_MUTE_AWAIT)
+
+ /**
+ * Check whether we enable support for nearby media devices. See
+ * [android.app.StatusBarManager.registerNearbyMediaDevicesProvider] for more information.
+ */
+ fun areNearbyMediaDevicesEnabled() = featureFlags.isEnabled(Flags.MEDIA_NEARBY_DEVICES)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
index 6145f0f..eee3955 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
@@ -28,6 +28,7 @@
import android.view.ViewGroup
import android.view.ViewGroupOverlay
import androidx.annotation.VisibleForTesting
+import com.android.keyguard.KeyguardViewController
import com.android.systemui.R
import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
@@ -40,7 +41,6 @@
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.notification.stack.StackStateAnimator
import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.Utils
@@ -83,7 +83,7 @@
private val notifLockscreenUserManager: NotificationLockscreenUserManager,
configurationController: ConfigurationController,
wakefulnessLifecycle: WakefulnessLifecycle,
- private val statusBarKeyguardViewManager: StatusBarKeyguardViewManager,
+ private val keyguardViewController: KeyguardViewController,
private val dreamOverlayStateController: DreamOverlayStateController
) {
@@ -1016,7 +1016,7 @@
private fun isLockScreenVisibleToUser(): Boolean {
return !statusBarStateController.isDozing &&
- !statusBarKeyguardViewManager.isBouncerShowing &&
+ !keyguardViewController.isBouncerShowing &&
statusBarStateController.state == StatusBarState.KEYGUARD &&
notifLockscreenUserManager.shouldShowLockscreenNotifications() &&
statusBarStateController.isExpanded &&
@@ -1025,7 +1025,7 @@
private fun isLockScreenShadeVisibleToUser(): Boolean {
return !statusBarStateController.isDozing &&
- !statusBarKeyguardViewManager.isBouncerShowing &&
+ !keyguardViewController.isBouncerShowing &&
(statusBarStateController.state == StatusBarState.SHADE_LOCKED ||
(statusBarStateController.state == StatusBarState.KEYGUARD && qsExpanded))
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
index 3225f73..c3b4354 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
@@ -16,13 +16,7 @@
package com.android.systemui.media.dagger;
-import android.app.Service;
-import android.content.Context;
-import android.os.Handler;
-import android.view.WindowManager;
-
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.media.MediaDataManager;
import com.android.systemui.media.MediaFlags;
import com.android.systemui.media.MediaHierarchyManager;
@@ -30,24 +24,19 @@
import com.android.systemui.media.MediaHostStatesManager;
import com.android.systemui.media.dream.dagger.MediaComplicationComponent;
import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionCli;
-import com.android.systemui.media.nearby.NearbyMediaDevicesService;
+import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.media.taptotransfer.MediaTttCommandLineHelper;
import com.android.systemui.media.taptotransfer.MediaTttFlags;
import com.android.systemui.media.taptotransfer.receiver.MediaTttChipControllerReceiver;
import com.android.systemui.media.taptotransfer.sender.MediaTttChipControllerSender;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.commandline.CommandRegistry;
import java.util.Optional;
-import java.util.concurrent.Executor;
import javax.inject.Named;
-import dagger.Binds;
+import dagger.Lazy;
import dagger.Module;
import dagger.Provides;
-import dagger.multibindings.ClassKey;
-import dagger.multibindings.IntoMap;
/** Dagger module for the media package. */
@Module(subcomponents = {
@@ -104,13 +93,11 @@
@SysUISingleton
static Optional<MediaTttChipControllerSender> providesMediaTttChipControllerSender(
MediaTttFlags mediaTttFlags,
- CommandQueue commandQueue,
- Context context,
- WindowManager windowManager) {
+ Lazy<MediaTttChipControllerSender> controllerSenderLazy) {
if (!mediaTttFlags.isMediaTttEnabled()) {
return Optional.empty();
}
- return Optional.of(new MediaTttChipControllerSender(commandQueue, context, windowManager));
+ return Optional.of(controllerSenderLazy.get());
}
/** */
@@ -118,16 +105,11 @@
@SysUISingleton
static Optional<MediaTttChipControllerReceiver> providesMediaTttChipControllerReceiver(
MediaTttFlags mediaTttFlags,
- CommandQueue commandQueue,
- Context context,
- WindowManager windowManager,
- @Main Handler mainHandler) {
+ Lazy<MediaTttChipControllerReceiver> controllerReceiverLazy) {
if (!mediaTttFlags.isMediaTttEnabled()) {
return Optional.empty();
}
- return Optional.of(
- new MediaTttChipControllerReceiver(
- commandQueue, context, windowManager, mainHandler));
+ return Optional.of(controllerReceiverLazy.get());
}
/** */
@@ -135,14 +117,11 @@
@SysUISingleton
static Optional<MediaTttCommandLineHelper> providesMediaTttCommandLineHelper(
MediaTttFlags mediaTttFlags,
- CommandRegistry commandRegistry,
- Context context,
- @Main Executor mainExecutor) {
+ Lazy<MediaTttCommandLineHelper> helperLazy) {
if (!mediaTttFlags.isMediaTttEnabled()) {
return Optional.empty();
}
- return Optional.of(
- new MediaTttCommandLineHelper(commandRegistry, context, mainExecutor));
+ return Optional.of(helperLazy.get());
}
/** */
@@ -150,18 +129,23 @@
@SysUISingleton
static Optional<MediaMuteAwaitConnectionCli> providesMediaMuteAwaitConnectionCli(
MediaFlags mediaFlags,
- CommandRegistry commandRegistry,
- Context context
+ Lazy<MediaMuteAwaitConnectionCli> muteAwaitConnectionCliLazy
) {
if (!mediaFlags.areMuteAwaitConnectionsEnabled()) {
return Optional.empty();
}
- return Optional.of(new MediaMuteAwaitConnectionCli(commandRegistry, context));
+ return Optional.of(muteAwaitConnectionCliLazy.get());
}
- /** Inject into NearbyMediaDevicesService. */
- @Binds
- @IntoMap
- @ClassKey(NearbyMediaDevicesService.class)
- Service bindMediaNearbyDevicesService(NearbyMediaDevicesService service);
+ /** */
+ @Provides
+ @SysUISingleton
+ static Optional<NearbyMediaDevicesManager> providesNearbyMediaDevicesManager(
+ MediaFlags mediaFlags,
+ Lazy<NearbyMediaDevicesManager> nearbyMediaDevicesManagerLazy) {
+ if (!mediaFlags.areNearbyMediaDevicesEnabled()) {
+ return Optional.empty();
+ }
+ return Optional.of(nearbyMediaDevicesManagerLazy.get());
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
index 196dbf1..3cd3905 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
@@ -16,6 +16,7 @@
package com.android.systemui.media.dialog;
+import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
@@ -23,8 +24,10 @@
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.CheckBox;
import androidx.annotation.NonNull;
+import androidx.core.widget.CompoundButtonCompat;
import com.android.settingslib.Utils;
import com.android.settingslib.media.LocalMediaManager.MediaDeviceState;
@@ -100,8 +103,11 @@
}
mCheckBox.setVisibility(View.GONE);
mStatusIcon.setVisibility(View.GONE);
- mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
- R.color.media_dialog_inactive_item_main_content));
+ mContainerLayout.setOnClickListener(null);
+ mTitleText.setTextColor(mController.getColorInactiveItem());
+ mSeekBar.getProgressDrawable().setColorFilter(
+ new PorterDuffColorFilter(mController.getColorSeekbarProgress(),
+ PorterDuff.Mode.SRC_IN));
if (mCurrentActivePosition == position) {
mCurrentActivePosition = -1;
}
@@ -117,6 +123,10 @@
if (mController.isTransferring()) {
if (device.getState() == MediaDeviceState.STATE_CONNECTING
&& !mController.hasAdjustVolumeUserRestriction()) {
+ mProgressBar.getIndeterminateDrawable().setColorFilter(
+ new PorterDuffColorFilter(
+ mController.getColorInactiveItem(),
+ PorterDuff.Mode.SRC_IN));
setSingleLineLayout(getItemTitle(device), true /* bFocused */,
false /* showSeekBar*/,
true /* showProgressBar */, false /* showStatus */);
@@ -130,6 +140,7 @@
mTitleIcon.setAlpha(DEVICE_CONNECTED_ALPHA);
mStatusIcon.setImageDrawable(
mContext.getDrawable(R.drawable.media_output_status_failed));
+ mStatusIcon.setColorFilter(mController.getColorInactiveItem());
setTwoLineLayout(device, false /* bFocused */,
false /* showSeekBar */, false /* showProgressBar */,
true /* showSubtitle */, true /* showStatus */);
@@ -137,33 +148,36 @@
mContainerLayout.setOnClickListener(v -> onItemClick(v, device));
} else if (mController.getSelectedMediaDevice().size() > 1
&& isDeviceIncluded(mController.getSelectedMediaDevice(), device)) {
- mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
- R.color.media_dialog_active_item_main_content));
+ mTitleText.setTextColor(mController.getColorActiveItem());
setSingleLineLayout(getItemTitle(device), true /* bFocused */,
true /* showSeekBar */,
false /* showProgressBar */, false /* showStatus */);
+ mCheckBox.setOnCheckedChangeListener(null);
mCheckBox.setVisibility(View.VISIBLE);
mCheckBox.setChecked(true);
mCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
onCheckBoxClicked(false, device);
});
+ setCheckBoxColor(mCheckBox, mController.getColorActiveItem());
initSessionSeekbar();
} else if (!mController.hasAdjustVolumeUserRestriction() && currentlyConnected) {
mStatusIcon.setImageDrawable(
mContext.getDrawable(R.drawable.media_output_status_check));
- mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
- R.color.media_dialog_active_item_main_content));
+ mStatusIcon.setColorFilter(mController.getColorActiveItem());
+ mTitleText.setTextColor(mController.getColorActiveItem());
setSingleLineLayout(getItemTitle(device), true /* bFocused */,
true /* showSeekBar */,
false /* showProgressBar */, true /* showStatus */);
initSeekbar(device);
mCurrentActivePosition = position;
} else if (isDeviceIncluded(mController.getSelectableMediaDevice(), device)) {
+ mCheckBox.setOnCheckedChangeListener(null);
mCheckBox.setVisibility(View.VISIBLE);
mCheckBox.setChecked(false);
mCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
onCheckBoxClicked(true, device);
});
+ setCheckBoxColor(mCheckBox, mController.getColorInactiveItem());
setSingleLineLayout(getItemTitle(device), false /* bFocused */,
false /* showSeekBar */,
false /* showProgressBar */, false /* showStatus */);
@@ -175,11 +189,17 @@
}
}
+ public void setCheckBoxColor(CheckBox checkBox, int color) {
+ int[][] states = {{android.R.attr.state_checked}, {}};
+ int[] colors = {color, color};
+ CompoundButtonCompat.setButtonTintList(checkBox, new
+ ColorStateList(states, colors));
+ }
+
@Override
void onBind(int customizedItem, boolean topMargin, boolean bottomMargin) {
if (customizedItem == CUSTOMIZED_ITEM_PAIR_NEW) {
- mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
- R.color.media_dialog_inactive_item_main_content));
+ mTitleText.setTextColor(mController.getColorInactiveItem());
mCheckBox.setVisibility(View.GONE);
setSingleLineLayout(mContext.getText(R.string.media_output_dialog_pairing_new),
false /* bFocused */);
@@ -187,7 +207,7 @@
d.setColorFilter(new PorterDuffColorFilter(
Utils.getColorAccentDefaultColor(mContext), PorterDuff.Mode.SRC_IN));
mTitleIcon.setImageDrawable(d);
- mContainerLayout.setOnClickListener(v -> onItemClick(CUSTOMIZED_ITEM_PAIR_NEW));
+ mContainerLayout.setOnClickListener(mController::launchBluetoothPairing);
}
}
@@ -224,11 +244,5 @@
notifyDataSetChanged();
}
}
-
- private void onItemClick(int customizedItem) {
- if (customizedItem == CUSTOMIZED_ITEM_PAIR_NEW) {
- mController.launchBluetoothPairing();
- }
- }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
index a8d30d4..1f11d0c 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
@@ -18,6 +18,7 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.app.WallpaperColors;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
@@ -56,7 +57,7 @@
static final int CUSTOMIZED_ITEM_GROUP = 2;
static final int CUSTOMIZED_ITEM_DYNAMIC_GROUP = 3;
- final MediaOutputController mController;
+ protected final MediaOutputController mController;
private int mMargin;
private boolean mIsAnimating;
@@ -84,6 +85,10 @@
return null;
}
+ void updateColorScheme(WallpaperColors wallpaperColors, boolean isDarkTheme) {
+ mController.setCurrentColorScheme(wallpaperColors, isDarkTheme);
+ }
+
CharSequence getItemTitle(MediaDevice device) {
return device.getName();
}
@@ -105,6 +110,10 @@
return mCurrentActivePosition;
}
+ public MediaOutputController getController() {
+ return mController;
+ }
+
/**
* ViewHolder for binding device view.
*/
@@ -168,6 +177,9 @@
.mutate() : mContext.getDrawable(
R.drawable.media_output_item_background)
.mutate();
+ backgroundDrawable.setColorFilter(new PorterDuffColorFilter(
+ mController.getColorItemBackground(),
+ PorterDuff.Mode.SRC_IN));
mItemLayout.setBackground(backgroundDrawable);
mProgressBar.setVisibility(showProgressBar ? View.VISIBLE : View.GONE);
mSeekBar.setAlpha(1);
@@ -203,8 +215,13 @@
mStatusIcon.setVisibility(showStatus ? View.VISIBLE : View.GONE);
mSeekBar.setAlpha(1);
mSeekBar.setVisibility(showSeekBar ? View.VISIBLE : View.GONE);
- mItemLayout.setBackground(mContext.getDrawable(R.drawable.media_output_item_background)
- .mutate());
+ final Drawable backgroundDrawable = mContext.getDrawable(
+ R.drawable.media_output_item_background)
+ .mutate();
+ backgroundDrawable.setColorFilter(new PorterDuffColorFilter(
+ mController.getColorItemBackground(),
+ PorterDuff.Mode.SRC_IN));
+ mItemLayout.setBackground(backgroundDrawable);
mProgressBar.setVisibility(showProgressBar ? View.VISIBLE : View.GONE);
mSubTitleText.setVisibility(showSubtitle ? View.VISIBLE : View.GONE);
mTwoLineTitleText.setTranslationY(0);
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java
index 8731a2c..7bb5454 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java
@@ -19,8 +19,19 @@
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
+import android.app.WallpaperColors;
import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -70,9 +81,12 @@
private ImageView mAppResourceIcon;
private RecyclerView mDevicesRecyclerView;
private LinearLayout mDeviceListLayout;
+ private LinearLayout mCastAppLayout;
private Button mDoneButton;
private Button mStopButton;
+ private Button mAppButton;
private int mListMaxHeight;
+ private WallpaperColors mWallpaperColors;
MediaOutputBaseAdapter mAdapter;
@@ -122,7 +136,9 @@
mDeviceListLayout = mDialogView.requireViewById(R.id.device_list);
mDoneButton = mDialogView.requireViewById(R.id.done);
mStopButton = mDialogView.requireViewById(R.id.stop);
+ mAppButton = mDialogView.requireViewById(R.id.launch_app_button);
mAppResourceIcon = mDialogView.requireViewById(R.id.app_source_icon);
+ mCastAppLayout = mDialogView.requireViewById(R.id.cast_app_section);
mDeviceListLayout.getViewTreeObserver().addOnGlobalLayoutListener(
mDeviceListLayoutListener);
@@ -137,6 +153,13 @@
mMediaOutputController.releaseSession();
dismiss();
});
+ mAppButton.setOnClickListener(v -> {
+ mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ if (mMediaOutputController.getAppLaunchIntent() != null) {
+ mContext.startActivity(mMediaOutputController.getAppLaunchIntent());
+ }
+ dismiss();
+ });
}
@Override
@@ -161,8 +184,17 @@
final int iconRes = getHeaderIconRes();
final IconCompat iconCompat = getHeaderIcon();
final Drawable appSourceDrawable = getAppSourceIcon();
+ boolean colorSetUpdated = false;
+ mCastAppLayout.setVisibility(
+ mMediaOutputController.shouldShowLaunchSection()
+ ? View.VISIBLE : View.GONE);
if (appSourceDrawable != null) {
mAppResourceIcon.setImageDrawable(appSourceDrawable);
+ mAppButton.setCompoundDrawablesWithIntrinsicBounds(resizeDrawable(appSourceDrawable,
+ mContext.getResources().getDimensionPixelSize(
+ R.dimen.media_output_dialog_app_tier_icon_size
+ )),
+ null, null, null);
} else {
mAppResourceIcon.setVisibility(View.GONE);
}
@@ -170,8 +202,24 @@
mHeaderIcon.setVisibility(View.VISIBLE);
mHeaderIcon.setImageResource(iconRes);
} else if (iconCompat != null) {
+ Icon icon = iconCompat.toIcon(mContext);
+ Configuration config = mContext.getResources().getConfiguration();
+ int currentNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK;
+ boolean isDarkThemeOn = currentNightMode == Configuration.UI_MODE_NIGHT_YES;
+ WallpaperColors wallpaperColors = WallpaperColors.fromBitmap(icon.getBitmap());
+ colorSetUpdated = !wallpaperColors.equals(mWallpaperColors);
+ if (colorSetUpdated) {
+ mAdapter.updateColorScheme(wallpaperColors, isDarkThemeOn);
+ ColorFilter buttonColorFilter = new PorterDuffColorFilter(
+ mAdapter.getController().getColorButtonBackground(),
+ PorterDuff.Mode.SRC_IN);
+ ColorFilter onlineButtonColorFilter = new PorterDuffColorFilter(
+ mAdapter.getController().getColorInactiveItem(), PorterDuff.Mode.SRC_IN);
+ mDoneButton.getBackground().setColorFilter(buttonColorFilter);
+ mStopButton.getBackground().setColorFilter(onlineButtonColorFilter);
+ }
mHeaderIcon.setVisibility(View.VISIBLE);
- mHeaderIcon.setImageIcon(iconCompat.toIcon(mContext));
+ mHeaderIcon.setImageIcon(icon);
} else {
mHeaderIcon.setVisibility(View.GONE);
}
@@ -181,6 +229,7 @@
R.dimen.media_output_dialog_header_icon_padding);
mHeaderIcon.setLayoutParams(new LinearLayout.LayoutParams(size + padding, size));
}
+ mAppButton.setText(mMediaOutputController.getAppSourceName());
// Update title and subtitle
mHeaderTitle.setText(getHeaderText());
final CharSequence subTitle = getHeaderSubtitle();
@@ -194,7 +243,7 @@
}
if (!mAdapter.isDragging() && !mAdapter.isAnimating()) {
int currentActivePosition = mAdapter.getCurrentActivePosition();
- if (!deviceSetChanged && currentActivePosition >= 0
+ if (!colorSetUpdated && !deviceSetChanged && currentActivePosition >= 0
&& currentActivePosition < mAdapter.getItemCount()) {
mAdapter.notifyItemChanged(currentActivePosition);
} else {
@@ -205,6 +254,22 @@
mStopButton.setVisibility(getStopButtonVisibility());
}
+ private Drawable resizeDrawable(Drawable drawable, int size) {
+ if (drawable == null) {
+ return null;
+ }
+ int width = drawable.getIntrinsicWidth();
+ int height = drawable.getIntrinsicHeight();
+ Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
+ : Bitmap.Config.RGB_565;
+ Bitmap bitmap = Bitmap.createBitmap(width, height, config);
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, width, height);
+ drawable.draw(canvas);
+ return new BitmapDrawable(mContext.getResources(),
+ Bitmap.createScaledBitmap(bitmap, size, size, false));
+ }
+
abstract Drawable getAppSourceIcon();
abstract int getHeaderIconRes();
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
index 4961711..7bc0f52 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
@@ -19,10 +19,11 @@
import static android.provider.Settings.ACTION_BLUETOOTH_PAIRING_SETTINGS;
import android.app.Notification;
+import android.app.WallpaperColors;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
@@ -45,6 +46,8 @@
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
+import androidx.mediarouter.media.MediaRouter;
+import androidx.mediarouter.media.MediaRouterParams;
import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -56,7 +59,9 @@
import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.DialogLaunchAnimator;
+import com.android.systemui.monet.ColorScheme;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
@@ -103,6 +108,12 @@
private MediaOutputMetricLogger mMetricLogger;
private UiEventLogger mUiEventLogger;
+ private int mColorActiveItem;
+ private int mColorInactiveItem;
+ private int mColorSeekbarProgress;
+ private int mColorButtonBackground;
+ private int mColorItemBackground;
+
@Inject
public MediaOutputController(@NonNull Context context, String packageName,
boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager
@@ -125,6 +136,16 @@
mVolumeAdjustmentForRemoteGroupSessions = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
mDialogManager = dialogManager;
+ mColorActiveItem = Utils.getColorStateListDefaultColor(mContext,
+ R.color.media_dialog_active_item_main_content);
+ mColorInactiveItem = Utils.getColorStateListDefaultColor(mContext,
+ R.color.media_dialog_inactive_item_main_content);
+ mColorSeekbarProgress = Utils.getColorStateListDefaultColor(mContext,
+ android.R.color.system_accent1_200);
+ mColorButtonBackground = Utils.getColorStateListDefaultColor(mContext,
+ R.color.media_dialog_item_background);
+ mColorItemBackground = Utils.getColorStateListDefaultColor(mContext,
+ android.R.color.system_accent2_50);
}
void start(@NonNull Callback cb) {
@@ -157,6 +178,12 @@
mLocalMediaManager.startScan();
}
+ boolean shouldShowLaunchSection() {
+ MediaRouterParams routerParams = MediaRouter.getInstance(mContext).getRouterParams();
+ Log.d(TAG, "try to get routerParams: " + routerParams);
+ return routerParams != null && !routerParams.isMediaTransferReceiverEnabled();
+ }
+
void stop() {
if (mMediaController != null) {
mMediaController.unregisterCallback(mCb);
@@ -206,6 +233,32 @@
}
}
+ String getAppSourceName() {
+ if (mPackageName.isEmpty()) {
+ return null;
+ }
+ final PackageManager packageManager = mContext.getPackageManager();
+ ApplicationInfo applicationInfo;
+ try {
+ applicationInfo = packageManager.getApplicationInfo(mPackageName,
+ PackageManager.ApplicationInfoFlags.of(0));
+ } catch (PackageManager.NameNotFoundException e) {
+ applicationInfo = null;
+ }
+ final String applicationName =
+ (String) (applicationInfo != null ? packageManager.getApplicationLabel(
+ applicationInfo)
+ : mContext.getString(R.string.media_output_dialog_unknown_launch_app_name));
+ return applicationName;
+ }
+
+ Intent getAppLaunchIntent() {
+ if (mPackageName.isEmpty()) {
+ return null;
+ }
+ return mContext.getPackageManager().getLaunchIntentForPackage(mPackageName);
+ }
+
CharSequence getHeaderTitle() {
if (mMediaController != null) {
final MediaMetadata metadata = mMediaController.getMetadata();
@@ -264,13 +317,8 @@
}
void setColorFilter(Drawable drawable, boolean isActive) {
- final ColorStateList list =
- mContext.getResources().getColorStateList(
- isActive
- ? R.color.media_dialog_active_item_main_content
- : R.color.media_dialog_inactive_item_main_content,
- mContext.getTheme());
- drawable.setColorFilter(new PorterDuffColorFilter(list.getDefaultColor(),
+ drawable.setColorFilter(new PorterDuffColorFilter(isActive
+ ? mColorActiveItem : mColorInactiveItem,
PorterDuff.Mode.SRC_IN));
}
@@ -301,6 +349,44 @@
return null;
}
+ void setCurrentColorScheme(WallpaperColors wallpaperColors, boolean isDarkTheme) {
+ ColorScheme mCurrentColorScheme = new ColorScheme(wallpaperColors,
+ isDarkTheme);
+ if (isDarkTheme) {
+ mColorActiveItem = mCurrentColorScheme.getNeutral1().get(10);
+ mColorInactiveItem = mCurrentColorScheme.getNeutral1().get(10);
+ mColorSeekbarProgress = mCurrentColorScheme.getAccent1().get(2);
+ mColorButtonBackground = mCurrentColorScheme.getAccent1().get(2);
+ mColorItemBackground = mCurrentColorScheme.getAccent2().get(0);
+ } else {
+ mColorActiveItem = mCurrentColorScheme.getNeutral1().get(10);
+ mColorInactiveItem = mCurrentColorScheme.getAccent1().get(7);
+ mColorSeekbarProgress = mCurrentColorScheme.getAccent1().get(3);
+ mColorButtonBackground = mCurrentColorScheme.getAccent1().get(3);
+ mColorItemBackground = mCurrentColorScheme.getAccent2().get(0);
+ }
+ }
+
+ public int getColorActiveItem() {
+ return mColorActiveItem;
+ }
+
+ public int getColorInactiveItem() {
+ return mColorInactiveItem;
+ }
+
+ public int getColorSeekbarProgress() {
+ return mColorSeekbarProgress;
+ }
+
+ public int getColorButtonBackground() {
+ return mColorButtonBackground;
+ }
+
+ public int getColorItemBackground() {
+ return mColorItemBackground;
+ }
+
private void buildMediaDevices(List<MediaDevice> devices) {
// For the first time building list, to make sure the top device is the connected device.
if (mMediaDevices.isEmpty()) {
@@ -492,12 +578,14 @@
return false;
}
- void launchBluetoothPairing() {
- // Dismissing a dialog into its touch surface and starting an activity at the same time
- // looks bad, so let's make sure the dialog just fades out quickly.
- mDialogLaunchAnimator.disableAllCurrentDialogsExitAnimations();
+ void launchBluetoothPairing(View view) {
+ ActivityLaunchAnimator.Controller controller =
+ mDialogLaunchAnimator.createActivityLaunchController(view);
- mCallback.dismissDialog();
+ if (controller == null) {
+ mCallback.dismissDialog();
+ }
+
Intent launchIntent =
new Intent(ACTION_BLUETOOTH_PAIRING_SETTINGS)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
@@ -512,10 +600,10 @@
deepLinkIntent.putExtra(
Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
PAGE_CONNECTED_DEVICES_KEY);
- mActivityStarter.startActivity(deepLinkIntent, true);
+ mActivityStarter.startActivity(deepLinkIntent, true, controller);
return;
}
- mActivityStarter.startActivity(launchIntent, true);
+ mActivityStarter.startActivity(launchIntent, true, controller);
}
void launchMediaOutputGroupDialog(View mediaOutputDialog) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesManager.kt b/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesManager.kt
new file mode 100644
index 0000000..9875ffb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesManager.kt
@@ -0,0 +1,107 @@
+/*
+ * 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.systemui.media.nearby
+
+import android.media.INearbyMediaDevicesProvider
+import android.media.INearbyMediaDevicesUpdateCallback
+import com.android.systemui.dagger.SysUISingleton
+import android.os.IBinder
+import com.android.systemui.statusbar.CommandQueue
+import javax.inject.Inject
+
+/**
+ * A service that acts as a bridge between (1) external clients that have data on nearby devices
+ * that are able to play media and (2) internal clients (like media Output Switcher) that need data
+ * on these nearby devices.
+ *
+ * TODO(b/216313420): Add logging to this class.
+ */
+@SysUISingleton
+class NearbyMediaDevicesManager @Inject constructor(
+ commandQueue: CommandQueue
+) {
+ private var providers: MutableList<INearbyMediaDevicesProvider> = mutableListOf()
+ private var activeCallbacks: MutableList<INearbyMediaDevicesUpdateCallback> = mutableListOf()
+
+ private val commandQueueCallbacks = object : CommandQueue.Callbacks {
+ override fun registerNearbyMediaDevicesProvider(newProvider: INearbyMediaDevicesProvider) {
+ if (providers.contains(newProvider)) {
+ return
+ }
+ activeCallbacks.forEach {
+ newProvider.registerNearbyDevicesCallback(it)
+ }
+ providers.add(newProvider)
+ newProvider.asBinder().linkToDeath(deathRecipient, /* flags= */ 0)
+ }
+
+ override fun unregisterNearbyMediaDevicesProvider(
+ newProvider: INearbyMediaDevicesProvider
+ ) {
+ providers.remove(newProvider)
+ }
+ }
+
+ private val deathRecipient = object : IBinder.DeathRecipient {
+ override fun binderDied() {
+ // Should not be used as binderDied(IBinder who) is overridden.
+ }
+
+ override fun binderDied(who: IBinder) {
+ binderDiedInternal(who)
+ }
+ }
+
+ init {
+ commandQueue.addCallback(commandQueueCallbacks)
+ }
+
+ /**
+ * Registers [callback] to be notified each time a device's range changes or when a new device
+ * comes within range.
+ *
+ * If a new provider is added, previously-registered callbacks will be registered with the
+ * new provider.
+ */
+ fun registerNearbyDevicesCallback(callback: INearbyMediaDevicesUpdateCallback) {
+ providers.forEach {
+ it.registerNearbyDevicesCallback(callback)
+ }
+ activeCallbacks.add(callback)
+ }
+
+ /**
+ * Un-registers [callback]. See [registerNearbyDevicesCallback].
+ */
+ fun unregisterNearbyDevicesCallback(callback: INearbyMediaDevicesUpdateCallback) {
+ activeCallbacks.remove(callback)
+ providers.forEach {
+ it.unregisterNearbyDevicesCallback(callback)
+ }
+ }
+
+ private fun binderDiedInternal(who: IBinder) {
+ synchronized(providers) {
+ for (i in providers.size - 1 downTo 0) {
+ if (providers[i].asBinder() == who) {
+ providers.removeAt(i)
+ break
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesService.kt b/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesService.kt
deleted file mode 100644
index eaf2bd9..0000000
--- a/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesService.kt
+++ /dev/null
@@ -1,81 +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.systemui.media.nearby
-
-import android.app.Service
-import android.content.Intent
-import android.os.IBinder
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.shared.media.INearbyMediaDevicesProvider
-import com.android.systemui.shared.media.INearbyMediaDevicesService
-import com.android.systemui.shared.media.INearbyMediaDevicesUpdateCallback
-import com.android.systemui.shared.media.NearbyDevice
-import javax.inject.Inject
-
-/**
- * A service that acts as a bridge between (1) external clients that have data on nearby devices
- * that are able to play media and (2) internal clients (like media Output Switcher) that need data
- * on these nearby devices.
- *
- * TODO(b/216313420): Add logging to this class.
- */
-@SysUISingleton
-class NearbyMediaDevicesService @Inject constructor() : Service() {
-
- private var provider: INearbyMediaDevicesProvider? = null
-
- private val binder: IBinder = object : INearbyMediaDevicesService.Stub() {
- override fun registerProvider(newProvider: INearbyMediaDevicesProvider) {
- provider = newProvider
- newProvider.asBinder().linkToDeath(
- {
- // We might've gotten a new provider before the old provider died, so we only
- // need to clear our provider if the most recent provider died.
- if (provider == newProvider) {
- provider = null
- }
- },
- /* flags= */ 0
- )
- }
- }
-
- override fun onBind(intent: Intent?): IBinder = binder
-
- /** Returns a list containing the current nearby devices. */
- fun getCurrentNearbyDevices(): List<NearbyDevice> {
- val currentProvider = provider ?: return emptyList()
- return currentProvider.currentNearbyDevices
- }
-
- /**
- * Registers [callback] to be notified each time a device's range changes or when a new device
- * comes within range.
- */
- fun registerNearbyDevicesCallback(callback: INearbyMediaDevicesUpdateCallback) {
- val currentProvider = provider ?: return
- currentProvider.registerNearbyDevicesCallback(callback)
- }
-
- /**
- * Un-registers [callback]. See [registerNearbyDevicesCallback].
- */
- fun unregisterNearbyDevicesCallback(callback: INearbyMediaDevicesUpdateCallback) {
- val currentProvider = provider ?: return
- currentProvider.unregisterNearbyDevicesCallback(callback)
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
index 4993105..ee2fba0 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
@@ -25,8 +25,11 @@
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
+import androidx.annotation.VisibleForTesting
import com.android.internal.widget.CachingIconView
import com.android.systemui.R
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.util.concurrency.DelayableExecutor
/**
* A superclass controller that provides common functionality for showing chips on the sender device
@@ -38,6 +41,7 @@
abstract class MediaTttChipControllerCommon<T : MediaTttChipState>(
internal val context: Context,
private val windowManager: WindowManager,
+ @Main private val mainExecutor: DelayableExecutor,
@LayoutRes private val chipLayoutRes: Int
) {
/** The window layout parameters we'll use when attaching the view to a window. */
@@ -56,6 +60,9 @@
/** The chip view currently being displayed. Null if the chip is not being displayed. */
var chipView: ViewGroup? = null
+ /** A [Runnable] that, when run, will cancel the pending timeout of the chip. */
+ var cancelChipViewTimeout: Runnable? = null
+
/**
* Displays the chip with the current state.
*
@@ -77,8 +84,11 @@
if (oldChipView == null) {
windowManager.addView(chipView, windowLayoutParams)
}
- }
+ // Cancel and re-set the chip timeout each time we get a new state.
+ cancelChipViewTimeout?.run()
+ cancelChipViewTimeout = mainExecutor.executeDelayed(this::removeChip, TIMEOUT_MILLIS)
+ }
/** Hides the chip. */
fun removeChip() {
@@ -118,3 +128,5 @@
// Used in CTS tests UpdateMediaTapToTransferSenderDisplayTest and
// UpdateMediaTapToTransferReceiverDisplayTest
private const val WINDOW_TITLE = "Media Transfer Chip View"
+@VisibleForTesting
+const val TIMEOUT_MILLIS = 3000L
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
index 18623c0..214a888 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
@@ -18,7 +18,6 @@
import android.app.StatusBarManager
import android.content.Context
-import android.graphics.drawable.Drawable
import android.graphics.drawable.Icon
import android.media.MediaRoute2Info
import android.os.Handler
@@ -27,10 +26,10 @@
import android.view.WindowManager
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.media.taptotransfer.common.MediaTttChipControllerCommon
import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.util.concurrency.DelayableExecutor
import javax.inject.Inject
/**
@@ -43,9 +42,10 @@
commandQueue: CommandQueue,
context: Context,
windowManager: WindowManager,
+ mainExecutor: DelayableExecutor,
@Main private val mainHandler: Handler,
) : MediaTttChipControllerCommon<ChipStateReceiver>(
- context, windowManager, R.layout.media_ttt_chip_receiver
+ context, windowManager, mainExecutor, R.layout.media_ttt_chip_receiver
) {
private val commandQueueCallbacks = object : CommandQueue.Callbacks {
override fun updateMediaTapToTransferReceiverDisplay(
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
index da767ea..482e604 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
@@ -27,8 +27,10 @@
import com.android.internal.statusbar.IUndoMediaTransferCallback
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.media.taptotransfer.common.MediaTttChipControllerCommon
import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.util.concurrency.DelayableExecutor
import javax.inject.Inject
/**
@@ -40,8 +42,9 @@
commandQueue: CommandQueue,
context: Context,
windowManager: WindowManager,
+ @Main private val mainExecutor: DelayableExecutor,
) : MediaTttChipControllerCommon<ChipStateSender>(
- context, windowManager, R.layout.media_ttt_chip
+ context, windowManager, mainExecutor, R.layout.media_ttt_chip
) {
private val commandQueueCallbacks = object : CommandQueue.Callbacks {
override fun updateMediaTapToTransferSenderDisplay(
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index d16c019..8b39e5c 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -542,7 +542,7 @@
return mNavigationBarView;
}
- public View createView(Bundle savedState) {
+ public View createView(Bundle savedState, boolean initialVisibility) {
mFrame = (NavigationBarFrame) LayoutInflater.from(mContext).inflate(
R.layout.navigation_bar_window, null);
View barView = LayoutInflater.from(mFrame.getContext()).inflate(
@@ -550,6 +550,8 @@
barView.addOnAttachStateChangeListener(this);
mNavigationBarView = barView.findViewById(R.id.navigation_bar_view);
+ mNavigationBarView.setVisibility(initialVisibility ? View.VISIBLE : View.INVISIBLE);
+
if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView);
mWindowManager.addView(mFrame,
getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
index aa1117c..a049736 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -59,6 +59,7 @@
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
import com.android.systemui.statusbar.phone.LightBarController;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.wm.shell.back.BackAnimation;
import com.android.wm.shell.pip.Pip;
@@ -85,6 +86,7 @@
private final NavigationBar.Factory mNavigationBarFactory;
private final DisplayManager mDisplayManager;
private final TaskbarDelegate mTaskbarDelegate;
+ private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private int mNavMode;
@VisibleForTesting boolean mIsTablet;
@@ -108,6 +110,7 @@
NavBarHelper navBarHelper,
TaskbarDelegate taskbarDelegate,
NavigationBar.Factory navigationBarFactory,
+ StatusBarKeyguardViewManager statusBarKeyguardViewManager,
DumpManager dumpManager,
AutoHideController autoHideController,
LightBarController lightBarController,
@@ -122,6 +125,7 @@
mConfigChanges.applyNewConfig(mContext.getResources());
mNavMode = navigationModeController.addListener(this);
mTaskbarDelegate = taskbarDelegate;
+ mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
navBarHelper, navigationModeController, sysUiFlagsContainer,
dumpManager, autoHideController, lightBarController, pipOptional,
@@ -323,7 +327,8 @@
mNavigationBars.put(displayId, navBar);
- View navigationBarView = navBar.createView(savedState);
+ boolean navBarVisible = mStatusBarKeyguardViewManager.isNavBarVisible();
+ View navigationBarView = navBar.createView(savedState, navBarVisible);
navigationBarView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 593b278c..6ea7aec 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -125,6 +125,7 @@
int mDisabledFlags = 0;
int mNavigationIconHints = 0;
private int mNavBarMode;
+ private boolean mImeDrawsImeNavBar;
private final Region mTmpRegion = new Region();
private final int[] mTmpPosition = new int[2];
@@ -324,6 +325,7 @@
mIsVertical = false;
mLongClickableAccessibilityButton = false;
mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
+ mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar();
mSysUiFlagContainer = Dependency.get(SysUiState.class);
// Set up the context group of buttons
@@ -773,7 +775,7 @@
updateRecentsIcon();
- boolean isImeRenderingNavButtons = isGesturalMode(mNavBarMode)
+ boolean isImeRenderingNavButtons = mImeDrawsImeNavBar
&& mImeCanRenderGesturalNavButtons
&& (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0;
@@ -966,6 +968,7 @@
@Override
public void onNavigationModeChanged(int mode) {
mNavBarMode = mode;
+ mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar();
mBarTransitions.onNavigationModeChanged(mNavBarMode);
mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode);
updateRotationButton();
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java
index 73a0c54..6920ffb 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java
@@ -156,6 +156,11 @@
mListeners.remove(listener);
}
+ public boolean getImeDrawsImeNavBar() {
+ return mCurrentUserContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_imeDrawsImeNavBar);
+ }
+
private int getCurrentInteractionMode(Context context) {
int mode = context.getResources().getInteger(
com.android.internal.R.integer.config_navBarInteractionMode);
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index 9199911..9ea2763 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -263,15 +263,6 @@
// Notify FalsingManager that an intentional gesture has occurred.
// TODO(b/186519446): use a different method than isFalseTouch
mFalsingManager.isFalseTouch(BACK_GESTURE);
- // Only inject back keycodes when ahead-of-time back dispatching is disabled.
- if (mBackAnimation == null) {
- boolean sendDown = sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
- boolean sendUp = sendEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
- if (DEBUG_MISSING_GESTURE) {
- Log.d(DEBUG_MISSING_GESTURE_TAG, "Triggered back: down="
- + sendDown + ", up=" + sendUp);
- }
- }
mOverviewProxyService.notifyBackAction(true, (int) mDownPoint.x,
(int) mDownPoint.y, false /* isButton */, !mIsOnLeftEdge);
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
index 4da574d..a6bad15 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
@@ -162,7 +162,8 @@
// The amount the arrow is shifted to avoid the finger.
private int mFingerOffset;
- private final float mSwipeThreshold;
+ private final float mSwipeTriggerThreshold;
+ private final float mSwipeProgressThreshold;
private final Path mArrowPath = new Path();
private final Point mDisplaySize = new Point();
@@ -352,10 +353,15 @@
loadColors(context);
updateArrowDirection();
- mSwipeThreshold = context.getResources()
+ mSwipeTriggerThreshold = context.getResources()
.getDimension(R.dimen.navigation_edge_action_drag_threshold);
- setVisibility(GONE);
+ mSwipeProgressThreshold = context.getResources()
+ .getDimension(R.dimen.navigation_edge_action_progress_threshold);
+ if (mBackAnimation != null) {
+ mBackAnimation.setSwipeThresholds(mSwipeTriggerThreshold, mSwipeProgressThreshold);
+ }
+ setVisibility(GONE);
Executor backgroundExecutor = Dependency.get(Dependency.BACKGROUND_EXECUTOR);
boolean isPrimaryDisplay = mContext.getDisplayId() == DEFAULT_DISPLAY;
mRegionSamplingHelper = new RegionSamplingHelper(this,
@@ -730,7 +736,7 @@
mPreviousTouchTranslation = touchTranslation;
// Apply a haptic on drag slop passed
- if (!mDragSlopPassed && touchTranslation > mSwipeThreshold) {
+ if (!mDragSlopPassed && touchTranslation > mSwipeTriggerThreshold) {
mDragSlopPassed = true;
mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK);
mVibrationTime = SystemClock.uptimeMillis();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/AlphaControlledSignalTileView.java b/packages/SystemUI/src/com/android/systemui/qs/AlphaControlledSignalTileView.java
index 6a6f572..e473dd2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/AlphaControlledSignalTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/AlphaControlledSignalTileView.java
@@ -16,6 +16,7 @@
package com.android.systemui.qs;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
@@ -73,7 +74,7 @@
}
@Override
- protected void setDrawableTintList(ColorStateList tint) {
+ protected void setDrawableTintList(@Nullable ColorStateList tint) {
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
index 5df8b80..a262b8a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
@@ -24,7 +24,6 @@
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
-import android.widget.Toast
import androidx.annotation.VisibleForTesting
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.MetricsLogger
@@ -46,7 +45,6 @@
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener
-import com.android.systemui.tuner.TunerService
import com.android.systemui.util.DualHeightHorizontalLinearLayout
import com.android.systemui.util.ViewController
import com.android.systemui.util.settings.GlobalSettings
@@ -71,7 +69,6 @@
private val fgsManagerFooterController: QSFgsManagerFooter,
private val falsingManager: FalsingManager,
private val metricsLogger: MetricsLogger,
- private val tunerService: TunerService,
private val globalActionsDialog: GlobalActionsDialogLite,
private val uiEventLogger: UiEventLogger,
@Named(PM_LITE_ENABLED) private val showPMLiteButton: Boolean,
@@ -131,22 +128,7 @@
return@OnClickListener
}
metricsLogger.action(MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH)
- if (settingsButton.isTunerClick) {
- activityStarter.postQSRunnableDismissingKeyguard {
- if (isTunerEnabled()) {
- tunerService.showResetRequest {
- // Relaunch settings so that the tuner disappears.
- startSettingsActivity()
- }
- } else {
- Toast.makeText(context, R.string.tuner_toast, Toast.LENGTH_LONG).show()
- tunerService.isTunerEnabled = true
- }
- startSettingsActivity()
- }
- } else {
- startSettingsActivity()
- }
+ startSettingsActivity()
} else if (v === powerMenuLite) {
uiEventLogger.log(GlobalActionsDialogLite.GlobalActionsEvent.GA_OPEN_QS)
globalActionsDialog.showOrHideDialog(false, true, v)
@@ -228,7 +210,7 @@
}
private fun updateView() {
- mView.updateEverything(isTunerEnabled(), multiUserSwitchController.isMultiUserEnabled)
+ mView.updateEverything(multiUserSwitchController.isMultiUserEnabled)
}
override fun onViewDetached() {
@@ -254,7 +236,7 @@
}
fun disable(state2: Int) {
- mView.disable(state2, isTunerEnabled(), multiUserSwitchController.isMultiUserEnabled)
+ mView.disable(state2, multiUserSwitchController.isMultiUserEnabled)
}
fun setExpansion(headerExpansionFraction: Float) {
@@ -275,6 +257,4 @@
fun setKeyguardShowing(showing: Boolean) {
setExpansion(lastExpansion)
}
-
- private fun isTunerEnabled() = tunerService.isTunerEnabled
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsView.kt b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsView.kt
index 18e0cfa..9413a90 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsView.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsView.kt
@@ -17,7 +17,6 @@
import android.app.StatusBarManager
import android.content.Context
-import android.content.res.Configuration
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import android.graphics.drawable.RippleDrawable
@@ -42,7 +41,6 @@
private lateinit var settingsButton: SettingsButton
private lateinit var multiUserSwitch: MultiUserSwitch
private lateinit var multiUserAvatar: ImageView
- private lateinit var tunerIcon: View
private var qsDisabled = false
private var expansionAmount = 0f
@@ -53,50 +51,30 @@
settingsContainer = findViewById(R.id.settings_button_container)
multiUserSwitch = findViewById(R.id.multi_user_switch)
multiUserAvatar = multiUserSwitch.findViewById(R.id.multi_user_avatar)
- tunerIcon = requireViewById(R.id.tuner_icon)
// RenderThread is doing more harm than good when touching the header (to expand quick
// settings), so disable it for this view
if (settingsButton.background is RippleDrawable) {
(settingsButton.background as RippleDrawable).setForceSoftware(true)
}
- updateResources()
importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
}
- override fun onConfigurationChanged(newConfig: Configuration) {
- super.onConfigurationChanged(newConfig)
- updateResources()
- }
-
- override fun onRtlPropertiesChanged(layoutDirection: Int) {
- super.onRtlPropertiesChanged(layoutDirection)
- updateResources()
- }
-
- private fun updateResources() {
- val tunerIconTranslation = mContext.resources
- .getDimensionPixelOffset(R.dimen.qs_footer_tuner_icon_translation).toFloat()
- tunerIcon.translationX = if (isLayoutRtl) (-tunerIconTranslation) else tunerIconTranslation
- }
-
fun disable(
state2: Int,
- isTunerEnabled: Boolean,
multiUserEnabled: Boolean
) {
val disabled = state2 and StatusBarManager.DISABLE2_QUICK_SETTINGS != 0
if (disabled == qsDisabled) return
qsDisabled = disabled
- updateEverything(isTunerEnabled, multiUserEnabled)
+ updateEverything(multiUserEnabled)
}
fun updateEverything(
- isTunerEnabled: Boolean,
multiUserEnabled: Boolean
) {
post {
- updateVisibilities(isTunerEnabled, multiUserEnabled)
+ updateVisibilities(multiUserEnabled)
updateClickabilities()
isClickable = false
}
@@ -108,11 +86,9 @@
}
private fun updateVisibilities(
- isTunerEnabled: Boolean,
multiUserEnabled: Boolean
) {
settingsContainer.visibility = if (qsDisabled) GONE else VISIBLE
- tunerIcon.visibility = if (isTunerEnabled) VISIBLE else INVISIBLE
multiUserSwitch.visibility = if (multiUserEnabled) VISIBLE else GONE
val isDemo = UserManager.isDeviceInDemoMode(context)
settingsButton.visibility = if (isDemo) INVISIBLE else VISIBLE
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java b/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java
index 67cfc59..26399d8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java
@@ -27,6 +27,8 @@
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.annotation.Nullable;
+
import com.android.systemui.R;
import java.util.Objects;
@@ -48,6 +50,7 @@
private final TextView mSecondLine;
private final int mHorizontalPaddingPx;
+ @Nullable
private String mText;
public QSDualTileLabel(Context context) {
@@ -122,6 +125,7 @@
rescheduleUpdateText();
}
+ @Nullable
public String getText() {
return mText;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 17f85ee..3c7933f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -381,14 +381,17 @@
: View.INVISIBLE);
mHeader.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard)
|| (expanded && !mStackScrollerOverscrolling), mQuickQSPanelController);
- boolean footerVisible = !mQsDisabled && (expanded || !keyguardShowing || mHeaderAnimating
+ boolean qsPanelVisible = !mQsDisabled && expandVisually;
+ boolean footerVisible = qsPanelVisible && (expanded || !keyguardShowing || mHeaderAnimating
|| mShowCollapsedOnKeyguard);
mFooter.setVisibility(footerVisible ? View.VISIBLE : View.INVISIBLE);
mQSFooterActionController.setVisible(footerVisible);
mFooter.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard)
|| (expanded && !mStackScrollerOverscrolling));
- mQSPanelController.setVisibility(
- !mQsDisabled && expandVisually ? View.VISIBLE : View.INVISIBLE);
+ mQSPanelController.setVisibility(qsPanelVisible ? View.VISIBLE : View.INVISIBLE);
+ if (DEBUG) {
+ Log.d(TAG, "Footer: " + footerVisible + ", QS Panel: " + qsPanelVisible);
+ }
}
private boolean isKeyguardState() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 0c854df..5126fcb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -48,6 +48,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/** View that represents the quick settings tile panel (when expanded/pulled down). **/
public class QSPanel extends LinearLayout implements Tunable {
@@ -78,7 +79,7 @@
protected boolean mExpanded;
protected boolean mListening;
- protected QSTileHost mHost;
+ @Nullable protected QSTileHost mHost;
private final List<OnConfigurationChangedListener> mOnConfigurationChangedListeners =
new ArrayList<>();
@@ -92,14 +93,18 @@
@Nullable
private ViewGroup mHeaderContainer;
+ @Nullable
private PageIndicator mFooterPageIndicator;
private int mContentMarginStart;
private int mContentMarginEnd;
private boolean mUsingHorizontalLayout;
+ @Nullable
private LinearLayout mHorizontalLinearLayout;
+ @Nullable
protected LinearLayout mHorizontalContentContainer;
+ @Nullable
protected QSTileLayout mTileLayout;
private float mSquishinessFraction = 1f;
private final ArrayMap<View, Integer> mChildrenLayoutTop = new ArrayMap<>();
@@ -284,7 +289,7 @@
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (move) {
- int top = mChildrenLayoutTop.get(child);
+ int top = Objects.requireNonNull(mChildrenLayoutTop.get(child));
child.setLeftTopRightBottom(child.getLeft(), top + tileHeightOffset,
child.getRight(), top + tileHeightOffset + child.getHeight());
}
@@ -337,6 +342,7 @@
}
}
+ @Nullable
public QSTileHost getHost() {
return mHost;
}
@@ -501,7 +507,6 @@
mListening = listening;
}
-
protected void drawTile(QSPanelControllerBase.TileRecord r, QSTile.State state) {
r.tileView.onStateChanged(state);
}
@@ -548,6 +553,7 @@
return getMeasuredHeight();
}
+ @Nullable
QSTileLayout getTileLayout() {
return mTileLayout;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index 6a7f3c3..9834129 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -187,7 +187,9 @@
/** */
public void setListening(boolean listening, boolean expanded) {
- setListening(listening && expanded);
+ // TODO(218268829): checking for split shade is workaround but when proper fix lands
+ // "|| mShouldUseSplitNotificationShade" should be removed
+ setListening(listening && (expanded || mShouldUseSplitNotificationShade));
if (mView.isListening()) {
refreshAllTiles();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index 0bff722..3172aa9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -76,6 +76,7 @@
private Consumer<Boolean> mMediaVisibilityChangedListener;
private int mLastOrientation;
private String mCachedSpecs = "";
+ @Nullable
private QSTileRevealController mQsTileRevealController;
private float mRevealExpansion;
@@ -185,6 +186,7 @@
mDumpManager.unregisterDumpable(mView.getDumpableTag());
}
+ @Nullable
protected QSTileRevealController createTileRevealController() {
return null;
}
@@ -250,6 +252,7 @@
return !mRecords.isEmpty();
}
+ @Nullable
QSTileView getTileView(QSTile tile) {
for (QSPanelControllerBase.TileRecord r : mRecords) {
if (r.tile == tile) {
@@ -411,6 +414,7 @@
mUsingHorizontalLayoutChangedListener = listener;
}
+ @Nullable
public View getBrightnessView() {
return mView.getBrightnessView();
}
@@ -425,6 +429,7 @@
public QSTile tile;
public com.android.systemui.plugins.qs.QSTileView tileView;
public boolean scanState;
+ @Nullable
public QSTile.Callback callback;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java
index 4b705ad..6908e5a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java
@@ -20,6 +20,7 @@
import android.annotation.MainThread;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
@@ -81,6 +82,7 @@
private final CarrierConfigTracker mCarrierConfigTracker;
private boolean mIsSingleCarrier;
+ @Nullable
private OnSingleCarrierChangedListener mOnSingleCarrierChangedListener;
private final SlotIndexResolver mSlotIndexResolver;
@@ -294,7 +296,8 @@
* This will get notified when the number of carriers changes between 1 and "not one".
* @param listener
*/
- public void setOnSingleCarrierChangedListener(OnSingleCarrierChangedListener listener) {
+ public void setOnSingleCarrierChangedListener(
+ @Nullable OnSingleCarrierChangedListener listener) {
mOnSingleCarrierChangedListener = listener;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index 90cf92a..c1970b9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -96,15 +96,20 @@
private int mFocusIndex;
private boolean mNeedsFocus;
+ @Nullable
private List<String> mCurrentSpecs;
+ @Nullable
private List<TileInfo> mOtherTiles;
+ @Nullable
private List<TileInfo> mAllTiles;
+ @Nullable
private Holder mCurrentDrag;
private int mAccessibilityAction = ACTION_NONE;
private int mAccessibilityFromIndex;
private final UiEventLogger mUiEventLogger;
private final AccessibilityDelegateCompat mAccessibilityDelegate;
+ @Nullable
private RecyclerView mRecyclerView;
private int mNumColumns;
@@ -240,6 +245,7 @@
notifyDataSetChanged();
}
+ @Nullable
private TileInfo getAndRemoveOther(String s) {
for (int i = 0; i < mOtherTiles.size(); i++) {
if (mOtherTiles.get(i).spec.equals(s)) {
@@ -555,7 +561,7 @@
}
public class Holder extends ViewHolder {
- private QSTileViewImpl mTileView;
+ @Nullable private QSTileViewImpl mTileView;
public Holder(View itemView) {
super(itemView);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
index 106a1b6..7fb9ef3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
@@ -17,6 +17,7 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
@@ -49,6 +50,7 @@
private boolean mAnimationEnabled = true;
private int mState = -1;
private int mTint;
+ @Nullable
private QSTile.Icon mLastIcon;
public QSIconViewImpl(Context context) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index e8d27ec..e088f54 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -36,6 +36,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
@@ -191,10 +192,16 @@
mContext,
ROUTE_TYPE_REMOTE_DISPLAY,
v -> {
- mDialogLaunchAnimator.disableAllCurrentDialogsExitAnimations();
- holder.mDialog.dismiss();
+ ActivityLaunchAnimator.Controller controller =
+ mDialogLaunchAnimator.createActivityLaunchController(v);
+
+ if (controller == null) {
+ holder.mDialog.dismiss();
+ }
+
mActivityStarter
- .postStartActivityDismissingKeyguard(getLongClickIntent(), 0);
+ .postStartActivityDismissingKeyguard(getLongClickIntent(), 0,
+ controller);
});
holder.init(dialog);
SystemUIDialog.setShowForAllUsers(dialog, true);
@@ -316,5 +323,5 @@
public void onKeyguardShowingChanged() {
refreshState();
}
- };
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java
index 4fe155c..e1d2070 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java
@@ -164,7 +164,7 @@
if (connectedState != WifiEntry.CONNECTED_STATE_DISCONNECTED) {
mWifiListLayout.setOnClickListener(
v -> mInternetDialogController.launchWifiNetworkDetailsSetting(
- wifiEntry.getKey()));
+ wifiEntry.getKey(), v));
return;
}
mWifiListLayout.setOnClickListener(v -> {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
index 8b6ddb4..d1c7844 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
@@ -355,8 +355,8 @@
isChecked, false);
}
});
- mConnectedWifListLayout.setOnClickListener(v -> onClickConnectedWifi());
- mSeeAllLayout.setOnClickListener(v -> onClickSeeMoreButton());
+ mConnectedWifListLayout.setOnClickListener(this::onClickConnectedWifi);
+ mSeeAllLayout.setOnClickListener(this::onClickSeeMoreButton);
mWiFiToggle.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (mWifiManager == null) return;
@@ -519,7 +519,7 @@
if (TextUtils.isEmpty(mWifiScanNotifyText.getText())) {
final AnnotationLinkSpan.LinkInfo linkInfo = new AnnotationLinkSpan.LinkInfo(
AnnotationLinkSpan.LinkInfo.DEFAULT_ANNOTATION,
- v -> mInternetDialogController.launchWifiScanningSetting());
+ mInternetDialogController::launchWifiScanningSetting);
mWifiScanNotifyText.setText(AnnotationLinkSpan.linkify(
getContext().getText(R.string.wifi_scan_notify_message), linkInfo));
mWifiScanNotifyText.setMovementMethod(LinkMovementMethod.getInstance());
@@ -527,15 +527,16 @@
mWifiScanNotifyLayout.setVisibility(View.VISIBLE);
}
- void onClickConnectedWifi() {
+ void onClickConnectedWifi(View view) {
if (mConnectedWifiEntry == null) {
return;
}
- mInternetDialogController.launchWifiNetworkDetailsSetting(mConnectedWifiEntry.getKey());
+ mInternetDialogController.launchWifiNetworkDetailsSetting(mConnectedWifiEntry.getKey(),
+ view);
}
- void onClickSeeMoreButton() {
- mInternetDialogController.launchNetworkSetting();
+ void onClickSeeMoreButton(View view) {
+ mInternetDialogController.launchNetworkSetting(view);
}
CharSequence getDialogTitleText() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
index f89b7a3..b3bc3be 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
@@ -72,6 +72,7 @@
import com.android.settingslib.net.SignalStrengthUtil;
import com.android.settingslib.wifi.WifiUtils;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Background;
@@ -620,36 +621,32 @@
return summary;
}
- void launchNetworkSetting() {
- // Dismissing a dialog into its touch surface and starting an activity at the same time
- // looks bad, so let's make sure the dialog just fades out quickly.
- mDialogLaunchAnimator.disableAllCurrentDialogsExitAnimations();
- mCallback.dismissDialog();
+ private void startActivity(Intent intent, View view) {
+ ActivityLaunchAnimator.Controller controller =
+ mDialogLaunchAnimator.createActivityLaunchController(view);
- mActivityStarter.postStartActivityDismissingKeyguard(getSettingsIntent(), 0);
+ if (controller == null) {
+ mCallback.dismissDialog();
+ }
+
+ mActivityStarter.postStartActivityDismissingKeyguard(intent, 0, controller);
}
- void launchWifiNetworkDetailsSetting(String key) {
+ void launchNetworkSetting(View view) {
+ startActivity(getSettingsIntent(), view);
+ }
+
+ void launchWifiNetworkDetailsSetting(String key, View view) {
Intent intent = getWifiDetailsSettingsIntent(key);
if (intent != null) {
- // Dismissing a dialog into its touch surface and starting an activity at the same time
- // looks bad, so let's make sure the dialog just fades out quickly.
- mDialogLaunchAnimator.disableAllCurrentDialogsExitAnimations();
- mCallback.dismissDialog();
-
- mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
+ startActivity(intent, view);
}
}
- void launchWifiScanningSetting() {
- // Dismissing a dialog into its touch surface and starting an activity at the same time
- // looks bad, so let's make sure the dialog just fades out quickly.
- mDialogLaunchAnimator.disableAllCurrentDialogsExitAnimations();
- mCallback.dismissDialog();
-
+ void launchWifiScanningSetting(View view) {
final Intent intent = new Intent(ACTION_WIFI_SCANNING_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
+ startActivity(intent, view);
}
void connectCarrierNetwork() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt b/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt
index 8c8c5c8..88aa734 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt
@@ -19,6 +19,7 @@
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
+import android.content.DialogInterface.BUTTON_NEUTRAL
import android.content.Intent
import android.provider.Settings
import android.view.LayoutInflater
@@ -84,16 +85,20 @@
setPositiveButton(R.string.quick_settings_done) { _, _ ->
uiEventLogger.log(QSUserSwitcherEvent.QS_USER_DETAIL_CLOSE)
}
- setNeutralButton(R.string.quick_settings_more_user_settings) { _, _ ->
+ setNeutralButton(R.string.quick_settings_more_user_settings, { _, _ ->
if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
- dialogLaunchAnimator.disableAllCurrentDialogsExitAnimations()
uiEventLogger.log(QSUserSwitcherEvent.QS_USER_MORE_SETTINGS)
+ val controller = dialogLaunchAnimator.createActivityLaunchController(
+ getButton(BUTTON_NEUTRAL))
+
+ if (controller == null) {
+ dismiss()
+ }
+
activityStarter.postStartActivityDismissingKeyguard(
- USER_SETTINGS_INTENT,
- 0
- )
+ USER_SETTINGS_INTENT, 0, controller)
}
- }
+ }, false /* dismissOnClick */)
val gridFrame = LayoutInflater.from(this.context)
.inflate(R.layout.qs_user_dialog_content, null)
setView(gridFrame)
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index f982790..4a9a1f1 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -263,22 +263,29 @@
inoutInfo.touchableRegion.set(getTouchRegion(true));
}
- private Region getTouchRegion(boolean includeScrim) {
- Region touchRegion = new Region();
+ private Region getSwipeRegion() {
+ Region swipeRegion = new Region();
final Rect tmpRect = new Rect();
mScreenshotPreview.getBoundsOnScreen(tmpRect);
tmpRect.inset((int) FloatingWindowUtil.dpToPx(mDisplayMetrics, -SWIPE_PADDING_DP),
(int) FloatingWindowUtil.dpToPx(mDisplayMetrics, -SWIPE_PADDING_DP));
- touchRegion.op(tmpRect, Region.Op.UNION);
+ swipeRegion.op(tmpRect, Region.Op.UNION);
mActionsContainerBackground.getBoundsOnScreen(tmpRect);
tmpRect.inset((int) FloatingWindowUtil.dpToPx(mDisplayMetrics, -SWIPE_PADDING_DP),
(int) FloatingWindowUtil.dpToPx(mDisplayMetrics, -SWIPE_PADDING_DP));
- touchRegion.op(tmpRect, Region.Op.UNION);
+ swipeRegion.op(tmpRect, Region.Op.UNION);
mDismissButton.getBoundsOnScreen(tmpRect);
- touchRegion.op(tmpRect, Region.Op.UNION);
+ swipeRegion.op(tmpRect, Region.Op.UNION);
+
+ return swipeRegion;
+ }
+
+ private Region getTouchRegion(boolean includeScrim) {
+ Region touchRegion = getSwipeRegion();
if (includeScrim && mScrollingScrim.getVisibility() == View.VISIBLE) {
+ final Rect tmpRect = new Rect();
mScrollingScrim.getBoundsOnScreen(tmpRect);
touchRegion.op(tmpRect, Region.Op.UNION);
}
@@ -328,7 +335,7 @@
@Override // ViewGroup
public boolean onInterceptTouchEvent(MotionEvent ev) {
// scrolling scrim should not be swipeable; return early if we're on the scrim
- if (!getTouchRegion(false).contains((int) ev.getRawX(), (int) ev.getRawY())) {
+ if (!getSwipeRegion().contains((int) ev.getRawX(), (int) ev.getRawY())) {
return false;
}
// always pass through the down event so the swipe handler knows the initial state
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index b355b05..645c5ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -43,6 +43,7 @@
import android.hardware.display.DisplayManager;
import android.hardware.fingerprint.IUdfpsHbmListener;
import android.inputmethodservice.InputMethodService.BackDispositionMode;
+import android.media.INearbyMediaDevicesProvider;
import android.media.MediaRoute2Info;
import android.os.Bundle;
import android.os.Handler;
@@ -160,6 +161,8 @@
private static final int MSG_SET_BIOMETRICS_LISTENER = 63 << MSG_SHIFT;
private static final int MSG_MEDIA_TRANSFER_SENDER_STATE = 64 << MSG_SHIFT;
private static final int MSG_MEDIA_TRANSFER_RECEIVER_STATE = 65 << MSG_SHIFT;
+ private static final int MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 66 << MSG_SHIFT;
+ private static final int MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 67 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -456,6 +459,18 @@
@NonNull MediaRoute2Info routeInfo,
@Nullable Icon appIcon,
@Nullable CharSequence appName) {}
+
+ /**
+ * @see IStatusBar#registerNearbyMediaDevicesProvider
+ */
+ default void registerNearbyMediaDevicesProvider(
+ @NonNull INearbyMediaDevicesProvider provider) {}
+
+ /**
+ * @see IStatusBar#unregisterNearbyMediaDevicesProvider
+ */
+ default void unregisterNearbyMediaDevicesProvider(
+ @NonNull INearbyMediaDevicesProvider provider) {}
}
public CommandQueue(Context context) {
@@ -1221,6 +1236,18 @@
mHandler.obtainMessage(MSG_MEDIA_TRANSFER_RECEIVER_STATE, args).sendToTarget();
}
+ @Override
+ public void registerNearbyMediaDevicesProvider(@NonNull INearbyMediaDevicesProvider provider) {
+ mHandler.obtainMessage(MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER, provider).sendToTarget();
+ }
+
+ @Override
+ public void unregisterNearbyMediaDevicesProvider(
+ @NonNull INearbyMediaDevicesProvider provider) {
+ mHandler.obtainMessage(MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER, provider)
+ .sendToTarget();
+ }
+
private final class H extends Handler {
private H(Looper l) {
super(l);
@@ -1643,6 +1670,18 @@
}
args.recycle();
break;
+ case MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER:
+ INearbyMediaDevicesProvider provider = (INearbyMediaDevicesProvider) msg.obj;
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ mCallbacks.get(i).registerNearbyMediaDevicesProvider(provider);
+ }
+ break;
+ case MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER:
+ provider = (INearbyMediaDevicesProvider) msg.obj;
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ mCallbacks.get(i).unregisterNearbyMediaDevicesProvider(provider);
+ }
+ break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
index b312ce2..8366bdd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
@@ -67,7 +67,7 @@
wakefulnessLifecycle: WakefulnessLifecycle,
configurationController: ConfigurationController,
falsingManager: FalsingManager,
- dumpManager: DumpManager,
+ dumpManager: DumpManager
) : Dumpable {
private var pulseHeight: Float = 0f
private var useSplitShade: Boolean = false
@@ -363,6 +363,7 @@
notificationPanelController.setKeyguardOnlyContentAlpha(1.0f - scrimProgress)
depthController.transitionToFullShadeProgress = scrimProgress
udfpsKeyguardViewController?.setTransitionToFullShadeProgress(scrimProgress)
+ statusbar.setTransitionToFullShadeProgress(scrimProgress)
}
private fun setDragDownAmountAnimated(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 72c4ce8..0fb6ea6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -427,15 +427,17 @@
typedValue, true);
float scaleFactor = typedValue.getFloat();
- // We downscale the loaded drawable to reasonable size to protect against applications
- // using too much memory. The size can be tweaked in config.xml. Drawables
- // that are already sized properly won't be touched.
- boolean isLowRamDevice = ActivityManager.isLowRamDeviceStatic();
- Resources res = sysuiContext.getResources();
- int maxIconSize = res.getDimensionPixelSize(isLowRamDevice
- ? com.android.internal.R.dimen.notification_small_icon_size_low_ram
- : com.android.internal.R.dimen.notification_small_icon_size);
- icon = DrawableSize.downscaleToSize(res, icon, maxIconSize, maxIconSize);
+ if (icon != null) {
+ // We downscale the loaded drawable to reasonable size to protect against applications
+ // using too much memory. The size can be tweaked in config.xml. Drawables that are
+ // already sized properly won't be touched.
+ boolean isLowRamDevice = ActivityManager.isLowRamDeviceStatic();
+ Resources res = sysuiContext.getResources();
+ int maxIconSize = res.getDimensionPixelSize(isLowRamDevice
+ ? com.android.internal.R.dimen.notification_small_icon_size_low_ram
+ : com.android.internal.R.dimen.notification_small_icon_size);
+ icon = DrawableSize.downscaleToSize(res, icon, maxIconSize, maxIconSize);
+ }
// No need to scale the icon, so return it as is.
if (scaleFactor == 1.f) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index 7811401..02870a3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -32,6 +32,7 @@
import android.text.format.DateFormat;
import android.util.FloatProperty;
import android.util.Log;
+import android.view.Choreographer;
import android.view.InsetsFlags;
import android.view.InsetsVisibilities;
import android.view.View;
@@ -44,6 +45,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.jank.InteractionJankMonitor;
+import com.android.internal.jank.InteractionJankMonitor.Configuration;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.DejankUtils;
import com.android.systemui.Dumpable;
@@ -352,8 +354,17 @@
}
private void beginInteractionJankMonitor() {
+ final boolean shouldPost =
+ (mIsDozing && mDozeAmount == 0) || (!mIsDozing && mDozeAmount == 1);
if (mInteractionJankMonitor != null && mView != null && mView.isAttachedToWindow()) {
- mInteractionJankMonitor.begin(mView, getCujType());
+ if (shouldPost) {
+ Choreographer.getInstance().postCallback(
+ Choreographer.CALLBACK_ANIMATION, this::beginInteractionJankMonitor, null);
+ } else {
+ Configuration.Builder builder = Configuration.Builder.withView(getCujType(), mView)
+ .setDeferMonitorForAnimationStart(false);
+ mInteractionJankMonitor.begin(builder);
+ }
}
}
@@ -507,6 +518,10 @@
pw.println(" mLeaveOpenOnKeyguardHide=" + mLeaveOpenOnKeyguardHide);
pw.println(" mKeyguardRequested=" + mKeyguardRequested);
pw.println(" mIsDozing=" + mIsDozing);
+ pw.println(" mListeners{" + mListeners.size() + "}=");
+ for (RankedListener rl : mListeners) {
+ pw.println(" " + rl.mListener);
+ }
pw.println(" Historical states:");
// Ignore records without a timestamp
int size = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt
index d01fc93..10e90fe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt
@@ -55,7 +55,6 @@
rippleShader.progress = 0f
rippleShader.sparkleStrength = RIPPLE_SPARKLE_STRENGTH
ripplePaint.shader = rippleShader
- visibility = View.GONE
}
override fun onConfigurationChanged(newConfig: Configuration?) {
@@ -86,12 +85,10 @@
animator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
rippleInProgress = false
- visibility = View.GONE
onAnimationEnd?.run()
}
})
animator.start()
- visibility = View.VISIBLE
rippleInProgress = true
}
@@ -100,6 +97,11 @@
}
override fun onDraw(canvas: Canvas?) {
+ if (canvas == null || !canvas.isHardwareAccelerated) {
+ // Drawing with the ripple shader requires hardware acceleration, so skip
+ // if it's unsupported.
+ return
+ }
// To reduce overdraw, we mask the effect to a circle whose radius is big enough to cover
// the active effect area. Values here should be kept in sync with the
// animation implementation in the ripple shader.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
index 842be5b..48717e2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
@@ -28,15 +28,15 @@
import com.android.internal.logging.UiEvent
import com.android.internal.logging.UiEventLogger
import com.android.settingslib.Utils
+import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
import com.android.systemui.statusbar.commandline.Command
import com.android.systemui.statusbar.commandline.CommandRegistry
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.leak.RotationUtils
-import com.android.systemui.R
-import com.android.systemui.flags.Flags
import com.android.systemui.util.time.SystemClock
import java.io.PrintWriter
import javax.inject.Inject
@@ -53,8 +53,8 @@
@SysUISingleton
class WiredChargingRippleController @Inject constructor(
commandRegistry: CommandRegistry,
- batteryController: BatteryController,
- configurationController: ConfigurationController,
+ private val batteryController: BatteryController,
+ private val configurationController: ConfigurationController,
featureFlags: FeatureFlags,
private val context: Context,
private val windowManager: WindowManager,
@@ -88,6 +88,11 @@
init {
pluggedIn = batteryController.isPluggedIn
+ commandRegistry.registerCommand("charging-ripple") { ChargingRippleCommand() }
+ updateRippleColor()
+ }
+
+ fun registerCallbacks() {
val batteryStateChangeCallback = object : BatteryController.BatteryStateChangeCallback {
override fun onBatteryLevelChanged(
level: Int,
@@ -123,9 +128,6 @@
}
}
configurationController.addCallback(configurationChangedListener)
-
- commandRegistry.registerCommand("charging-ripple") { ChargingRippleCommand() }
- updateRippleColor()
}
// Lazily debounce ripple to avoid triggering ripple constantly (e.g. from flaky chargers).
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java
index 5361a671..2b924a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java
@@ -34,6 +34,7 @@
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.wifi.WifiStatusTracker;
import com.android.systemui.R;
+import com.android.systemui.util.Assert;
import java.io.PrintWriter;
@@ -190,6 +191,7 @@
}
private void handleStatusUpdated() {
+ Assert.isMainThread();
copyWifiStates();
notifyListenersIfNecessary();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
index 60d1317..82b56cd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
@@ -234,7 +234,7 @@
ApplicationInfo appInfo =
pm.getApplicationInfo(
pkg, PackageManager.MATCH_UNINSTALLED_PACKAGES, info.userId);
- if (appInfo.isInstantApp()) {
+ if (appInfo != null && appInfo.isInstantApp()) {
postInstantAppNotif(
pkg,
info.userId,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt
index 6f8e5da..4ebf337 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt
@@ -21,8 +21,9 @@
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.util.ListenerSet
import com.android.systemui.util.concurrency.DelayableExecutor
+import dagger.Binds
import dagger.Module
-import dagger.Provides
+import javax.inject.Inject
/**
* Choreographs evaluation resulting from multiple asynchronous sources. Specifically, it exposes
@@ -46,22 +47,21 @@
fun removeOnEvalListener(onEvalListener: Runnable)
}
+@Module(includes = [PrivateModule::class])
+object NotifPipelineChoreographerModule
+
@Module
-object NotifPipelineChoreographerModule {
- @Provides
- @JvmStatic
- @SysUISingleton
- fun provideChoreographer(
- choreographer: Choreographer,
- @Main mainExecutor: DelayableExecutor
- ): NotifPipelineChoreographer = NotifPipelineChoreographerImpl(choreographer, mainExecutor)
+private interface PrivateModule {
+ @Binds
+ fun bindChoreographer(impl: NotifPipelineChoreographerImpl): NotifPipelineChoreographer
}
private const val TIMEOUT_MS: Long = 100
-private class NotifPipelineChoreographerImpl(
+@SysUISingleton
+private class NotifPipelineChoreographerImpl @Inject constructor(
private val viewChoreographer: Choreographer,
- private val executor: DelayableExecutor
+ @Main private val executor: DelayableExecutor
) : NotifPipelineChoreographer {
private val listeners = ListenerSet<Runnable>()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
index 9c82cb6..72d0918 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
@@ -30,29 +30,24 @@
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator
import com.android.systemui.statusbar.policy.KeyguardStateController
+import dagger.Binds
import dagger.Module
-import dagger.Provides
+import javax.inject.Inject
+
+@Module(includes = [PrivateModule::class])
+interface SensitiveContentCoordinatorModule
@Module
-object SensitiveContentCoordinatorModule {
- @Provides
- @JvmStatic
- @CoordinatorScope
- fun provideCoordinator(
- dynamicPrivacyController: DynamicPrivacyController,
- lockscreenUserManager: NotificationLockscreenUserManager,
- keyguardUpdateMonitor: KeyguardUpdateMonitor,
- statusBarStateController: StatusBarStateController,
- keyguardStateController: KeyguardStateController
- ): SensitiveContentCoordinator =
- SensitiveContentCoordinatorImpl(dynamicPrivacyController, lockscreenUserManager,
- keyguardUpdateMonitor, statusBarStateController, keyguardStateController)
+private interface PrivateModule {
+ @Binds
+ fun bindCoordinator(impl: SensitiveContentCoordinatorImpl): SensitiveContentCoordinator
}
/** Coordinates re-inflation and post-processing of sensitive notification content. */
interface SensitiveContentCoordinator : Coordinator
-private class SensitiveContentCoordinatorImpl(
+@CoordinatorScope
+private class SensitiveContentCoordinatorImpl @Inject constructor(
private val dynamicPrivacyController: DynamicPrivacyController,
private val lockscreenUserManager: NotificationLockscreenUserManager,
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index d610b37..b141110 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -309,7 +309,12 @@
* delayed for a few seconds. This might be useful to play animations without reducing FPS.
*/
public boolean shouldDelayDisplayDozeTransition() {
- return mScreenOffAnimationController.shouldDelayDisplayDozeTransition();
+ return willAnimateFromLockScreenToAod()
+ || mScreenOffAnimationController.shouldDelayDisplayDozeTransition();
+ }
+
+ private boolean willAnimateFromLockScreenToAod() {
+ return getAlwaysOn() && mKeyguardShowing;
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
index b35e684..6d774838 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
@@ -214,6 +214,7 @@
}
mStatusBarStateController.setIsDozing(dozing);
+ mNotificationShadeWindowViewController.setDozing(dozing);
}
@Override
@@ -294,6 +295,7 @@
public void dozeTimeTick() {
mNotificationPanel.dozeTimeTick();
mAuthController.dozeTimeTick();
+ mNotificationShadeWindowViewController.dozeTimeTick();
if (mAmbientIndicationContainer instanceof DozeReceiver) {
((DozeReceiver) mAmbientIndicationContainer).dozeTimeTick();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index d93c013..a0f8d05 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -135,9 +135,6 @@
import com.android.systemui.flags.Flags;
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
import com.android.systemui.fragments.FragmentService;
-import com.android.systemui.idle.IdleHostView;
-import com.android.systemui.idle.IdleHostViewController;
-import com.android.systemui.idle.dagger.IdleViewComponent;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.media.KeyguardMediaController;
import com.android.systemui.media.MediaDataManager;
@@ -322,7 +319,6 @@
private final KeyguardQsUserSwitchComponent.Factory mKeyguardQsUserSwitchComponentFactory;
private final KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory;
private final KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory;
- private final IdleViewComponent.Factory mIdleViewComponentFactory;
private final FragmentService mFragmentService;
private final ScrimController mScrimController;
private final PrivacyDotViewController mPrivacyDotViewController;
@@ -356,8 +352,6 @@
@Nullable
private CommunalHostViewController mCommunalViewController;
private KeyguardStatusViewController mKeyguardStatusViewController;
- @Nullable
- private IdleHostViewController mIdleHostViewController;
private LockIconViewController mLockIconViewController;
private NotificationsQuickSettingsContainer mNotificationContainerParent;
private NotificationsQSContainerController mNotificationsQSContainerController;
@@ -369,7 +363,6 @@
private VelocityTracker mQsVelocityTracker;
private boolean mQsTracking;
- private IdleHostView mIdleHostView;
private CommunalHostView mCommunalView;
/**
@@ -768,7 +761,6 @@
KeyguardUserSwitcherComponent.Factory keyguardUserSwitcherComponentFactory,
KeyguardStatusBarViewComponent.Factory keyguardStatusBarViewComponentFactory,
CommunalViewComponent.Factory communalViewComponentFactory,
- IdleViewComponent.Factory idleViewComponentFactory,
LockscreenShadeTransitionController lockscreenShadeTransitionController,
NotificationGroupManagerLegacy groupManager,
NotificationIconAreaController notificationIconAreaController,
@@ -839,7 +831,6 @@
mCommunalViewComponentFactory = communalViewComponentFactory;
mKeyguardStatusViewComponentFactory = keyguardStatusViewComponentFactory;
mKeyguardStatusBarViewComponentFactory = keyguardStatusBarViewComponentFactory;
- mIdleViewComponentFactory = idleViewComponentFactory;
mDepthController = notificationShadeDepthController;
mContentResolver = contentResolver;
mKeyguardQsUserSwitchComponentFactory = keyguardQsUserSwitchComponentFactory;
@@ -966,7 +957,6 @@
private void onFinishInflate() {
loadDimens();
mKeyguardStatusBar = mView.findViewById(R.id.keyguard_header);
- mIdleHostView = mView.findViewById(R.id.idle_host_view);
mCommunalView = mView.findViewById(R.id.communal_host);
FrameLayout userAvatarContainer = null;
@@ -989,12 +979,6 @@
.getKeyguardStatusBarViewController();
mKeyguardStatusBarViewController.init();
- if (mIdleHostView != null) {
- IdleViewComponent idleViewComponent = mIdleViewComponentFactory.build(mIdleHostView);
- mIdleHostViewController = idleViewComponent.getIdleHostViewController();
- mIdleHostViewController.init();
- }
-
if (mCommunalView != null) {
CommunalViewComponent communalViewComponent =
mCommunalViewComponentFactory.build(mCommunalView);
@@ -1008,7 +992,6 @@
mView.findViewById(R.id.keyguard_status_view),
userAvatarContainer,
keyguardUserSwitcherView,
- mIdleHostView,
mCommunalView);
NotificationStackScrollLayout stackScrollLayout = mView.findViewById(
@@ -1101,7 +1084,6 @@
private void updateViewControllers(KeyguardStatusView keyguardStatusView,
FrameLayout userAvatarView,
KeyguardUserSwitcherView keyguardUserSwitcherView,
- IdleHostView idleHostView,
CommunalHostView communalView) {
// Re-associate the KeyguardStatusViewController
KeyguardStatusViewComponent statusViewComponent =
@@ -1109,13 +1091,6 @@
mKeyguardStatusViewController = statusViewComponent.getKeyguardStatusViewController();
mKeyguardStatusViewController.init();
- if (idleHostView != null && idleHostView != mIdleHostView) {
- mIdleHostView = idleHostView;
- IdleViewComponent idleViewComponent = mIdleViewComponentFactory.build(idleHostView);
- mIdleHostViewController = idleViewComponent.getIdleHostViewController();
- mIdleHostViewController.init();
- }
-
if (mKeyguardUserSwitcherController != null) {
// Try to close the switcher so that callbacks are triggered if necessary.
// Otherwise, NPV can get into a state where some of the views are still hidden
@@ -1287,7 +1262,7 @@
showKeyguardUserSwitcher /* enabled */);
updateViewControllers(mView.findViewById(R.id.keyguard_status_view), userAvatarView,
- keyguardUserSwitcherView, mView.findViewById(R.id.idle_host_view), mCommunalView);
+ keyguardUserSwitcherView, mCommunalView);
// Update keyguard bottom area
int index = mView.indexOfChild(mKeyguardBottomArea);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
index 4e2eb6a..396703b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
@@ -36,6 +36,7 @@
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dock.DockManager;
+import com.android.systemui.lowlightclock.LowLightClockController;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.NotificationShadeDepthController;
@@ -49,6 +50,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.Optional;
import javax.inject.Inject;
@@ -84,6 +86,7 @@
private final DockManager mDockManager;
private final NotificationPanelViewController mNotificationPanelViewController;
private final PanelExpansionStateManager mPanelExpansionStateManager;
+ private final Optional<LowLightClockController> mLowLightClockController;
private boolean mIsTrackingBarGesture = false;
@@ -101,7 +104,8 @@
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
StatusBarWindowStateController statusBarWindowStateController,
- LockIconViewController lockIconViewController) {
+ LockIconViewController lockIconViewController,
+ Optional<LowLightClockController> lowLightClockController) {
mLockscreenShadeTransitionController = transitionController;
mFalsingCollector = falsingCollector;
mTunerService = tunerService;
@@ -115,6 +119,7 @@
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mStatusBarWindowStateController = statusBarWindowStateController;
mLockIconViewController = lockIconViewController;
+ mLowLightClockController = lowLightClockController;
// This view is not part of the newly inflated expanded status bar.
mBrightnessMirror = mView.findViewById(R.id.brightness_mirror_container);
@@ -171,6 +176,8 @@
};
mGestureDetector = new GestureDetector(mView.getContext(), gestureListener);
+ mLowLightClockController.ifPresent(controller -> controller.attachLowLightClockView(mView));
+
mView.setInteractionEventHandler(new NotificationShadeWindowView.InteractionEventHandler() {
@Override
public Boolean handleDispatchTouchEvent(MotionEvent ev) {
@@ -450,6 +457,21 @@
mNotificationShadeWindowController = controller;
}
+ /**
+ * Tell the controller that dozing has begun or ended.
+ * @param dozing True if dozing has begun.
+ */
+ public void setDozing(boolean dozing) {
+ mLowLightClockController.ifPresent(controller -> controller.showLowLightClock(dozing));
+ }
+
+ /**
+ * Tell the controller to perform burn-in prevention.
+ */
+ public void dozeTimeTick() {
+ mLowLightClockController.ifPresent(LowLightClockController::dozeTimeTick);
+ }
+
@VisibleForTesting
void setDragDownHelper(DragDownHelper dragDownHelper) {
mDragDownHelper = dragDownHelper;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index f13334e..82e0e67 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -203,6 +203,7 @@
import com.android.systemui.statusbar.PulseExpansionHandler;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.charging.WiredChargingRippleController;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.core.StatusBarInitializer;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
@@ -343,6 +344,7 @@
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
private final DreamOverlayStateController mDreamOverlayStateController;
private StatusBarCommandQueueCallbacks mCommandQueueCallbacks;
+ private float mTransitionToFullShadeProgress = 0f;
void onStatusBarWindowStateChanged(@WindowVisibleState int state) {
updateBubblesVisibility();
@@ -786,7 +788,8 @@
NotifPipelineFlags notifPipelineFlags,
InteractionJankMonitor jankMonitor,
DeviceStateManager deviceStateManager,
- DreamOverlayStateController dreamOverlayStateController) {
+ DreamOverlayStateController dreamOverlayStateController,
+ WiredChargingRippleController wiredChargingRippleController) {
super(context);
mNotificationsController = notificationsController;
mFragmentService = fragmentService;
@@ -912,6 +915,7 @@
deviceStateManager.registerCallback(mMainExecutor,
new FoldStateListener(mContext, this::onFoldedStateChanged));
+ wiredChargingRippleController.registerCallbacks();
}
@Override
@@ -2580,9 +2584,9 @@
return controllerFromStatusBar.get();
}
- if (dismissShade && rootView == mNotificationShadeWindowView) {
- // We are animating a view in the shade. We have to make sure that we collapse it when
- // the animation ends or is cancelled.
+ if (dismissShade) {
+ // If the view is not in the status bar, then we are animating a view in the shade.
+ // We have to make sure that we collapse it when the animation ends or is cancelled.
return new StatusBarLaunchAnimatorController(animationController, this,
true /* isLaunchForActivity */);
}
@@ -3774,6 +3778,15 @@
updateScrimController();
}
+ /**
+ * Set the amount of progress we are currently in if we're transitioning to the full shade.
+ * 0.0f means we're not transitioning yet, while 1 means we're all the way in the full
+ * shade.
+ */
+ public void setTransitionToFullShadeProgress(float transitionToFullShadeProgress) {
+ mTransitionToFullShadeProgress = transitionToFullShadeProgress;
+ }
+
@VisibleForTesting
public void updateScrimController() {
Trace.beginSection("StatusBar#updateScrimController");
@@ -3792,7 +3805,8 @@
mScrimController.setLaunchingAffordanceWithPreview(launchingAffordanceWithPreview);
if (mStatusBarKeyguardViewManager.isShowingAlternateAuth()) {
- if (mState == StatusBarState.SHADE || mState == StatusBarState.SHADE_LOCKED) {
+ if (mState == StatusBarState.SHADE || mState == StatusBarState.SHADE_LOCKED
+ || mTransitionToFullShadeProgress > 0f) {
mScrimController.transitionTo(ScrimState.AUTH_SCRIMMED_SHADE);
} else {
mScrimController.transitionTo(ScrimState.AUTH_SCRIMMED);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index d42a423..11d9c31 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -68,10 +68,13 @@
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.unfold.FoldAodAnimationController;
+import com.android.systemui.unfold.SysUIUnfoldComponent;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Objects;
+import java.util.Optional;
import javax.inject.Inject;
@@ -87,7 +90,7 @@
public class StatusBarKeyguardViewManager implements RemoteInputController.Callback,
StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener,
PanelExpansionListener, NavigationModeController.ModeChangedListener,
- KeyguardViewController {
+ KeyguardViewController, FoldAodAnimationController.FoldAodAnimationStatus {
// When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3;
@@ -113,6 +116,8 @@
private final KeyguardBouncer.Factory mKeyguardBouncerFactory;
private final KeyguardMessageAreaController.Factory mKeyguardMessageAreaFactory;
private final DreamOverlayStateController mDreamOverlayStateController;
+ @Nullable
+ private final FoldAodAnimationController mFoldAodAnimationController;
private KeyguardMessageAreaController mKeyguardMessageAreaController;
private final Lazy<ShadeController> mShadeController;
private final BouncerExpansionCallback mExpansionCallback = new BouncerExpansionCallback() {
@@ -186,6 +191,7 @@
private boolean mPulsing;
private boolean mGesturalNav;
private boolean mIsDocked;
+ private boolean mScreenOffAnimationPlaying;
protected boolean mFirstUpdate = true;
protected boolean mLastShowing;
@@ -199,6 +205,7 @@
private boolean mLastIsDocked;
private boolean mLastPulsing;
private int mLastBiometricMode;
+ private boolean mLastScreenOffAnimationPlaying;
private boolean mQsExpanded;
private OnDismissAction mAfterKeyguardGoneAction;
@@ -246,6 +253,7 @@
NotificationMediaManager notificationMediaManager,
KeyguardBouncer.Factory keyguardBouncerFactory,
KeyguardMessageAreaController.Factory keyguardMessageAreaFactory,
+ Optional<SysUIUnfoldComponent> sysUIUnfoldComponent,
Lazy<ShadeController> shadeController,
LatencyTracker latencyTracker) {
mContext = context;
@@ -264,6 +272,8 @@
mKeyguardMessageAreaFactory = keyguardMessageAreaFactory;
mShadeController = shadeController;
mLatencyTracker = latencyTracker;
+ mFoldAodAnimationController = sysUIUnfoldComponent
+ .map(SysUIUnfoldComponent::getFoldAodAnimationController).orElse(null);
}
@Override
@@ -317,6 +327,9 @@
mConfigurationController.addCallback(this);
mGesturalNav = QuickStepContract.isGesturalMode(
mNavigationModeController.addListener(this));
+ if (mFoldAodAnimationController != null) {
+ mFoldAodAnimationController.addCallback(this);
+ }
if (mDockManager != null) {
mDockManager.addListener(mDockEventListener);
mIsDocked = mDockManager.isDocked();
@@ -965,6 +978,10 @@
private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
@Override
public void run() {
+ NavigationBarView view = mStatusBar.getNavigationBarView();
+ if (view != null) {
+ view.setVisibility(View.VISIBLE);
+ }
mStatusBar.getNotificationShadeWindowView().getWindowInsetsController()
.show(navigationBars());
}
@@ -1019,6 +1036,7 @@
mLastRemoteInputActive = remoteInputActive;
mLastDozing = mDozing;
mLastPulsing = mPulsing;
+ mLastScreenOffAnimationPlaying = mScreenOffAnimationPlaying;
mLastBiometricMode = mBiometricUnlockController.getMode();
mLastGesturalNav = mGesturalNav;
mLastIsDocked = mIsDocked;
@@ -1054,14 +1072,15 @@
/**
* @return Whether the navigation bar should be made visible based on the current state.
*/
- protected boolean isNavBarVisible() {
- int biometricMode = mBiometricUnlockController.getMode();
+ public boolean isNavBarVisible() {
+ boolean isWakeAndUnlockPulsing = mBiometricUnlockController != null
+ && mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING;
boolean keyguardShowing = mShowing && !mOccluded;
- boolean hideWhileDozing = mDozing && biometricMode != MODE_WAKE_AND_UNLOCK_PULSING;
+ boolean hideWhileDozing = mDozing && !isWakeAndUnlockPulsing;
boolean keyguardWithGestureNav = (keyguardShowing && !mDozing || mPulsing && !mIsDocked)
&& mGesturalNav;
- return (!keyguardShowing && !hideWhileDozing || mBouncer.isShowing()
- || mRemoteInputActive || keyguardWithGestureNav
+ return (!keyguardShowing && !hideWhileDozing && !mScreenOffAnimationPlaying
+ || mBouncer.isShowing() || mRemoteInputActive || keyguardWithGestureNav
|| mGlobalActionsVisible);
}
@@ -1073,8 +1092,8 @@
boolean hideWhileDozing = mLastDozing && mLastBiometricMode != MODE_WAKE_AND_UNLOCK_PULSING;
boolean keyguardWithGestureNav = (keyguardShowing && !mLastDozing
|| mLastPulsing && !mLastIsDocked) && mLastGesturalNav;
- return (!keyguardShowing && !hideWhileDozing || mLastBouncerShowing
- || mLastRemoteInputActive || keyguardWithGestureNav
+ return (!keyguardShowing && !hideWhileDozing && !mLastScreenOffAnimationPlaying
+ || mLastBouncerShowing || mLastRemoteInputActive || keyguardWithGestureNav
|| mLastGlobalActionsVisible);
}
@@ -1224,6 +1243,13 @@
setDozing(isDozing);
}
+ @Override
+ public void onFoldToAodAnimationChanged() {
+ if (mFoldAodAnimationController != null) {
+ mScreenOffAnimationPlaying = mFoldAodAnimationController.shouldPlayAnimation();
+ }
+ }
+
/**
* Whether qs is currently expanded.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
index 2ba37c2..09fca100 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
@@ -1,5 +1,6 @@
package com.android.systemui.statusbar.phone
+import android.view.View
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.animation.LaunchAnimator
@@ -12,6 +13,11 @@
private val statusBar: StatusBar,
private val isLaunchForActivity: Boolean = true
) : ActivityLaunchAnimator.Controller by delegate {
+ // Always sync the opening window with the shade, given that we draw a hole punch in the shade
+ // of the same size and position as the opening app to make it visible.
+ override val openingWindowSyncView: View?
+ get() = statusBar.notificationShadeWindowView
+
override fun onIntentStarted(willAnimate: Boolean) {
delegate.onIntentStarted(willAnimate)
if (!willAnimate) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 6e1ec9c..9722528 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -44,6 +44,9 @@
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Base class for dialogs that should appear over panels and keyguard.
*
@@ -68,6 +71,8 @@
private int mLastConfigurationWidthDp = -1;
private int mLastConfigurationHeightDp = -1;
+ private List<Runnable> mOnCreateRunnables = new ArrayList<>();
+
public SystemUIDialog(Context context) {
this(context, R.style.Theme_SystemUI_Dialog);
}
@@ -110,6 +115,10 @@
mLastConfigurationWidthDp = config.screenWidthDp;
mLastConfigurationHeightDp = config.screenHeightDp;
updateWindowSize();
+
+ for (int i = 0; i < mOnCreateRunnables.size(); i++) {
+ mOnCreateRunnables.get(i).run();
+ }
}
private void updateWindowSize() {
@@ -197,16 +206,67 @@
setMessage(mContext.getString(resId));
}
+ /**
+ * Set a listener to be invoked when the positive button of the dialog is pressed. The dialog
+ * will automatically be dismissed when the button is clicked.
+ */
public void setPositiveButton(int resId, OnClickListener onClick) {
- setButton(BUTTON_POSITIVE, mContext.getString(resId), onClick);
+ setPositiveButton(resId, onClick, true /* dismissOnClick */);
}
+ /**
+ * Set a listener to be invoked when the positive button of the dialog is pressed. The dialog
+ * will be dismissed when the button is clicked iff {@code dismissOnClick} is true.
+ */
+ public void setPositiveButton(int resId, OnClickListener onClick, boolean dismissOnClick) {
+ setButton(BUTTON_POSITIVE, resId, onClick, dismissOnClick);
+ }
+
+ /**
+ * Set a listener to be invoked when the negative button of the dialog is pressed. The dialog
+ * will automatically be dismissed when the button is clicked.
+ */
public void setNegativeButton(int resId, OnClickListener onClick) {
- setButton(BUTTON_NEGATIVE, mContext.getString(resId), onClick);
+ setNegativeButton(resId, onClick, true /* dismissOnClick */);
}
+ /**
+ * Set a listener to be invoked when the negative button of the dialog is pressed. The dialog
+ * will be dismissed when the button is clicked iff {@code dismissOnClick} is true.
+ */
+ public void setNegativeButton(int resId, OnClickListener onClick, boolean dismissOnClick) {
+ setButton(BUTTON_NEGATIVE, resId, onClick, dismissOnClick);
+ }
+
+ /**
+ * Set a listener to be invoked when the neutral button of the dialog is pressed. The dialog
+ * will automatically be dismissed when the button is clicked.
+ */
public void setNeutralButton(int resId, OnClickListener onClick) {
- setButton(BUTTON_NEUTRAL, mContext.getString(resId), onClick);
+ setNeutralButton(resId, onClick, true /* dismissOnClick */);
+ }
+
+ /**
+ * Set a listener to be invoked when the neutral button of the dialog is pressed. The dialog
+ * will be dismissed when the button is clicked iff {@code dismissOnClick} is true.
+ */
+ public void setNeutralButton(int resId, OnClickListener onClick, boolean dismissOnClick) {
+ setButton(BUTTON_NEUTRAL, resId, onClick, dismissOnClick);
+ }
+
+ private void setButton(int whichButton, int resId, OnClickListener onClick,
+ boolean dismissOnClick) {
+ if (dismissOnClick) {
+ setButton(whichButton, mContext.getString(resId), onClick);
+ } else {
+ // Set a null OnClickListener to make sure the button is still created and shown.
+ setButton(whichButton, mContext.getString(resId), (OnClickListener) null);
+
+ // When the dialog is created, set the click listener but don't dismiss the dialog when
+ // it is clicked.
+ mOnCreateRunnables.add(() -> getButton(whichButton).setOnClickListener(
+ view -> onClick.onClick(this, whichButton)));
+ }
}
public static void setShowForAllUsers(Dialog dialog, boolean show) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index 83bdd1b..c6b5b1d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -64,6 +64,7 @@
import com.android.systemui.statusbar.NotificationViewHierarchyManager;
import com.android.systemui.statusbar.PulseExpansionHandler;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.charging.WiredChargingRippleController;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
@@ -233,7 +234,8 @@
NotifPipelineFlags notifPipelineFlags,
InteractionJankMonitor jankMonitor,
DeviceStateManager deviceStateManager,
- DreamOverlayStateController dreamOverlayStateController) {
+ DreamOverlayStateController dreamOverlayStateController,
+ WiredChargingRippleController wiredChargingRippleController) {
return new StatusBar(
context,
notificationsController,
@@ -330,7 +332,8 @@
notifPipelineFlags,
jankMonitor,
deviceStateManager,
- dreamOverlayStateController
+ dreamOverlayStateController,
+ wiredChargingRippleController
);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java
index 8471e0a..a32a5ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java
@@ -25,6 +25,7 @@
import com.android.internal.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.util.Assert;
import java.util.ArrayList;
import java.util.List;
@@ -70,6 +71,7 @@
}
deviceStateManager.registerCallback(executor, state -> {
+ Assert.isMainThread();
mCurrentDevicePosture =
mDeviceStateToPostureMap.get(state, DEVICE_POSTURE_UNKNOWN);
@@ -79,11 +81,13 @@
@Override
public void addCallback(@NonNull Callback listener) {
+ Assert.isMainThread();
mListeners.add(listener);
}
@Override
public void removeCallback(@NonNull Callback listener) {
+ Assert.isMainThread();
mListeners.remove(listener);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
index 5e91a25..f52c6ed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
@@ -272,7 +272,7 @@
}
boolean highPowerOp = areActiveHighPowerLocationRequests();
- mAreActiveLocationRequests = highPowerOp || shouldDisplay;
+ mAreActiveLocationRequests = shouldDisplay;
if (mAreActiveLocationRequests != hadActiveLocationRequests) {
mHandler.sendEmptyMessage(H.MSG_LOCATION_ACTIVE_CHANGED);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 3205e09..48949f92 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -118,7 +118,6 @@
private boolean mColorized;
private int mTint;
private boolean mResetting;
- private boolean mWasSpinning;
// TODO(b/193539698): move these to a Controller
private RemoteInputController mController;
@@ -440,10 +439,6 @@
mEditText.requestFocus();
}
}
- if (mWasSpinning) {
- mController.addSpinning(mEntry.getKey(), mToken);
- mWasSpinning = false;
- }
}
@Override
@@ -452,7 +447,6 @@
mEditText.removeTextChangedListener(mTextWatcher);
mEditText.setOnEditorActionListener(null);
mEditText.mRemoteInputView = null;
- mWasSpinning = mController.isSpinning(mEntry.getKey(), mToken);
if (mEntry.getRow().isChangingPosition() || isTemporarilyDetached()) {
return;
}
@@ -539,8 +533,6 @@
if (isActive() && mWrapper != null) {
mWrapper.setRemoteInputVisible(true);
}
-
- mWasSpinning = false;
}
private void reset() {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
index d97815f..b23d870 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
@@ -34,6 +34,8 @@
import android.util.ArrayMap;
import android.util.ArraySet;
+import androidx.annotation.WorkerThread;
+
import com.android.internal.util.ArrayUtils;
import com.android.systemui.DejankUtils;
import com.android.systemui.R;
@@ -287,6 +289,7 @@
}
@Override
+ @WorkerThread
public boolean isTunerEnabled() {
return mUserTracker.getUserContext().getPackageManager().getComponentEnabledSetting(
mTunerComponent) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
index 2e627a8..2a9076e 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
@@ -48,17 +48,17 @@
private var pendingScrimReadyCallback: Runnable? = null
private var shouldPlayAnimation = false
+ private var isAnimationPlaying = false
+
private val statusListeners = arrayListOf<FoldAodAnimationStatus>()
private val startAnimationRunnable = Runnable {
statusBar.notificationPanelViewController.startFoldToAodAnimation {
// End action
- isAnimationPlaying = false
+ setAnimationState(playing = false)
}
}
- private var isAnimationPlaying = false
-
override fun initialize(statusBar: StatusBar, lightRevealScrim: LightRevealScrim) {
this.statusBar = statusBar
@@ -71,17 +71,13 @@
override fun startAnimation(): Boolean =
if (alwaysOnEnabled &&
wakefulnessLifecycle.lastSleepReason == PowerManager.GO_TO_SLEEP_REASON_DEVICE_FOLD &&
- globalSettings.getString(Settings.Global.ANIMATOR_DURATION_SCALE) != "0") {
- shouldPlayAnimation = true
-
- isAnimationPlaying = true
+ globalSettings.getString(Settings.Global.ANIMATOR_DURATION_SCALE) != "0"
+ ) {
+ setAnimationState(playing = true)
statusBar.notificationPanelViewController.prepareFoldToAodAnimation()
-
- statusListeners.forEach(FoldAodAnimationStatus::onFoldToAodAnimationChanged)
-
true
} else {
- shouldPlayAnimation = false
+ setAnimationState(playing = false)
false
}
@@ -91,8 +87,13 @@
statusBar.notificationPanelViewController.cancelFoldToAodAnimation();
}
- shouldPlayAnimation = false
- isAnimationPlaying = false
+ setAnimationState(playing = false)
+ }
+
+ private fun setAnimationState(playing: Boolean) {
+ shouldPlayAnimation = playing
+ isAnimationPlaying = playing
+ statusListeners.forEach(FoldAodAnimationStatus::onFoldToAodAnimationChanged)
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt
index 4b09a58..cbdf87e 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt
@@ -22,11 +22,12 @@
import android.hardware.devicestate.DeviceStateManager.FoldStateListener
import android.hardware.display.DisplayManager
import android.hardware.input.InputManager
-import android.os.Handler
import android.os.Trace
import android.view.Choreographer
import android.view.Display
import android.view.DisplayInfo
+import android.view.IRotationWatcher
+import android.view.IWindowManager
import android.view.Surface
import android.view.SurfaceControl
import android.view.SurfaceControlViewHost
@@ -39,6 +40,7 @@
import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.LinearLightRevealEffect
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
+import com.android.systemui.util.traceSection
import com.android.wm.shell.displayareahelper.DisplayAreaHelper
import java.util.Optional
import java.util.concurrent.Executor
@@ -55,12 +57,12 @@
private val unfoldTransitionProgressProvider: UnfoldTransitionProgressProvider,
private val displayAreaHelper: Optional<DisplayAreaHelper>,
@Main private val executor: Executor,
- @Main private val handler: Handler,
- @UiBackground private val backgroundExecutor: Executor
+ @UiBackground private val backgroundExecutor: Executor,
+ private val windowManagerInterface: IWindowManager
) {
private val transitionListener = TransitionListener()
- private val displayListener = DisplayChangeListener()
+ private val rotationWatcher = RotationWatcher()
private lateinit var wwm: WindowlessWindowManager
private lateinit var unfoldedDisplayInfo: DisplayInfo
@@ -76,6 +78,7 @@
fun init() {
deviceStateManager.registerCallback(executor, FoldListener())
unfoldTransitionProgressProvider.addCallback(transitionListener)
+ windowManagerInterface.watchRotation(rotationWatcher, context.display.displayId)
val containerBuilder =
SurfaceControl.Builder(SurfaceSession())
@@ -97,9 +100,6 @@
}
}
- displayManager.registerDisplayListener(
- displayListener, handler, DisplayManager.EVENT_FLAG_DISPLAY_CHANGED)
-
// Get unfolded display size immediately as 'current display info' might be
// not up-to-date during unfolding
unfoldedDisplayInfo = getUnfoldedDisplayInfo()
@@ -180,7 +180,7 @@
private fun getLayoutParams(): WindowManager.LayoutParams {
val params: WindowManager.LayoutParams = WindowManager.LayoutParams()
- val rotation = context.display!!.rotation
+ val rotation = currentRotation
val isNatural = rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180
params.height =
@@ -243,20 +243,15 @@
}
}
- private inner class DisplayChangeListener : DisplayManager.DisplayListener {
-
- override fun onDisplayChanged(displayId: Int) {
- val newRotation: Int = context.display!!.rotation
- if (currentRotation != newRotation) {
- currentRotation = newRotation
- scrimView?.revealEffect = createLightRevealEffect()
- root?.relayout(getLayoutParams())
+ private inner class RotationWatcher : IRotationWatcher.Stub() {
+ override fun onRotationChanged(newRotation: Int) =
+ traceSection("UnfoldLightRevealOverlayAnimation#onRotationChanged") {
+ if (currentRotation != newRotation) {
+ currentRotation = newRotation
+ scrimView?.revealEffect = createLightRevealEffect()
+ root?.relayout(getLayoutParams())
+ }
}
- }
-
- override fun onDisplayAdded(displayId: Int) {}
-
- override fun onDisplayRemoved(displayId: Int) {}
}
private inner class FoldListener :
diff --git a/packages/SystemUI/src/com/android/systemui/user/UserCreator.java b/packages/SystemUI/src/com/android/systemui/user/UserCreator.java
index 3a270bb..0686071c 100644
--- a/packages/SystemUI/src/com/android/systemui/user/UserCreator.java
+++ b/packages/SystemUI/src/com/android/systemui/user/UserCreator.java
@@ -19,6 +19,7 @@
import android.app.Dialog;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.UserManager;
@@ -70,10 +71,12 @@
}
Drawable newUserIcon = userIcon;
+ Resources res = mContext.getResources();
if (newUserIcon == null) {
- newUserIcon = UserIcons.getDefaultUserIcon(mContext.getResources(), user.id, false);
+ newUserIcon = UserIcons.getDefaultUserIcon(res, user.id, false);
}
- mUserManager.setUserIcon(user.id, UserIcons.convertToBitmap(newUserIcon));
+ mUserManager.setUserIcon(
+ user.id, UserIcons.convertToBitmapAtUserIconSize(res, newUserIcon));
userCreationProgressDialog.dismiss();
successCallback.accept(user);
diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java
index 40982bb..460b7d9 100644
--- a/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java
+++ b/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java
@@ -37,6 +37,8 @@
private final ThresholdSensor[] mPostureToPrimaryProxSensorMap;
private final ThresholdSensor[] mPostureToSecondaryProxSensorMap;
+ private final DevicePostureController mDevicePostureController;
+
@Inject
PostureDependentProximitySensor(
@PrimaryProxSensor ThresholdSensor[] postureToPrimaryProxSensorMap,
@@ -53,15 +55,24 @@
);
mPostureToPrimaryProxSensorMap = postureToPrimaryProxSensorMap;
mPostureToSecondaryProxSensorMap = postureToSecondaryProxSensorMap;
- mDevicePosture = devicePostureController.getDevicePosture();
- devicePostureController.addCallback(mDevicePostureCallback);
+ mDevicePostureController = devicePostureController;
+
+ mDevicePosture = mDevicePostureController.getDevicePosture();
+ mDevicePostureController.addCallback(mDevicePostureCallback);
chooseSensors();
}
+
+ @Override
+ public void destroy() {
+ super.destroy();
+ mDevicePostureController.removeCallback(mDevicePostureCallback);
+ }
+
private void chooseSensors() {
if (mDevicePosture >= mPostureToPrimaryProxSensorMap.length
|| mDevicePosture >= mPostureToSecondaryProxSensorMap.length) {
- Log.e("PostureDependentProxSensor",
+ Log.e("PostureDependProxSensor",
"unsupported devicePosture=" + mDevicePosture);
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java
index a8a6341..c06a3a1 100644
--- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java
+++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java
@@ -73,6 +73,13 @@
}
}
+ /**
+ * Cleanup after no longer needed.
+ */
+ public void destroy() {
+ mSensor.destroy();
+ }
+
private void unregister() {
mSensor.unregister(mListener);
mRegistered.set(false);
diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
index d3f1c93..7f64322 100644
--- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
+++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
@@ -42,4 +42,10 @@
* of what is reported by the primary sensor.
*/
void setSecondarySafe(boolean safe);
+
+ /**
+ * Called when the proximity sensor is no longer needed. All listeners should
+ * be unregistered and cleaned up.
+ */
+ void destroy();
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java
index 5568f64..8ab5bc6 100644
--- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java
@@ -252,6 +252,11 @@
}
@Override
+ public void destroy() {
+ pause();
+ }
+
+ @Override
public String getName() {
return mPrimaryThresholdSensor.getName();
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index f71dd24..42e15c4 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -243,6 +243,9 @@
verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
mStatusBarStateListener = mStatusBarStateListenerCaptor.getValue();
mKeyguardUpdateMonitor.registerCallback(mTestCallback);
+
+ mTestableLooper.processAllMessages();
+ when(mAuthController.areAllAuthenticatorsRegistered()).thenReturn(true);
}
@After
@@ -471,6 +474,18 @@
}
@Test
+ public void test_doesNotTryToAuthenticateFingerprint_whenAuthenticatorsNotRegistered() {
+ when(mAuthController.areAllAuthenticatorsRegistered()).thenReturn(false);
+
+ mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */);
+ mTestableLooper.processAllMessages();
+
+ verify(mFingerprintManager, never()).authenticate(any(), any(), any(), any(), anyInt(),
+ anyInt(), anyInt());
+ verify(mFingerprintManager, never()).detectFingerprint(any(), any(), anyInt());
+ }
+
+ @Test
public void testFingerprintDoesNotAuth_whenEncrypted() {
testFingerprintWhenStrongAuth(
STRONG_AUTH_REQUIRED_AFTER_BOOT);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
index 589eeb5..d5df9fe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
@@ -46,7 +46,7 @@
@RunWithLooper
class ActivityLaunchAnimatorTest : SysuiTestCase() {
private val launchContainer = LinearLayout(mContext)
- private val launchAnimator = LaunchAnimator(TEST_TIMINGS, TEST_INTERPOLATORS)
+ private val testLaunchAnimator = LaunchAnimator(TEST_TIMINGS, TEST_INTERPOLATORS)
@Mock lateinit var callback: ActivityLaunchAnimator.Callback
@Mock lateinit var listener: ActivityLaunchAnimator.Listener
@Spy private val controller = TestLaunchAnimatorController(launchContainer)
@@ -58,7 +58,7 @@
@Before
fun setup() {
- activityLaunchAnimator = ActivityLaunchAnimator(launchAnimator)
+ activityLaunchAnimator = ActivityLaunchAnimator(testLaunchAnimator, testLaunchAnimator)
activityLaunchAnimator.callback = callback
activityLaunchAnimator.addListener(listener)
}
@@ -129,13 +129,11 @@
@Test
fun animatesIfActivityIsAlreadyOpenAndIsOnKeyguard() {
`when`(callback.isOnKeyguard()).thenReturn(true)
- val animator = ActivityLaunchAnimator(launchAnimator)
- animator.callback = callback
val willAnimateCaptor = ArgumentCaptor.forClass(Boolean::class.java)
var animationAdapter: RemoteAnimationAdapter? = null
- startIntentWithAnimation(animator) { adapter ->
+ startIntentWithAnimation(activityLaunchAnimator) { adapter ->
animationAdapter = adapter
ActivityManager.START_DELIVERED_TO_TOP
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt
index 61e78f5..fe2efa5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt
@@ -20,8 +20,10 @@
import junit.framework.Assert.assertEquals
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertNotNull
+import junit.framework.Assert.assertNull
import junit.framework.Assert.assertTrue
import org.junit.After
+import org.junit.Assert.assertNotEquals
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -43,7 +45,7 @@
@Before
fun setUp() {
dialogLaunchAnimator = DialogLaunchAnimator(
- dreamManager, launchAnimator, forceDisableSynchronization = true)
+ dreamManager, launchAnimator, isForTesting = true)
}
@After
@@ -92,11 +94,6 @@
// Clicking the transparent background should dismiss the dialog.
runOnMainThreadAndWaitForIdleSync {
- // TODO(b/204561691): Remove this call to disableAllCurrentDialogsExitAnimations() and
- // make sure that the test still pass on git_master/cf_x86_64_phone-userdebug in
- // Forrest.
- dialogLaunchAnimator.disableAllCurrentDialogsExitAnimations()
-
transparentBackground.performClick()
}
assertFalse(dialog.isShowing)
@@ -110,7 +107,6 @@
assertTrue(firstDialog.isShowing)
assertTrue(secondDialog.isShowing)
runOnMainThreadAndWaitForIdleSync {
- dialogLaunchAnimator.disableAllCurrentDialogsExitAnimations()
dialogLaunchAnimator.dismissStack(secondDialog)
}
@@ -118,7 +114,63 @@
assertFalse(secondDialog.isShowing)
}
+ @Test
+ fun testActivityLaunchControllerFromDialog() {
+ val firstDialog = createAndShowDialog()
+ val secondDialog = createDialogAndShowFromDialog(firstDialog)
+
+ val controller =
+ dialogLaunchAnimator.createActivityLaunchController(secondDialog.contentView)!!
+
+ // The dialog shouldn't be dismissable during the animation.
+ runOnMainThreadAndWaitForIdleSync {
+ controller.onLaunchAnimationStart(isExpandingFullyAbove = true)
+ secondDialog.dismiss()
+ }
+ assertTrue(secondDialog.isShowing)
+
+ // Both dialogs should be dismissed at the end of the animation.
+ runOnMainThreadAndWaitForIdleSync {
+ controller.onLaunchAnimationEnd(isExpandingFullyAbove = true)
+ }
+ assertFalse(firstDialog.isShowing)
+ assertFalse(secondDialog.isShowing)
+ }
+
+ @Test
+ fun testActivityLaunchFromHiddenDialog() {
+ val dialog = createAndShowDialog()
+ runOnMainThreadAndWaitForIdleSync {
+ dialog.hide()
+ }
+ assertNull(dialogLaunchAnimator.createActivityLaunchController(dialog.contentView))
+ }
+
+ @Test
+ fun testDialogAnimationIsChangedByAnimator() {
+ // Important: the power menu animation relies on this behavior to know when to animate (see
+ // http://ag/16774605).
+ val dialog = runOnMainThreadAndWaitForIdleSync { TestDialog(context) }
+ dialog.window.setWindowAnimations(0)
+ assertEquals(0, dialog.window.attributes.windowAnimations)
+
+ val touchSurface = createTouchSurface()
+ runOnMainThreadAndWaitForIdleSync {
+ dialogLaunchAnimator.showFromView(dialog, touchSurface)
+ }
+ assertNotEquals(0, dialog.window.attributes.windowAnimations)
+ }
+
private fun createAndShowDialog(): TestDialog {
+ val touchSurface = createTouchSurface()
+ return runOnMainThreadAndWaitForIdleSync {
+ val dialog = TestDialog(context)
+ dialogLaunchAnimator.showFromView(dialog, touchSurface)
+ dialog
+ }
+ }
+
+ private fun createTouchSurface(): View {
return runOnMainThreadAndWaitForIdleSync {
val touchSurfaceRoot = LinearLayout(context)
val touchSurface = View(context)
@@ -129,9 +181,7 @@
ViewUtils.attachView(touchSurfaceRoot)
attachedViews.add(touchSurfaceRoot)
- val dialog = TestDialog(context)
- dialogLaunchAnimator.showFromView(dialog, touchSurface)
- dialog
+ touchSurface
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java b/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java
deleted file mode 100644
index 500205c..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * 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.systemui.communal;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.wifi.WifiInfo;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.testing.AndroidTestingRunner;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.communal.conditions.CommunalTrustedNetworkCondition;
-import com.android.systemui.util.settings.FakeSettings;
-import com.android.systemui.utils.os.FakeHandler;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-public class CommunalTrustedNetworkConditionTest extends SysuiTestCase {
- @Mock private ConnectivityManager mConnectivityManager;
-
- @Captor private ArgumentCaptor<ConnectivityManager.NetworkCallback> mNetworkCallbackCaptor;
-
- private final Handler mHandler = new FakeHandler(Looper.getMainLooper());
- private CommunalTrustedNetworkCondition mCondition;
-
- private final String mTrustedWifi1 = "wifi-1";
- private final String mTrustedWifi2 = "wifi-2";
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
- final FakeSettings secureSettings = new FakeSettings();
- secureSettings.putStringForUser(Settings.Secure.COMMUNAL_MODE_TRUSTED_NETWORKS,
- mTrustedWifi1 + CommunalTrustedNetworkCondition.SETTINGS_STRING_DELIMINATOR
- + mTrustedWifi2, UserHandle.USER_SYSTEM);
- mCondition = new CommunalTrustedNetworkCondition(mHandler, mConnectivityManager,
- secureSettings);
- }
-
- @Test
- public void updateCallback_connectedToTrustedNetwork_reportsTrue() {
- final CommunalTrustedNetworkCondition.Callback callback =
- mock(CommunalTrustedNetworkCondition.Callback.class);
- mCondition.addCallback(callback);
-
- final ConnectivityManager.NetworkCallback networkCallback = captureNetworkCallback();
-
- // Connected to trusted Wi-Fi network.
- final Network network = mock(Network.class);
- networkCallback.onAvailable(network);
- networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1));
-
- // Verifies that the callback is triggered.
- verify(callback).onConditionChanged(mCondition);
- assertThat(mCondition.isConditionMet()).isTrue();
- }
-
- @Test
- public void updateCallback_switchedToAnotherTrustedNetwork_reportsNothing() {
- final CommunalTrustedNetworkCondition.Callback callback =
- mock(CommunalTrustedNetworkCondition.Callback.class);
- mCondition.addCallback(callback);
-
- final ConnectivityManager.NetworkCallback networkCallback = captureNetworkCallback();
-
- // Connected to a trusted Wi-Fi network.
- final Network network = mock(Network.class);
- networkCallback.onAvailable(network);
- networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1));
- clearInvocations(callback);
-
- // Connected to another trusted Wi-Fi network.
- networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi2));
-
- // Verifies that the callback is not triggered.
- verify(callback, never()).onConditionChanged(eq(mCondition));
- }
-
- @Test
- public void updateCallback_connectedToNonTrustedNetwork_reportsFalse() {
- final CommunalTrustedNetworkCondition.Callback callback =
- mock(CommunalTrustedNetworkCondition.Callback.class);
- mCondition.addCallback(callback);
-
- final ConnectivityManager.NetworkCallback networkCallback = captureNetworkCallback();
-
- // Connected to trusted Wi-Fi network.
- final Network network = mock(Network.class);
- networkCallback.onAvailable(network);
- networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1));
-
- Mockito.clearInvocations(callback);
- // Connected to non-trusted Wi-Fi network.
- networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities("random-wifi"));
-
- // Verifies that the callback is triggered.
- verify(callback).onConditionChanged(mCondition);
- assertThat(mCondition.isConditionMet()).isFalse();
- }
-
- @Test
- public void updateCallback_disconnectedFromNetwork_reportsFalse() {
- final CommunalTrustedNetworkCondition.Callback callback =
- mock(CommunalTrustedNetworkCondition.Callback.class);
- mCondition.addCallback(callback);
-
- final ConnectivityManager.NetworkCallback networkCallback = captureNetworkCallback();
-
- // Connected to Wi-Fi.
- final Network network = mock(Network.class);
- networkCallback.onAvailable(network);
- networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1));
- clearInvocations(callback);
-
- // Disconnected from Wi-Fi.
- networkCallback.onLost(network);
-
- // Verifies that the callback is triggered.
- verify(callback).onConditionChanged(mCondition);
- assertThat(mCondition.isConditionMet()).isFalse();
- }
-
- // Captures and returns the network callback, assuming it is registered with the connectivity
- // manager.
- private ConnectivityManager.NetworkCallback captureNetworkCallback() {
- verify(mConnectivityManager).registerNetworkCallback(any(NetworkRequest.class),
- mNetworkCallbackCaptor.capture());
- return mNetworkCallbackCaptor.getValue();
- }
-
- private NetworkCapabilities fakeNetworkCapabilities(String ssid) {
- final NetworkCapabilities networkCapabilities = mock(NetworkCapabilities.class);
- final WifiInfo wifiInfo = mock(WifiInfo.class);
- when(wifiInfo.getSSID()).thenReturn(ssid);
- when(networkCapabilities.getTransportInfo()).thenReturn(wifiInfo);
- return networkCapabilities;
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt
index 47ab17d..d3c465d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt
@@ -23,22 +23,24 @@
import android.graphics.drawable.Icon
import android.service.controls.Control
import android.service.controls.DeviceTypes
+import android.service.controls.templates.ControlTemplate
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
import androidx.test.filters.SmallTest
import com.android.systemui.R
-import com.android.systemui.controls.controller.ControlsController
-import com.android.systemui.util.time.FakeSystemClock
-import org.junit.runner.RunWith
import com.android.systemui.SysuiTestCase
import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.controls.controller.ControlInfo
+import com.android.systemui.controls.controller.ControlsController
import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
+import org.junit.runner.RunWith
import org.mockito.Mockito.mock
@SmallTest
@@ -49,11 +51,12 @@
private val clock = FakeSystemClock()
private lateinit var cvh: ControlViewHolder
+ private lateinit var baseLayout: ViewGroup
@Before
fun setUp() {
TestableLooper.get(this).runWithLooper {
- val baseLayout = LayoutInflater.from(mContext).inflate(
+ baseLayout = LayoutInflater.from(mContext).inflate(
R.layout.controls_base_item, null, false) as ViewGroup
cvh = ControlViewHolder(
@@ -106,6 +109,25 @@
assertThat(cvh.icon.imageTintList).isEqualTo(customIconTintList)
}
+
+ @Test
+ fun chevronIcon() {
+ val control = Control.StatefulBuilder(CONTROL_ID, mock(PendingIntent::class.java))
+ .setStatus(Control.STATUS_OK)
+ .setControlTemplate(ControlTemplate.NO_TEMPLATE)
+ .build()
+ val cws = ControlWithState(
+ ComponentName.createRelative("pkg", "cls"),
+ ControlInfo(
+ CONTROL_ID, CONTROL_TITLE, "subtitle", DeviceTypes.TYPE_AIR_FRESHENER
+ ),
+ control
+ )
+ cvh.bindData(cws, false)
+ val chevronIcon = baseLayout.findViewById<View>(R.id.chevron_icon)
+
+ assertThat(chevronIcon.visibility).isEqualTo(View.VISIBLE)
+ }
}
private const val CONTROL_ID = "CONTROL_ID"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index 8078b6c..5684429 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -42,12 +42,14 @@
import android.hardware.display.AmbientDisplayConfiguration;
import android.testing.AndroidTestingRunner;
import android.testing.UiThreadTest;
+import android.view.Display;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.wakelock.WakeLockFake;
@@ -444,4 +446,20 @@
assertTrue(mServiceFake.requestedWakeup);
}
+
+ @Test
+ public void testDozePulsing_displayRequiresBlanking_screenState() {
+ DozeParameters dozeParameters = mock(DozeParameters.class);
+ when(dozeParameters.getDisplayNeedsBlanking()).thenReturn(true);
+
+ assertEquals(Display.STATE_OFF, DOZE_REQUEST_PULSE.screenState(dozeParameters));
+ }
+
+ @Test
+ public void testDozePulsing_displayDoesNotRequireBlanking_screenState() {
+ DozeParameters dozeParameters = mock(DozeParameters.class);
+ when(dozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
+
+ assertEquals(Display.STATE_ON, DOZE_REQUEST_PULSE.screenState(dozeParameters));
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
index f207b9e..0a1e45c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
@@ -175,6 +175,7 @@
public void testDestroy() {
mDozeSensors.destroy();
+ verify(mProximitySensor).destroy();
verify(mTriggerSensor).setListening(false);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 7fc354f..ae387e8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -299,6 +299,12 @@
verify(mAuthController).onAodInterrupt(eq(screenX), eq(screenY), eq(major), eq(minor));
}
+ @Test
+ public void testDestroy() {
+ mTriggers.destroy();
+ verify(mProximityCheck).destroy();
+ }
+
private void waitForSensorManager() {
mExecutor.runAllReady();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
index 627da3c..515a1ac8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
@@ -123,7 +123,7 @@
}
@Test
- public void testComplicationFiltering() {
+ public void testComplicationFilteringWhenShouldShowComplications() {
final DreamOverlayStateController stateController =
new DreamOverlayStateController(mExecutor);
@@ -160,4 +160,50 @@
}
}
+
+ @Test
+ public void testComplicationFilteringWhenShouldHideComplications() {
+ final DreamOverlayStateController stateController =
+ new DreamOverlayStateController(mExecutor);
+ stateController.setShouldShowComplications(true);
+
+ final Complication alwaysAvailableComplication = Mockito.mock(Complication.class);
+ final Complication weatherComplication = Mockito.mock(Complication.class);
+ when(alwaysAvailableComplication.getRequiredTypeAvailability())
+ .thenReturn(Complication.COMPLICATION_TYPE_NONE);
+ when(weatherComplication.getRequiredTypeAvailability())
+ .thenReturn(Complication.COMPLICATION_TYPE_WEATHER);
+
+ stateController.addComplication(alwaysAvailableComplication);
+ stateController.addComplication(weatherComplication);
+
+ final DreamOverlayStateController.Callback callback =
+ Mockito.mock(DreamOverlayStateController.Callback.class);
+
+ stateController.setAvailableComplicationTypes(Complication.COMPLICATION_TYPE_WEATHER);
+ stateController.addCallback(callback);
+ mExecutor.runAllReady();
+
+ {
+ clearInvocations(callback);
+ stateController.setShouldShowComplications(true);
+ mExecutor.runAllReady();
+
+ verify(callback).onAvailableComplicationTypesChanged();
+ final Collection<Complication> complications = stateController.getComplications();
+ assertThat(complications.contains(alwaysAvailableComplication)).isTrue();
+ assertThat(complications.contains(weatherComplication)).isTrue();
+ }
+
+ {
+ clearInvocations(callback);
+ stateController.setShouldShowComplications(false);
+ mExecutor.runAllReady();
+
+ verify(callback).onAvailableComplicationTypesChanged();
+ final Collection<Complication> complications = stateController.getComplications();
+ assertThat(complications.contains(alwaysAvailableComplication)).isTrue();
+ assertThat(complications.contains(weatherComplication)).isFalse();
+ }
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt
index 87bc732..4cc5673 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt
@@ -18,10 +18,10 @@
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
-import android.content.pm.PackageManager
import android.content.pm.PackageManager.NameNotFoundException
import android.content.res.Resources
import androidx.test.filters.SmallTest
+import com.android.internal.statusbar.IStatusBarService
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.util.mockito.any
@@ -59,6 +59,7 @@
@Mock private lateinit var mSecureSettings: SecureSettings
@Mock private lateinit var mResources: Resources
@Mock private lateinit var mDumpManager: DumpManager
+ @Mock private lateinit var mBarService: IStatusBarService
private val mFlagMap = mutableMapOf<Int, Flag<*>>()
private lateinit var mBroadcastReceiver: BroadcastReceiver
private lateinit var mClearCacheAction: Consumer<Int>
@@ -72,7 +73,8 @@
mSecureSettings,
mResources,
mDumpManager,
- { mFlagMap }
+ { mFlagMap },
+ mBarService
)
verify(mFlagManager).restartAction = any()
mBroadcastReceiver = withArgCaptor {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/idle/AmbientLightModeMonitorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/idle/AmbientLightModeMonitorTest.kt
deleted file mode 100644
index 98b9252..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/idle/AmbientLightModeMonitorTest.kt
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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.systemui.idle
-
-import android.hardware.Sensor
-import android.hardware.SensorEventListener
-import android.testing.AndroidTestingRunner
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.util.sensors.AsyncSensorManager
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.Mock
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.any
-import org.mockito.Mockito.eq
-import org.mockito.Mockito.never
-import org.mockito.Mockito.`when`
-import org.mockito.MockitoAnnotations
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-class AmbientLightModeMonitorTest : SysuiTestCase() {
- @Mock private lateinit var sensorManager: AsyncSensorManager
- @Mock private lateinit var sensor: Sensor
- @Mock private lateinit var algorithm: AmbientLightModeMonitor.DebounceAlgorithm
-
- private lateinit var ambientLightModeMonitor: AmbientLightModeMonitor
-
- @Before
- fun setUp() {
- MockitoAnnotations.initMocks(this)
-
- `when`(sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)).thenReturn(sensor)
-
- ambientLightModeMonitor = AmbientLightModeMonitor(algorithm, sensorManager)
- }
-
- @Test
- fun shouldRegisterSensorEventListenerOnStart() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- ambientLightModeMonitor.start(callback)
-
- verify(sensorManager).registerListener(any(), eq(sensor), anyInt())
- }
-
- @Test
- fun shouldUnregisterSensorEventListenerOnStop() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- ambientLightModeMonitor.start(callback)
-
- val sensorEventListener = captureSensorEventListener()
-
- ambientLightModeMonitor.stop()
-
- verify(sensorManager).unregisterListener(eq(sensorEventListener))
- }
-
- @Test
- fun shouldStartDebounceAlgorithmOnStart() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- ambientLightModeMonitor.start(callback)
-
- verify(algorithm).start(eq(callback))
- }
-
- @Test
- fun shouldStopDebounceAlgorithmOnStop() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- ambientLightModeMonitor.start(callback)
- ambientLightModeMonitor.stop()
-
- verify(algorithm).stop()
- }
-
- @Test
- fun shouldNotRegisterForSensorUpdatesIfSensorNotAvailable() {
- `when`(sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)).thenReturn(null)
- val ambientLightModeMonitor = AmbientLightModeMonitor(algorithm, sensorManager)
-
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- ambientLightModeMonitor.start(callback)
-
- verify(sensorManager, never()).registerListener(any(), any(Sensor::class.java), anyInt())
- }
-
- // Captures [SensorEventListener], assuming it has been registered with [sensorManager].
- private fun captureSensorEventListener(): SensorEventListener {
- val captor = ArgumentCaptor.forClass(SensorEventListener::class.java)
- verify(sensorManager).registerListener(captor.capture(), any(), anyInt())
- return captor.value
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/idle/IdleHostViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/idle/IdleHostViewControllerTest.java
deleted file mode 100644
index 3c24a3a..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/idle/IdleHostViewControllerTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.systemui.idle;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.res.Resources;
-import android.os.PowerManager;
-import android.testing.AndroidTestingRunner;
-import android.view.View;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import javax.inject.Provider;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-public class IdleHostViewControllerTest extends SysuiTestCase {
- @Mock private BroadcastDispatcher mBroadcastDispatcher;
- @Mock private PowerManager mPowerManager;
- @Mock private IdleHostView mIdleHostView;
- @Mock private Resources mResources;
- @Mock private Provider<View> mViewProvider;
- @Mock private KeyguardStateController mKeyguardStateController;
- @Mock private StatusBarStateController mStatusBarStateController;
- @Mock private AmbientLightModeMonitor mAmbientLightModeMonitor;
-
- private KeyguardStateController.Callback mKeyguardStateCallback;
- private StatusBarStateController.StateListener mStatusBarStateListener;
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
-
- when(mResources.getBoolean(R.bool.config_enableIdleMode)).thenReturn(true);
- when(mStatusBarStateController.isDozing()).thenReturn(false);
-
- final IdleHostViewController controller = new IdleHostViewController(mBroadcastDispatcher,
- mPowerManager, mIdleHostView, mResources, mViewProvider, mKeyguardStateController,
- mStatusBarStateController, mAmbientLightModeMonitor);
- controller.init();
- controller.onViewAttached();
-
- // Captures keyguard state controller callback.
- ArgumentCaptor<KeyguardStateController.Callback> keyguardStateCallbackCaptor =
- ArgumentCaptor.forClass(KeyguardStateController.Callback.class);
- verify(mKeyguardStateController).addCallback(keyguardStateCallbackCaptor.capture());
- mKeyguardStateCallback = keyguardStateCallbackCaptor.getValue();
-
- // Captures status bar state listener.
- ArgumentCaptor<StatusBarStateController.StateListener> statusBarStateListenerCaptor =
- ArgumentCaptor.forClass(StatusBarStateController.StateListener.class);
- verify(mStatusBarStateController).addCallback(statusBarStateListenerCaptor.capture());
- mStatusBarStateListener = statusBarStateListenerCaptor.getValue();
- }
-
- @Test
- public void testStartDozingWhenLowLight() {
- // Keyguard showing.
- when(mKeyguardStateController.isShowing()).thenReturn(true);
- mKeyguardStateCallback.onKeyguardShowingChanged();
-
- // Regular ambient lighting.
- final AmbientLightModeMonitor.Callback lightMonitorCallback =
- captureAmbientLightModeMonitorCallback();
- lightMonitorCallback.onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT);
-
- // Verifies it doesn't go to sleep yet.
- verify(mPowerManager, never()).goToSleep(anyLong(), anyInt(), anyInt());
-
- // Ambient lighting becomes dim.
- lightMonitorCallback.onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK);
-
- // Verifies it goes to sleep.
- verify(mPowerManager).goToSleep(anyLong(), anyInt(), anyInt());
- }
-
- @Test
- public void testWakeUpWhenRegularLight() {
- // Keyguard showing.
- when(mKeyguardStateController.isShowing()).thenReturn(true);
- mKeyguardStateCallback.onKeyguardShowingChanged();
-
- // In low light / dozing.
- final AmbientLightModeMonitor.Callback lightMonitorCallback =
- captureAmbientLightModeMonitorCallback();
- lightMonitorCallback.onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK);
- mStatusBarStateListener.onDozingChanged(true /*isDozing*/);
-
- // Regular ambient lighting.
- lightMonitorCallback.onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT);
-
- // Verifies it wakes up from sleep.
- verify(mPowerManager).wakeUp(anyLong(), anyInt(), anyString());
- }
-
- // Captures [AmbientLightModeMonitor.Callback] assuming that the ambient light mode monitor
- // has been started.
- private AmbientLightModeMonitor.Callback captureAmbientLightModeMonitorCallback() {
- ArgumentCaptor<AmbientLightModeMonitor.Callback> captor =
- ArgumentCaptor.forClass(AmbientLightModeMonitor.Callback.class);
- verify(mAmbientLightModeMonitor).start(captor.capture());
- return captor.getValue();
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/idle/LightSensorDebounceAlgorithmTest.kt b/packages/SystemUI/tests/src/com/android/systemui/idle/LightSensorDebounceAlgorithmTest.kt
deleted file mode 100644
index ebc7345..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/idle/LightSensorDebounceAlgorithmTest.kt
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * 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.systemui.idle
-
-import android.content.res.Resources
-import android.testing.AndroidTestingRunner
-import androidx.test.filters.SmallTest
-import com.android.systemui.R
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.MockitoAnnotations
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.reset
-import org.mockito.Mockito.`when`
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-class LightSensorDebounceAlgorithmTest : SysuiTestCase() {
- @Mock private lateinit var resources: Resources
-
- private val systemClock = FakeSystemClock()
- private val executor = FakeExecutor(systemClock)
-
- private lateinit var algorithm: LightSensorEventsDebounceAlgorithm
-
- private val mockLightModeThreshold = 5
- private val mockDarkModeThreshold = 2
- private val mockLightModeSpan = 100
- private val mockDarkModeSpan = 50
- private val mockLightModeFrequency = 10
- private val mockDarkModeFrequency = 5
-
- @Before
- fun setUp() {
- MockitoAnnotations.initMocks(this)
-
- `when`(resources.getInteger(R.integer.config_ambientLightModeThreshold))
- .thenReturn(mockLightModeThreshold)
- `when`(resources.getInteger(R.integer.config_ambientDarkModeThreshold))
- .thenReturn(mockDarkModeThreshold)
- `when`(resources.getInteger(R.integer.config_ambientLightModeSamplingSpanMillis))
- .thenReturn(mockLightModeSpan)
- `when`(resources.getInteger(R.integer.config_ambientDarkModeSamplingSpanMillis))
- .thenReturn(mockDarkModeSpan)
- `when`(resources.getInteger(R.integer.config_ambientLightModeSamplingFrequencyMillis))
- .thenReturn(mockLightModeFrequency)
- `when`(resources.getInteger(R.integer.config_ambientDarkModeSamplingFrequencyMillis))
- .thenReturn(mockDarkModeFrequency)
-
- algorithm = LightSensorEventsDebounceAlgorithm(executor, resources)
- }
-
- @Test
- fun shouldOnlyTriggerCallbackWhenValueChanges() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- algorithm.start(callback)
-
- // Light mode, should trigger callback.
- algorithm.mode = AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT
- verify(callback).onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT)
- reset(callback)
-
- // Light mode again, should NOT trigger callback.
- algorithm.mode = AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT
- verify(callback, never()).onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT)
- reset(callback)
-
- // Dark mode, should trigger callback.
- algorithm.mode = AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK
- verify(callback).onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK)
- reset(callback)
-
- // Dark mode again, should not trigger callback.
- algorithm.mode = AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK
- verify(callback, never()).onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK)
- }
-
- @Test
- fun shouldReportUndecidedWhenNeitherLightNorDarkClaimIsTrue() {
- algorithm.isDarkMode = false
- algorithm.isLightMode = false
-
- assertThat(algorithm.mode).isEqualTo(
- AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_UNDECIDED)
- }
-
- @Test
- fun shouldReportDarkModeAsLongAsDarkModeClaimIsTrue() {
- algorithm.isDarkMode = true
- algorithm.isLightMode = false
-
- assertThat(algorithm.mode).isEqualTo(
- AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK)
-
- algorithm.isLightMode = true
- assertThat(algorithm.mode).isEqualTo(
- AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK)
- }
-
- @Test
- fun shouldReportLightModeWhenLightModeClaimIsTrueAndDarkModeClaimIsFalse() {
- algorithm.isLightMode = true
- algorithm.isDarkMode = false
-
- assertThat(algorithm.mode).isEqualTo(
- AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT)
- }
-
- @Test
- fun shouldSetIsLightModeToTrueWhenBundleAverageIsGreaterThanThreshold() {
- // Note: [mockLightModeThreshold] is 5.0.
- algorithm.bundleAverageLightMode = 5.1
- assertThat(algorithm.isLightMode).isTrue()
-
- algorithm.bundleAverageLightMode = 10.0
- assertThat(algorithm.isLightMode).isTrue()
-
- algorithm.bundleAverageLightMode = 20.0
- assertThat(algorithm.isLightMode).isTrue()
-
- algorithm.bundleAverageLightMode = 5.0
- assertThat(algorithm.isLightMode).isFalse()
-
- algorithm.bundleAverageLightMode = 3.0
- assertThat(algorithm.isLightMode).isFalse()
-
- algorithm.bundleAverageLightMode = 0.0
- assertThat(algorithm.isLightMode).isFalse()
- }
-
- @Test
- fun shouldSetIsDarkModeToTrueWhenBundleAverageIsLessThanThreshold() {
- // Note: [mockDarkModeThreshold] is 2.0.
- algorithm.bundleAverageDarkMode = 1.9
- assertThat(algorithm.isDarkMode).isTrue()
-
- algorithm.bundleAverageDarkMode = 1.0
- assertThat(algorithm.isDarkMode).isTrue()
-
- algorithm.bundleAverageDarkMode = 0.0
- assertThat(algorithm.isDarkMode).isTrue()
-
- algorithm.bundleAverageDarkMode = 2.0
- assertThat(algorithm.isDarkMode).isFalse()
-
- algorithm.bundleAverageDarkMode = 3.0
- assertThat(algorithm.isDarkMode).isFalse()
-
- algorithm.bundleAverageDarkMode = 10.0
- assertThat(algorithm.isDarkMode).isFalse()
- }
-
- @Test
- fun shouldCorrectlyCalculateAverageFromABundle() {
- // For light mode.
- algorithm.bundleLightMode = arrayListOf(1.0f, 3.0f, 5.0f, 7.0f)
- assertThat(algorithm.bundleAverageLightMode).isEqualTo(4.0)
-
- algorithm.bundleLightMode = arrayListOf(2.0f, 4.0f, 6.0f, 8.0f)
- assertThat(algorithm.bundleAverageLightMode).isEqualTo(5.0)
-
- // For dark mode.
- algorithm.bundleDarkMode = arrayListOf(1.0f, 3.0f, 5.0f, 7.0f, 9.0f)
- assertThat(algorithm.bundleAverageDarkMode).isEqualTo(5.0)
-
- algorithm.bundleDarkMode = arrayListOf(2.0f, 4.0f, 6.0f, 8.0f, 10.0f)
- assertThat(algorithm.bundleAverageDarkMode).isEqualTo(6.0)
- }
-
- @Test
- fun shouldAddSensorEventUpdatesToBundles() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- // On start() one bundle is created for light and dark mode each.
- algorithm.start(callback)
- executor.runAllReady()
-
- // Add 1 more bundle to queue for each mode.
- algorithm.bundlesQueueLightMode.add(ArrayList())
- algorithm.bundlesQueueDarkMode.add(ArrayList())
-
- algorithm.onUpdateLightSensorEvent(1.0f)
- algorithm.onUpdateLightSensorEvent(1.0f)
- algorithm.onUpdateLightSensorEvent(2.0f)
- algorithm.onUpdateLightSensorEvent(3.0f)
- algorithm.onUpdateLightSensorEvent(4.0f)
-
- val expectedValues = listOf(1.0f, 1.0f, 2.0f, 3.0f, 4.0f)
-
- assertBundleContainsAll(algorithm.bundlesQueueLightMode[0], expectedValues)
- assertBundleContainsAll(algorithm.bundlesQueueLightMode[1], expectedValues)
- assertBundleContainsAll(algorithm.bundlesQueueDarkMode[0], expectedValues)
- assertBundleContainsAll(algorithm.bundlesQueueDarkMode[1], expectedValues)
- }
-
- @Test
- fun shouldCorrectlyEnqueueLightModeBundles() {
- assertThat(algorithm.bundlesQueueLightMode.size).isEqualTo(0)
-
- algorithm.enqueueLightModeBundle.run()
- assertThat(algorithm.bundlesQueueLightMode.size).isEqualTo(1)
-
- algorithm.enqueueLightModeBundle.run()
- assertThat(algorithm.bundlesQueueLightMode.size).isEqualTo(2)
-
- algorithm.enqueueLightModeBundle.run()
- assertThat(algorithm.bundlesQueueLightMode.size).isEqualTo(3)
-
- // Verifies dark mode bundles queue is not impacted.
- assertThat(algorithm.bundlesQueueDarkMode.size).isEqualTo(0)
- }
-
- @Test
- fun shouldCorrectlyEnqueueDarkModeBundles() {
- assertThat(algorithm.bundlesQueueDarkMode.size).isEqualTo(0)
-
- algorithm.enqueueDarkModeBundle.run()
- assertThat(algorithm.bundlesQueueDarkMode.size).isEqualTo(1)
-
- algorithm.enqueueDarkModeBundle.run()
- assertThat(algorithm.bundlesQueueDarkMode.size).isEqualTo(2)
-
- algorithm.enqueueDarkModeBundle.run()
- assertThat(algorithm.bundlesQueueDarkMode.size).isEqualTo(3)
-
- // Verifies light mode bundles queue is not impacted.
- assertThat(algorithm.bundlesQueueLightMode.size).isEqualTo(0)
- }
-
- @Test
- fun shouldCorrectlyDequeueLightModeBundles() {
- // Sets up the light mode bundles queue.
- val bundle1 = arrayListOf(1.0f, 3.0f, 6.0f, 9.0f)
- val bundle2 = arrayListOf(5.0f, 10f)
- val bundle3 = arrayListOf(2.0f, 4.0f)
- algorithm.bundlesQueueLightMode.add(bundle1)
- algorithm.bundlesQueueLightMode.add(bundle2)
- algorithm.bundlesQueueLightMode.add(bundle3)
-
- // The committed bundle should be the first one in queue.
- algorithm.dequeueLightModeBundle.run()
- assertBundleContainsAll(algorithm.bundleLightMode, bundle1)
-
- algorithm.dequeueLightModeBundle.run()
- assertBundleContainsAll(algorithm.bundleLightMode, bundle2)
-
- algorithm.dequeueLightModeBundle.run()
- assertBundleContainsAll(algorithm.bundleLightMode, bundle3)
-
- // Verifies that the dark mode bundle is not impacted.
- assertBundleContainsAll(algorithm.bundleDarkMode, listOf())
- }
-
- @Test
- fun shouldCorrectlyDequeueDarkModeBundles() {
- // Sets up the dark mode bundles queue.
- val bundle1 = arrayListOf(2.0f, 4.0f)
- val bundle2 = arrayListOf(5.0f, 10f)
- val bundle3 = arrayListOf(1.0f, 3.0f, 6.0f, 9.0f)
- algorithm.bundlesQueueDarkMode.add(bundle1)
- algorithm.bundlesQueueDarkMode.add(bundle2)
- algorithm.bundlesQueueDarkMode.add(bundle3)
-
- // The committed bundle should be the first one in queue.
- algorithm.dequeueDarkModeBundle.run()
- assertBundleContainsAll(algorithm.bundleDarkMode, bundle1)
-
- algorithm.dequeueDarkModeBundle.run()
- assertBundleContainsAll(algorithm.bundleDarkMode, bundle2)
-
- algorithm.dequeueDarkModeBundle.run()
- assertBundleContainsAll(algorithm.bundleDarkMode, bundle3)
-
- // Verifies that the light mode bundle is not impacted.
- assertBundleContainsAll(algorithm.bundleLightMode, listOf())
- }
-
- @Test
- fun shouldSetLightSensorLevelFromSensorEventUpdates() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- algorithm.start(callback)
-
- algorithm.onUpdateLightSensorEvent(1.0f)
- assertThat(algorithm.lightSensorLevel).isEqualTo(1.0f)
-
- algorithm.onUpdateLightSensorEvent(10.0f)
- assertThat(algorithm.lightSensorLevel).isEqualTo(10.0f)
-
- algorithm.onUpdateLightSensorEvent(0.0f)
- assertThat(algorithm.lightSensorLevel).isEqualTo(0.0f)
- }
-
- @Test
- fun shouldRippleFromSensorEventUpdatesDownToAmbientLightMode() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- algorithm.start(callback)
- executor.runAllReady()
-
- // Sensor event updates.
- algorithm.onUpdateLightSensorEvent(10.0f)
- algorithm.onUpdateLightSensorEvent(15.0f)
- algorithm.onUpdateLightSensorEvent(12.0f)
- algorithm.onUpdateLightSensorEvent(10.0f)
-
- // Advances time so both light and dark claims have been calculated.
- systemClock.advanceTime((mockLightModeSpan + 1).toLong())
-
- // Verifies the callback is triggered the ambient mode has changed LIGHT.
- verify(callback).onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_LIGHT)
- }
-
- @Test
- fun shouldRippleFromSensorEventUpdatesDownToAmbientDarkMode() {
- val callback = mock(AmbientLightModeMonitor.Callback::class.java)
- algorithm.start(callback)
- executor.runAllReady()
-
- // Sensor event updates.
- algorithm.onUpdateLightSensorEvent(1.0f)
- algorithm.onUpdateLightSensorEvent(0.5f)
- algorithm.onUpdateLightSensorEvent(1.2f)
- algorithm.onUpdateLightSensorEvent(0.8f)
-
- // Advances time so both light and dark claims have been calculated.
- systemClock.advanceTime((mockLightModeSpan + 1).toLong())
-
- // Verifies the callback is triggered the ambient mode has changed DARK.
- verify(callback).onChange(AmbientLightModeMonitor.AMBIENT_LIGHT_MODE_DARK)
- }
-
- // Asserts that [bundle] contains the same elements as [expected], not necessarily in the same
- // order.
- private fun assertBundleContainsAll(bundle: ArrayList<Float>, expected: Collection<Float>) {
- assertThat(bundle.size).isEqualTo(expected.size)
- assertThat(bundle.containsAll(expected))
- }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt
index 97b3b10..e606be1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt
@@ -22,6 +22,7 @@
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.test.filters.SmallTest
+import com.android.keyguard.KeyguardViewController
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.controls.controller.ControlsControllerImplTest.Companion.eq
@@ -32,7 +33,6 @@
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.animation.UniqueObjectHostView
@@ -81,7 +81,7 @@
@Mock
private lateinit var wakefulnessLifecycle: WakefulnessLifecycle
@Mock
- private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager
+ private lateinit var keyguardViewController: KeyguardViewController
@Mock
private lateinit var configurationController: ConfigurationController
@Mock
@@ -113,7 +113,7 @@
notificationLockscreenUserManager,
configurationController,
wakefulnessLifecycle,
- statusBarKeyguardViewManager,
+ keyguardViewController,
dreamOverlayStateController)
verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture())
verify(statusBarStateController).addCallback(statusBarCallback.capture())
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
index 421ae03..11326e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
@@ -59,6 +59,7 @@
private MediaDevice mMediaDevice2 = mock(MediaDevice.class);
private Icon mIcon = mock(Icon.class);
private IconCompat mIconCompat = mock(IconCompat.class);
+ private View mDialogLaunchView = mock(View.class);
private MediaOutputAdapter mMediaOutputAdapter;
private MediaOutputAdapter.MediaDeviceViewHolder mViewHolder;
@@ -245,7 +246,7 @@
mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2);
mViewHolder.mContainerLayout.performClick();
- verify(mMediaOutputController).launchBluetoothPairing();
+ verify(mMediaOutputController).launchBluetoothPairing(mViewHolder.mContainerLayout);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java
index 9f542f0..c5c4d79 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.media.session.MediaSessionManager;
import android.os.Bundle;
@@ -99,7 +100,10 @@
@Test
public void refresh_withIconCompat_iconIsVisible() {
- mIconCompat = mock(IconCompat.class);
+ mIconCompat = IconCompat.createWithBitmap(
+ Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888));
+ when(mMediaOutputBaseAdapter.getController()).thenReturn(mMediaOutputController);
+
mMediaOutputBaseDialogImpl.refresh();
final ImageView view = mMediaOutputBaseDialogImpl.mDialogView.requireViewById(
R.id.header_icon);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/nearby/NearbyMediaDevicesManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/nearby/NearbyMediaDevicesManagerTest.kt
new file mode 100644
index 0000000..f87a673
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/nearby/NearbyMediaDevicesManagerTest.kt
@@ -0,0 +1,146 @@
+package com.android.systemui.media.nearby
+
+import android.media.INearbyMediaDevicesProvider
+import android.media.INearbyMediaDevicesUpdateCallback
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import android.media.NearbyDevice
+import com.android.systemui.statusbar.CommandQueue
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+class NearbyMediaDevicesManagerTest : SysuiTestCase() {
+
+ private lateinit var manager: NearbyMediaDevicesManager
+ @Mock
+ private lateinit var commandQueue: CommandQueue
+ private lateinit var commandQueueCallbacks: CommandQueue.Callbacks
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ manager = NearbyMediaDevicesManager(commandQueue)
+
+ val callbackCaptor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java)
+ Mockito.verify(commandQueue).addCallback(callbackCaptor.capture())
+ commandQueueCallbacks = callbackCaptor.value!!
+ }
+
+ @Test
+ fun registerNearbyDevicesCallback_noProviderRegistered_noCrash() {
+ // No assert, just needs no crash
+ manager.registerNearbyDevicesCallback(object : INearbyMediaDevicesUpdateCallback.Stub() {
+ override fun onDevicesUpdated(nearbyDevices: List<NearbyDevice>) {}
+ })
+ }
+
+ @Test
+ fun registerNearbyDevicesCallback_providerRegistered_providerReceivesCallback() {
+ val provider = TestProvider()
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider)
+
+ val callback = object : INearbyMediaDevicesUpdateCallback.Stub() {
+ override fun onDevicesUpdated(nearbyDevices: List<NearbyDevice>) {}
+ }
+
+ manager.registerNearbyDevicesCallback(callback)
+
+ assertThat(provider.lastRegisteredCallback).isEqualTo(callback)
+ }
+
+ @Test
+ fun registerNearbyDevicesCallback_multipleProviders_allProvidersReceiveCallback() {
+ val provider1 = TestProvider()
+ val provider2 = TestProvider()
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider1)
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider2)
+
+ val callback = object : INearbyMediaDevicesUpdateCallback.Stub() {
+ override fun onDevicesUpdated(nearbyDevices: List<NearbyDevice>) {}
+ }
+
+ manager.registerNearbyDevicesCallback(callback)
+
+ assertThat(provider1.lastRegisteredCallback).isEqualTo(callback)
+ assertThat(provider2.lastRegisteredCallback).isEqualTo(callback)
+ }
+
+ @Test
+ fun unregisterNearbyDevicesCallback_noProviderRegistered_noCrash() {
+ // No assert, just needs no crash
+ manager.unregisterNearbyDevicesCallback(object : INearbyMediaDevicesUpdateCallback.Stub() {
+ override fun onDevicesUpdated(nearbyDevices: List<NearbyDevice>) {}
+ })
+ }
+
+ @Test
+ fun unregisterNearbyDevicesCallback_providerRegistered_providerReceivesCallback() {
+ val provider = TestProvider()
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider)
+
+ val callback = object : INearbyMediaDevicesUpdateCallback.Stub() {
+ override fun onDevicesUpdated(nearbyDevices: List<NearbyDevice>) {}
+ }
+
+ manager.unregisterNearbyDevicesCallback(callback)
+
+ assertThat(provider.lastUnregisteredCallback).isEqualTo(callback)
+ }
+
+ @Test
+ fun unregisterNearbyDevicesCallback_multipleProviders_allProvidersReceiveCallback() {
+ val provider1 = TestProvider()
+ val provider2 = TestProvider()
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider1)
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider2)
+
+ val callback = object : INearbyMediaDevicesUpdateCallback.Stub() {
+ override fun onDevicesUpdated(nearbyDevices: List<NearbyDevice>) {}
+ }
+
+ manager.unregisterNearbyDevicesCallback(callback)
+
+ assertThat(provider1.lastUnregisteredCallback).isEqualTo(callback)
+ assertThat(provider2.lastUnregisteredCallback).isEqualTo(callback)
+ }
+
+ @Test
+ fun newProviderRegisteredAfterCallbacksRegistered_providerGetsPreviouslyRegisteredCallbacks() {
+ // Start off with an existing provider and callback
+ val provider1 = TestProvider()
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider1)
+ val callback = object : INearbyMediaDevicesUpdateCallback.Stub() {
+ override fun onDevicesUpdated(nearbyDevices: List<NearbyDevice>) {}
+ }
+ manager.registerNearbyDevicesCallback(callback)
+
+ // Add a new provider
+ val provider2 = TestProvider()
+ commandQueueCallbacks.registerNearbyMediaDevicesProvider(provider2)
+
+ // Verify the new provider received the previously-registered callbacks
+ assertThat(provider2.lastRegisteredCallback).isEqualTo(callback)
+ }
+
+ private class TestProvider : INearbyMediaDevicesProvider.Stub() {
+ var lastRegisteredCallback: INearbyMediaDevicesUpdateCallback? = null
+ var lastUnregisteredCallback: INearbyMediaDevicesUpdateCallback? = null
+ override fun registerNearbyDevicesCallback(
+ callback: INearbyMediaDevicesUpdateCallback
+ ) {
+ lastRegisteredCallback = callback
+ }
+
+ override fun unregisterNearbyDevicesCallback(
+ callback: INearbyMediaDevicesUpdateCallback
+ ) {
+ lastUnregisteredCallback = callback
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/nearby/NearbyMediaDevicesServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/nearby/NearbyMediaDevicesServiceTest.kt
deleted file mode 100644
index c261086..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/media/nearby/NearbyMediaDevicesServiceTest.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-package com.android.systemui.media.nearby
-
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.shared.media.INearbyMediaDevicesProvider
-import com.android.systemui.shared.media.INearbyMediaDevicesService
-import com.android.systemui.shared.media.INearbyMediaDevicesUpdateCallback
-import com.android.systemui.shared.media.INearbyMediaDevicesUpdateCallback.RANGE_LONG
-import com.android.systemui.shared.media.INearbyMediaDevicesUpdateCallback.RANGE_WITHIN_REACH
-import com.android.systemui.shared.media.NearbyDevice
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-
-@SmallTest
-class NearbyMediaDevicesServiceTest : SysuiTestCase() {
-
- private lateinit var service: NearbyMediaDevicesService
- private lateinit var binderInterface: INearbyMediaDevicesService
-
- @Before
- fun setUp() {
- service = NearbyMediaDevicesService()
- binderInterface = INearbyMediaDevicesService.Stub.asInterface(service.onBind(null))
- }
-
- @Test
- fun getCurrentNearbyDevices_noProviderRegistered_returnsEmptyList() {
- assertThat(service.getCurrentNearbyDevices()).isEmpty()
- }
-
- @Test
- fun getCurrentNearbyDevices_providerRegistered_returnsProviderInfo() {
- val nearbyDevice1 = NearbyDevice("routeId1", RANGE_LONG)
- val nearbyDevice2 = NearbyDevice("routeId2", RANGE_WITHIN_REACH)
- val provider = object : INearbyMediaDevicesProvider.Stub() {
- override fun getCurrentNearbyDevices(): List<NearbyDevice> {
- return listOf(nearbyDevice1, nearbyDevice2)
- }
-
- override fun registerNearbyDevicesCallback(
- callback: INearbyMediaDevicesUpdateCallback?
- ) {}
- override fun unregisterNearbyDevicesCallback(
- callback: INearbyMediaDevicesUpdateCallback?
- ) {}
- }
- binderInterface.registerProvider(provider)
-
- val returnedNearbyDevices = service.getCurrentNearbyDevices()
-
- assertThat(returnedNearbyDevices).isEqualTo(listOf(nearbyDevice1, nearbyDevice2))
- }
-
- @Test
- fun registerNearbyDevicesCallback_noProviderRegistered_noCrash() {
- // No assert, just needs no crash
- service.registerNearbyDevicesCallback(object : INearbyMediaDevicesUpdateCallback.Stub() {
- override fun nearbyDeviceUpdate(routeId: String?, rangeZone: Int) {}
- })
- }
-
- @Test
- fun registerNearbyDevicesCallback_providerRegistered_providerReceivesCallback() {
- val provider = object : INearbyMediaDevicesProvider.Stub() {
- var registeredCallback: INearbyMediaDevicesUpdateCallback? = null
- override fun getCurrentNearbyDevices(): List<NearbyDevice> = listOf()
-
- override fun registerNearbyDevicesCallback(
- callback: INearbyMediaDevicesUpdateCallback?
- ) {
- registeredCallback = callback
- }
-
- override fun unregisterNearbyDevicesCallback(
- callback: INearbyMediaDevicesUpdateCallback?
- ) {}
- }
- binderInterface.registerProvider(provider)
-
- val callback = object : INearbyMediaDevicesUpdateCallback.Stub() {
- override fun nearbyDeviceUpdate(routeId: String?, rangeZone: Int) {}
- }
-
- service.registerNearbyDevicesCallback(callback)
-
- assertThat(provider.registeredCallback).isEqualTo(callback)
- }
-
- @Test
- fun unregisterNearbyDevicesCallback_noProviderRegistered_noCrash() {
- // No assert, just needs no crash
- service.unregisterNearbyDevicesCallback(object : INearbyMediaDevicesUpdateCallback.Stub() {
- override fun nearbyDeviceUpdate(routeId: String?, rangeZone: Int) {}
- })
- }
-
- @Test
- fun unregisterNearbyDevicesCallback_providerRegistered_providerReceivesCallback() {
- val provider = object : INearbyMediaDevicesProvider.Stub() {
- var unregisteredCallback: INearbyMediaDevicesUpdateCallback? = null
- override fun getCurrentNearbyDevices(): List<NearbyDevice> = listOf()
-
- override fun registerNearbyDevicesCallback(
- callback: INearbyMediaDevicesUpdateCallback?
- ) {}
-
- override fun unregisterNearbyDevicesCallback(
- callback: INearbyMediaDevicesUpdateCallback?
- ) {
- unregisteredCallback = callback
- }
- }
- binderInterface.registerProvider(provider)
-
- val callback = object : INearbyMediaDevicesUpdateCallback.Stub() {
- override fun nearbyDeviceUpdate(routeId: String?, rangeZone: Int) {}
- }
-
- service.unregisterNearbyDevicesCallback(callback)
-
- assertThat(provider.unregisteredCallback).isEqualTo(callback)
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt
index 14afece..794bc09 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt
@@ -39,7 +39,6 @@
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
-import org.junit.Ignore
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito.verify
@@ -49,7 +48,6 @@
import java.util.concurrent.Executor
@SmallTest
-@Ignore("b/216286227")
class MediaTttCommandLineHelperTest : SysuiTestCase() {
private val inlineExecutor = Executor { command -> command.run() }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
index f05d621..ea0a5a4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
@@ -18,7 +18,6 @@
import android.content.Context
import android.graphics.drawable.Drawable
-import android.graphics.drawable.Icon
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
@@ -26,10 +25,13 @@
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
+import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
-import org.junit.Ignore
import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mock
@@ -39,10 +41,12 @@
import org.mockito.MockitoAnnotations
@SmallTest
-@Ignore("b/216286227")
class MediaTttChipControllerCommonTest : SysuiTestCase() {
private lateinit var controllerCommon: MediaTttChipControllerCommon<MediaTttChipState>
+ private lateinit var fakeClock: FakeSystemClock
+ private lateinit var fakeExecutor: FakeExecutor
+
private lateinit var appIconDrawable: Drawable
@Mock
private lateinit var windowManager: WindowManager
@@ -50,8 +54,11 @@
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
- appIconDrawable = Icon.createWithResource(context, R.drawable.ic_cake).loadDrawable(context)
- controllerCommon = TestControllerCommon(context, windowManager)
+ appIconDrawable = context.getDrawable(R.drawable.ic_cake)!!
+ fakeClock = FakeSystemClock()
+ fakeExecutor = FakeExecutor(fakeClock)
+
+ controllerCommon = TestControllerCommon(context, windowManager, fakeExecutor)
}
@Test
@@ -71,6 +78,58 @@
}
@Test
+ fun displayChip_chipDoesNotDisappearsBeforeTimeout() {
+ controllerCommon.displayChip(getState())
+ reset(windowManager)
+
+ fakeClock.advanceTime(TIMEOUT_MILLIS - 1)
+
+ verify(windowManager, never()).removeView(any())
+ }
+
+ @Test
+ fun displayChip_chipDisappearsAfterTimeout() {
+ controllerCommon.displayChip(getState())
+ reset(windowManager)
+
+ fakeClock.advanceTime(TIMEOUT_MILLIS + 1)
+
+ verify(windowManager).removeView(any())
+ }
+
+ @Test
+ fun displayChip_calledAgainBeforeTimeout_timeoutReset() {
+ // First, display the chip
+ controllerCommon.displayChip(getState())
+
+ // After some time, re-display the chip
+ val waitTime = 1000L
+ fakeClock.advanceTime(waitTime)
+ controllerCommon.displayChip(getState())
+
+ // Wait until the timeout for the first display would've happened
+ fakeClock.advanceTime(TIMEOUT_MILLIS - waitTime + 1)
+
+ // Verify we didn't hide the chip
+ verify(windowManager, never()).removeView(any())
+ }
+
+ @Test
+ fun displayChip_calledAgainBeforeTimeout_eventuallyTimesOut() {
+ // First, display the chip
+ controllerCommon.displayChip(getState())
+
+ // After some time, re-display the chip
+ fakeClock.advanceTime(1000L)
+ controllerCommon.displayChip(getState())
+
+ // Ensure we still hide the chip eventually
+ fakeClock.advanceTime(TIMEOUT_MILLIS + 1)
+
+ verify(windowManager).removeView(any())
+ }
+
+ @Test
fun removeChip_chipRemoved() {
// First, add the chip
controllerCommon.displayChip(getState())
@@ -93,10 +152,10 @@
controllerCommon.displayChip(getState())
val chipView = getChipView()
- val state = MediaTttChipState(PACKAGE_NAME)
+ val state = TestChipState(PACKAGE_NAME)
controllerCommon.setIcon(state, chipView)
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
assertThat(chipView.getAppIconView().contentDescription)
.isEqualTo(state.getAppName(context))
}
@@ -113,13 +172,18 @@
inner class TestControllerCommon(
context: Context,
- windowManager: WindowManager
- ) : MediaTttChipControllerCommon<MediaTttChipState>(
- context, windowManager, R.layout.media_ttt_chip
+ windowManager: WindowManager,
+ @Main mainExecutor: DelayableExecutor,
+ ) : MediaTttChipControllerCommon<MediaTttChipState>(
+ context, windowManager, mainExecutor, R.layout.media_ttt_chip
) {
override fun updateChipView(chipState: MediaTttChipState, currentChipView: ViewGroup) {
}
}
+
+ inner class TestChipState(appPackageName: String?) : MediaTttChipState(appPackageName) {
+ override fun getAppIcon(context: Context) = appIconDrawable
+ }
}
private const val PACKAGE_NAME = "com.android.systemui"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
index 44f691c..117a6c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
@@ -17,7 +17,9 @@
package com.android.systemui.media.taptotransfer.receiver
import android.app.StatusBarManager
-import android.graphics.drawable.Icon
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageManager
+import android.graphics.drawable.Drawable
import android.media.MediaRoute2Info
import android.os.Handler
import android.view.View
@@ -28,33 +30,54 @@
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
-import org.junit.Ignore
import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mock
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
@SmallTest
-@Ignore("b/216286227")
class MediaTttChipControllerReceiverTest : SysuiTestCase() {
private lateinit var controllerReceiver: MediaTttChipControllerReceiver
@Mock
+ private lateinit var packageManager: PackageManager
+ @Mock
+ private lateinit var applicationInfo: ApplicationInfo
+ @Mock
private lateinit var windowManager: WindowManager
@Mock
private lateinit var commandQueue: CommandQueue
private lateinit var commandQueueCallback: CommandQueue.Callbacks
+ private lateinit var fakeAppIconDrawable: Drawable
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
+
+ fakeAppIconDrawable = context.getDrawable(R.drawable.ic_cake)!!
+ whenever(packageManager.getApplicationIcon(PACKAGE_NAME)).thenReturn(fakeAppIconDrawable)
+ whenever(applicationInfo.loadLabel(packageManager)).thenReturn(APP_NAME)
+ whenever(packageManager.getApplicationInfo(
+ eq(PACKAGE_NAME), any<PackageManager.ApplicationInfoFlags>()
+ )).thenReturn(applicationInfo)
+ context.setMockPackageManager(packageManager)
+
controllerReceiver = MediaTttChipControllerReceiver(
- commandQueue, context, windowManager, Handler.getMain())
+ commandQueue,
+ context,
+ windowManager,
+ FakeExecutor(FakeSystemClock()),
+ Handler.getMain()
+ )
val callbackCaptor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java)
verify(commandQueue).addCallback(callbackCaptor.capture())
@@ -113,13 +136,12 @@
controllerReceiver.displayChip(state)
- assertThat(getChipView().getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
-
+ assertThat(getChipView().getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
}
@Test
fun displayChip_hasAppIconDrawable_iconIsDrawable() {
- val drawable = Icon.createWithResource(context, R.drawable.ic_cake).loadDrawable(context)
+ val drawable = context.getDrawable(R.drawable.ic_alarm)!!
val state = ChipStateReceiver(PACKAGE_NAME, drawable, "appName")
controllerReceiver.displayChip(state)
@@ -133,13 +155,12 @@
controllerReceiver.displayChip(state)
- assertThat(getChipView().getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(getChipView().getAppIconView().contentDescription).isEqualTo(APP_NAME)
}
@Test
fun displayChip_hasAppName_iconContentDescriptionIsAppNameOverride() {
- val appName = "FakeAppName"
+ val appName = "Override App Name"
val state = ChipStateReceiver(PACKAGE_NAME, appIconDrawable = null, appName)
controllerReceiver.displayChip(state)
@@ -156,6 +177,7 @@
private fun ViewGroup.getAppIconView() = this.requireViewById<ImageView>(R.id.app_icon)
}
+private const val APP_NAME = "Fake app name"
private const val PACKAGE_NAME = "com.android.systemui"
private val routeInfo = MediaRoute2Info.Builder("id", "Test route name")
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
index dc39893..b440064 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
@@ -17,6 +17,9 @@
package com.android.systemui.media.taptotransfer.sender
import android.app.StatusBarManager
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageManager
+import android.graphics.drawable.Drawable
import android.media.MediaRoute2Info
import android.view.View
import android.view.WindowManager
@@ -28,32 +31,50 @@
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
-import org.junit.Ignore
import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mock
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
@SmallTest
-@Ignore("b/216286227")
class MediaTttChipControllerSenderTest : SysuiTestCase() {
private lateinit var controllerSender: MediaTttChipControllerSender
@Mock
+ private lateinit var packageManager: PackageManager
+ @Mock
+ private lateinit var applicationInfo: ApplicationInfo
+ @Mock
private lateinit var windowManager: WindowManager
@Mock
private lateinit var commandQueue: CommandQueue
private lateinit var commandQueueCallback: CommandQueue.Callbacks
+ private lateinit var fakeAppIconDrawable: Drawable
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
- controllerSender = MediaTttChipControllerSender(commandQueue, context, windowManager)
+
+ fakeAppIconDrawable = context.getDrawable(R.drawable.ic_cake)!!
+ whenever(applicationInfo.loadLabel(packageManager)).thenReturn(APP_NAME)
+ whenever(packageManager.getApplicationIcon(PACKAGE_NAME)).thenReturn(fakeAppIconDrawable)
+ whenever(packageManager.getApplicationInfo(
+ eq(PACKAGE_NAME), any<PackageManager.ApplicationInfoFlags>()
+ )).thenReturn(applicationInfo)
+ context.setMockPackageManager(packageManager)
+
+ controllerSender = MediaTttChipControllerSender(
+ commandQueue, context, windowManager, FakeExecutor(FakeSystemClock())
+ )
val callbackCaptor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java)
verify(commandQueue).addCallback(callbackCaptor.capture())
@@ -192,9 +213,8 @@
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
- assertThat(chipView.getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
+ assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_NAME)
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -207,9 +227,8 @@
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
- assertThat(chipView.getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
+ assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_NAME)
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -222,9 +241,8 @@
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
- assertThat(chipView.getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
+ assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_NAME)
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.VISIBLE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -237,9 +255,8 @@
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
- assertThat(chipView.getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
+ assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_NAME)
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.VISIBLE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -252,9 +269,8 @@
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
- assertThat(chipView.getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
+ assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_NAME)
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getFailureIcon().visibility).isEqualTo(View.GONE)
@@ -314,9 +330,8 @@
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
- assertThat(chipView.getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
+ assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_NAME)
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getFailureIcon().visibility).isEqualTo(View.GONE)
@@ -376,9 +391,8 @@
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
- assertThat(chipView.getAppIconView().contentDescription)
- .isEqualTo(state.getAppName(context))
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
+ assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_NAME)
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -451,15 +465,15 @@
/** Helper method providing default parameters to not clutter up the tests. */
private fun almostCloseToStartCast() =
- AlmostCloseToStartCast(PACKAGE_NAME, DEVICE_NAME)
+ AlmostCloseToStartCast(PACKAGE_NAME, OTHER_DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun almostCloseToEndCast() =
- AlmostCloseToEndCast(PACKAGE_NAME, DEVICE_NAME)
+ AlmostCloseToEndCast(PACKAGE_NAME, OTHER_DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToReceiverTriggered() =
- TransferToReceiverTriggered(PACKAGE_NAME, DEVICE_NAME)
+ TransferToReceiverTriggered(PACKAGE_NAME, OTHER_DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToThisDeviceTriggered() =
@@ -468,23 +482,24 @@
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToReceiverSucceeded(undoCallback: IUndoMediaTransferCallback? = null) =
TransferToReceiverSucceeded(
- PACKAGE_NAME, DEVICE_NAME, undoCallback
+ PACKAGE_NAME, OTHER_DEVICE_NAME, undoCallback
)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToThisDeviceSucceeded(undoCallback: IUndoMediaTransferCallback? = null) =
TransferToThisDeviceSucceeded(
- PACKAGE_NAME, DEVICE_NAME, undoCallback
+ PACKAGE_NAME, OTHER_DEVICE_NAME, undoCallback
)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferFailed() = TransferFailed(PACKAGE_NAME)
}
-private const val DEVICE_NAME = "My Tablet"
+private const val APP_NAME = "Fake app name"
+private const val OTHER_DEVICE_NAME = "My Tablet"
private const val PACKAGE_NAME = "com.android.systemui"
-private val routeInfo = MediaRoute2Info.Builder("id", "Test Name")
+private val routeInfo = MediaRoute2Info.Builder("id", OTHER_DEVICE_NAME)
.addFeature("feature")
.setPackageName(PACKAGE_NAME)
.build()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java
index 5a06048..6df56e9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java
@@ -19,6 +19,7 @@
import android.app.WallpaperColors;
import android.graphics.Color;
import android.testing.AndroidTestingRunner;
+import android.util.Log;
import androidx.test.filters.SmallTest;
@@ -29,7 +30,11 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -108,7 +113,7 @@
Style.SPRITZ /* style */);
int primaryMid = colorScheme.getAccent1().get(colorScheme.getAccent1().size() / 2);
Cam cam = Cam.fromInt(primaryMid);
- Assert.assertEquals(cam.getChroma(), 4.0, 1.0);
+ Assert.assertEquals(cam.getChroma(), 12.0, 1.0);
}
@Test
@@ -128,6 +133,41 @@
Style.EXPRESSIVE /* style */);
int neutralMid = colorScheme.getNeutral1().get(colorScheme.getNeutral1().size() / 2);
Cam cam = Cam.fromInt(neutralMid);
- Assert.assertEquals(cam.getChroma(), 16.0, 1.0);
+ Assert.assertEquals(cam.getChroma(), 12.0, 1.0);
+ }
+
+ /**
+ * Generate xml for SystemPaletteTest#testThemeStyles().
+ */
+ @Test
+ public void generateThemeStyles() {
+ StringBuilder xml = new StringBuilder();
+ for (int hue = 0; hue < 360; hue += 60) {
+ final int sourceColor = Cam.getInt(hue, 50f, 50f);
+ final String sourceColorHex = Integer.toHexString(sourceColor);
+
+ xml.append(" <theme color=\"").append(sourceColorHex).append("\">\n");
+
+ for (Style style : Style.values()) {
+ String styleName = style.name().toLowerCase();
+ ColorScheme colorScheme = new ColorScheme(sourceColor, false, style);
+ xml.append(" <").append(styleName).append(">");
+
+ List<String> colors = new ArrayList<>();
+ for (Stream<Integer> stream: Arrays.asList(colorScheme.getAccent1().stream(),
+ colorScheme.getAccent2().stream(),
+ colorScheme.getAccent3().stream(),
+ colorScheme.getNeutral1().stream(),
+ colorScheme.getNeutral2().stream())) {
+ colors.add("ffffff");
+ colors.addAll(stream.map(Integer::toHexString).map(s -> s.substring(2)).collect(
+ Collectors.toList()));
+ }
+ xml.append(String.join(",", colors));
+ xml.append("</").append(styleName).append(">\n");
+ }
+ xml.append(" </theme>\n");
+ }
+ Log.d("ColorSchemeXml", xml.toString());
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java
index 73d2b0b..bb42c12 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java
@@ -46,6 +46,7 @@
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.LightBarController;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.wm.shell.back.BackAnimation;
import com.android.wm.shell.pip.Pip;
@@ -90,6 +91,7 @@
mock(NavBarHelper.class),
mock(TaskbarDelegate.class),
mNavigationBarFactory,
+ mock(StatusBarKeyguardViewManager.class),
mock(DumpManager.class),
mock(AutoHideController.class),
mock(LightBarController.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
index 090ce43..48d3857 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
@@ -28,6 +28,7 @@
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS;
import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS;
+import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -228,7 +229,8 @@
@Test
public void testHomeLongPress() {
- mNavigationBar.onViewAttachedToWindow(mNavigationBar.createView(null));
+ mNavigationBar.onViewAttachedToWindow(mNavigationBar
+ .createView(null, /* initialVisibility= */ true));
mNavigationBar.onHomeLongClick(mNavigationBar.getView());
verify(mUiEventLogger, times(1)).log(NAVBAR_ASSIST_LONGPRESS);
@@ -241,7 +243,8 @@
.setLong(HOME_BUTTON_LONG_PRESS_DURATION_MS, 100)
.build());
when(mNavBarHelper.getLongPressHomeEnabled()).thenReturn(true);
- mNavigationBar.onViewAttachedToWindow(mNavigationBar.createView(null));
+ mNavigationBar.onViewAttachedToWindow(mNavigationBar
+ .createView(null, /* initialVisibility= */ true));
mNavigationBar.onHomeTouch(mNavigationBar.getView(), MotionEvent.obtain(
/*downTime=*/SystemClock.uptimeMillis(),
@@ -263,7 +266,8 @@
@Test
public void testRegisteredWithDispatcher() {
- mNavigationBar.onViewAttachedToWindow(mNavigationBar.createView(null));
+ mNavigationBar.onViewAttachedToWindow(mNavigationBar
+ .createView(null, /* initialVisibility= */ true));
verify(mBroadcastDispatcher).registerReceiverWithHandler(
any(BroadcastReceiver.class),
any(IntentFilter.class),
@@ -283,8 +287,8 @@
doReturn(true).when(mockShadeWindowView).isAttachedToWindow();
doNothing().when(defaultNavBar).checkNavBarModes();
doNothing().when(externalNavBar).checkNavBarModes();
- defaultNavBar.createView(null);
- externalNavBar.createView(null);
+ defaultNavBar.createView(null, /* initialVisibility= */ true);
+ externalNavBar.createView(null, /* initialVisibility= */ true);
defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
@@ -318,7 +322,7 @@
doReturn(mockShadeWindowView).when(mStatusBar).getNotificationShadeWindowView();
doReturn(true).when(mockShadeWindowView).isAttachedToWindow();
doNothing().when(mNavigationBar).checkNavBarModes();
- mNavigationBar.createView(null);
+ mNavigationBar.createView(null, /* initialVisibility= */ true);
WindowInsets windowInsets = new WindowInsets.Builder().setVisible(ime(), false).build();
doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets();
@@ -354,7 +358,7 @@
@Test
public void testA11yEventAfterDetach() {
- View v = mNavigationBar.createView(null);
+ View v = mNavigationBar.createView(null, /* initialVisibility= */ true);
mNavigationBar.onViewAttachedToWindow(v);
verify(mNavBarHelper).registerNavTaskStateUpdater(any(
NavBarHelper.NavbarTaskbarStateUpdater.class));
@@ -366,6 +370,20 @@
mNavigationBar.updateAccessibilityStateFlags();
}
+ @Test
+ public void testCreateView_initiallyVisible_viewIsVisible() {
+ mNavigationBar.createView(null, /* initialVisibility= */ true);
+
+ assertThat(mNavigationBar.getView().getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testCreateView_initiallyNotVisible_viewIsNotVisible() {
+ mNavigationBar.createView(null, /* initialVisibility= */ false);
+
+ assertThat(mNavigationBar.getView().getVisibility()).isEqualTo(View.INVISIBLE);
+ }
+
private NavigationBar createNavBar(Context context) {
DeviceProvisionedController deviceProvisionedController =
mock(DeviceProvisionedController.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
index 91a9f9e..8ce50a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
@@ -12,7 +12,6 @@
import com.android.internal.logging.MetricsLogger
import com.android.internal.logging.UiEventLogger
import com.android.internal.logging.testing.FakeMetricsLogger
-import com.android.systemui.Dependency
import com.android.systemui.R
import com.android.systemui.classifier.FalsingManagerFake
import com.android.systemui.flags.FeatureFlags
@@ -23,9 +22,7 @@
import com.android.systemui.statusbar.phone.MultiUserSwitchController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.UserInfoController
-import com.android.systemui.tuner.TunerService
import com.android.systemui.util.settings.FakeSettings
-import com.android.systemui.utils.leaks.FakeTunerService
import com.android.systemui.utils.leaks.LeakCheckedTest
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -82,8 +79,6 @@
MockitoAnnotations.initMocks(this)
testableLooper = TestableLooper.get(this)
fakeSettings = FakeSettings()
- injectLeakCheckedDependencies(*LeakCheckedTest.ALL_SUPPORTED_CLASSES)
- val fakeTunerService = Dependency.get(TunerService::class.java) as FakeTunerService
whenever(multiUserSwitchControllerFactory.create(any()))
.thenReturn(multiUserSwitchController)
@@ -95,9 +90,8 @@
controller = FooterActionsController(view, multiUserSwitchControllerFactory,
activityStarter, userManager, userTracker, userInfoController,
deviceProvisionedController, securityFooterController, fgsManagerController,
- falsingManager, metricsLogger, fakeTunerService,
- globalActionsDialog, uiEventLogger, showPMLiteButton = true, fakeSettings,
- Handler(testableLooper.looper), featureFlags)
+ falsingManager, metricsLogger, globalActionsDialog, uiEventLogger,
+ showPMLiteButton = true, fakeSettings, Handler(testableLooper.looper), featureFlags)
controller.init()
ViewUtils.attachView(view)
// View looper is the testable looper associated with the test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java
index 0d65541..a2959e2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java
@@ -136,6 +136,8 @@
private LocationController mLocationController;
@Mock
private DialogLaunchAnimator mDialogLaunchAnimator;
+ @Mock
+ private View mDialogLaunchView;
private TestableResources mTestableResources;
private InternetDialogController mInternetDialogController;
@@ -384,7 +386,8 @@
@Test
public void launchWifiNetworkDetailsSetting_withNoWifiEntryKey_doNothing() {
- mInternetDialogController.launchWifiNetworkDetailsSetting(null /* key */);
+ mInternetDialogController.launchWifiNetworkDetailsSetting(null /* key */,
+ mDialogLaunchView);
verify(mActivityStarter, never())
.postStartActivityDismissingKeyguard(any(Intent.class), anyInt());
@@ -392,9 +395,11 @@
@Test
public void launchWifiNetworkDetailsSetting_withWifiEntryKey_startActivity() {
- mInternetDialogController.launchWifiNetworkDetailsSetting("wifi_entry_key");
+ mInternetDialogController.launchWifiNetworkDetailsSetting("wifi_entry_key",
+ mDialogLaunchView);
- verify(mActivityStarter).postStartActivityDismissingKeyguard(any(Intent.class), anyInt());
+ verify(mActivityStarter).postStartActivityDismissingKeyguard(any(Intent.class), anyInt(),
+ any());
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java
index ed35dcb..cf97bda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java
@@ -458,7 +458,8 @@
public void onClickSeeMoreButton_clickSeeAll_verifyLaunchNetworkSetting() {
mSeeAll.performClick();
- verify(mInternetDialogController).launchNetworkSetting();
+ verify(mInternetDialogController).launchNetworkSetting(
+ mDialogView.requireViewById(R.id.see_all_layout));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt
index 8695b29..030c65a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/user/UserSwitchDialogControllerTest.kt
@@ -21,6 +21,7 @@
import android.provider.Settings
import android.testing.AndroidTestingRunner
import android.view.View
+import android.widget.Button
import androidx.test.filters.SmallTest
import com.android.internal.logging.UiEventLogger
import com.android.systemui.SysuiTestCase
@@ -63,6 +64,8 @@
@Mock
private lateinit var launchView: View
@Mock
+ private lateinit var neutralButton: Button
+ @Mock
private lateinit var dialogLaunchAnimator: DialogLaunchAnimator
@Mock
private lateinit var uiEventLogger: UiEventLogger
@@ -130,14 +133,17 @@
controller.showDialog(launchView)
- verify(dialog).setNeutralButton(anyInt(), capture(clickCaptor))
+ verify(dialog)
+ .setNeutralButton(anyInt(), capture(clickCaptor), eq(false) /* dismissOnClick */)
+ `when`(dialog.getButton(DialogInterface.BUTTON_NEUTRAL)).thenReturn(neutralButton)
clickCaptor.value.onClick(dialog, DialogInterface.BUTTON_NEUTRAL)
verify(activityStarter)
.postStartActivityDismissingKeyguard(
argThat(IntentMatcher(Settings.ACTION_USER_SETTINGS)),
- eq(0)
+ eq(0),
+ eq(null)
)
verify(uiEventLogger).log(QSUserSwitcherEvent.QS_USER_MORE_SETTINGS)
}
@@ -148,7 +154,8 @@
controller.showDialog(launchView)
- verify(dialog).setNeutralButton(anyInt(), capture(clickCaptor))
+ verify(dialog)
+ .setNeutralButton(anyInt(), capture(clickCaptor), eq(false) /* dismissOnClick */)
clickCaptor.value.onClick(dialog, DialogInterface.BUTTON_NEUTRAL)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
index d13451d..03c22b3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
@@ -155,4 +155,19 @@
mIconView.getIcon(largeIcon);
// no crash? good
}
-}
\ No newline at end of file
+
+ @Test
+ public void testNullIcon() {
+ Icon mockIcon = mock(Icon.class);
+ when(mockIcon.loadDrawableAsUser(any(), anyInt())).thenReturn(null);
+ mStatusBarIcon.icon = mockIcon;
+ mIconView.set(mStatusBarIcon);
+
+ Bitmap bitmap = Bitmap.createBitmap(60, 60, Bitmap.Config.ARGB_8888);
+ Icon icon = Icon.createWithBitmap(bitmap);
+ StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage",
+ icon, 0, 0, "");
+ mIconView.getIcon(largeIcon);
+ // No crash? good
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt
index ecc2a1b..b4cae38 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt
@@ -63,6 +63,7 @@
commandRegistry, batteryController, configurationController,
featureFlags, context, windowManager, systemClock, uiEventLogger)
controller.rippleView = rippleView // Replace the real ripple view with a mock instance
+ controller.registerCallbacks()
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java
index 9f152e1..b7b3088 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java
@@ -56,6 +56,7 @@
@Before
public void setUp() throws Exception {
super.setUp();
+ allowTestableLooperAsMainThread();
when(mWifiInfo.makeCopy(anyLong())).thenReturn(mWifiInfo);
when(mWifiInfo.isPrimary()).thenReturn(true);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt
index 3820b98..3b908b4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt
@@ -20,10 +20,14 @@
import android.view.Choreographer
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.withArgCaptor
+import dagger.BindsInstance
+import dagger.Component
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,8 +45,10 @@
whenever(it.executeDelayed(any(), anyLong())).thenReturn(timeoueSubscription)
}
- val pipelineChoreographer: NotifPipelineChoreographer = NotifPipelineChoreographerModule
- .provideChoreographer(viewChoreographer, executor)
+ val pipelineChoreographer: NotifPipelineChoreographer =
+ DaggerNotifPipelineChoreographerTestComponent.factory()
+ .create(viewChoreographer, executor)
+ .choreographer
@Test
fun scheduleThenEvalFrameCallback() {
@@ -97,4 +103,19 @@
verify(viewChoreographer).removeFrameCallback(frameCallback)
verify(timeoueSubscription).run()
}
+}
+
+@SysUISingleton
+@Component(modules = [NotifPipelineChoreographerModule::class])
+interface NotifPipelineChoreographerTestComponent {
+
+ val choreographer: NotifPipelineChoreographer
+
+ @Component.Factory
+ interface Factory {
+ fun create(
+ @BindsInstance viewChoreographer: Choreographer,
+ @BindsInstance @Main executor: DelayableExecutor
+ ): NotifPipelineChoreographerTestComponent
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt
index 3f84c16..a2d8e3d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt
@@ -28,13 +28,16 @@
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable
import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.withArgCaptor
+import dagger.BindsInstance
+import dagger.Component
import org.junit.Test
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
@@ -50,9 +53,16 @@
val statusBarStateController: StatusBarStateController = mock()
val keyguardStateController: KeyguardStateController = mock()
- val coordinator: SensitiveContentCoordinator = SensitiveContentCoordinatorModule
- .provideCoordinator(dynamicPrivacyController, lockscreenUserManager,
- keyguardUpdateMonitor, statusBarStateController, keyguardStateController)
+ val coordinator: SensitiveContentCoordinator =
+ DaggerTestSensitiveContentCoordinatorComponent
+ .factory()
+ .create(
+ dynamicPrivacyController,
+ lockscreenUserManager,
+ keyguardUpdateMonitor,
+ statusBarStateController,
+ keyguardStateController)
+ .coordinator
@Test
fun onDynamicPrivacyChanged_invokeInvalidationListener() {
@@ -238,4 +248,21 @@
override fun getRepresentativeEntry(): NotificationEntry = mockEntry
}
}
+}
+
+@CoordinatorScope
+@Component(modules = [SensitiveContentCoordinatorModule::class])
+interface TestSensitiveContentCoordinatorComponent {
+ val coordinator: SensitiveContentCoordinator
+
+ @Component.Factory
+ interface Factory {
+ fun create(
+ @BindsInstance dynamicPrivacyController: DynamicPrivacyController,
+ @BindsInstance lockscreenUserManager: NotificationLockscreenUserManager,
+ @BindsInstance keyguardUpdateMonitor: KeyguardUpdateMonitor,
+ @BindsInstance statusBarStateController: StatusBarStateController,
+ @BindsInstance keyguardStateController: KeyguardStateController
+ ): TestSensitiveContentCoordinatorComponent
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
index f6eff82..479c271 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
@@ -100,8 +100,6 @@
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentService;
-import com.android.systemui.idle.IdleHostViewController;
-import com.android.systemui.idle.dagger.IdleViewComponent;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.media.KeyguardMediaController;
import com.android.systemui.media.MediaDataManager;
@@ -266,12 +264,6 @@
@Mock
private KeyguardUserSwitcherController mKeyguardUserSwitcherController;
@Mock
- private IdleViewComponent.Factory mIdleViewComponentFactory;
- @Mock
- private IdleViewComponent mIdleViewComponent;
- @Mock
- private IdleHostViewController mIdleHostViewController;
- @Mock
private KeyguardStatusViewComponent mKeyguardStatusViewComponent;
@Mock
private KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory;
@@ -475,10 +467,6 @@
.thenReturn(mCommunalViewComponent);
when(mCommunalViewComponent.getCommunalHostViewController())
.thenReturn(mCommunalHostViewController);
- when(mIdleViewComponentFactory.build(any()))
- .thenReturn(mIdleViewComponent);
- when(mIdleViewComponent.getIdleHostViewController())
- .thenReturn(mIdleHostViewController);
when(mLayoutInflater.inflate(eq(R.layout.keyguard_status_view), any(), anyBoolean()))
.thenReturn(mKeyguardStatusView);
when(mLayoutInflater.inflate(eq(R.layout.keyguard_user_switcher), any(), anyBoolean()))
@@ -523,7 +511,6 @@
mKeyguardUserSwitcherComponentFactory,
mKeyguardStatusBarViewComponentFactory,
mCommunalViewComponentFactory,
- mIdleViewComponentFactory,
mLockscreenShadeTransitionController,
mGroupManager,
mNotificationAreaController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt
index 12e71af..34a5d4b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt
@@ -24,6 +24,7 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollectorFake
import com.android.systemui.dock.DockManager
+import com.android.systemui.lowlightclock.LowLightClockController
import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.NotificationShadeDepthController
import com.android.systemui.statusbar.NotificationShadeWindowController
@@ -38,11 +39,13 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.Mockito.anyFloat
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
+import java.util.Optional
import org.mockito.Mockito.`when` as whenever
@RunWith(AndroidTestingRunner::class)
@@ -79,6 +82,8 @@
private lateinit var mLockIconViewController: LockIconViewController
@Mock
private lateinit var mPhoneStatusBarViewController: PhoneStatusBarViewController
+ @Mock
+ private lateinit var mLowLightClockController: LowLightClockController
private lateinit var mInteractionEventHandlerCaptor: ArgumentCaptor<InteractionEventHandler>
private lateinit var mInteractionEventHandler: InteractionEventHandler
@@ -101,7 +106,8 @@
stackScrollLayoutController,
mStatusBarKeyguardViewManager,
mStatusBarWindowStateController,
- mLockIconViewController
+ mLockIconViewController,
+ Optional.of(mLowLightClockController)
)
mController.setupExpandedStatusBar()
mController.setService(mStatusBar, mNotificationShadeWindowController)
@@ -235,6 +241,31 @@
verify(mPhoneStatusBarViewController).sendTouchToView(nextEvent)
assertThat(returnVal).isTrue()
}
+
+ @Test
+ fun testLowLightClockAttachedWhenExpandedStatusBarSetup() {
+ verify(mLowLightClockController).attachLowLightClockView(ArgumentMatchers.any())
+ }
+
+ @Test
+ fun testLowLightClockShownWhenDozing() {
+ mController.setDozing(true)
+ verify(mLowLightClockController).showLowLightClock(true)
+ }
+
+ @Test
+ fun testLowLightClockDozeTimeTickCalled() {
+ mController.dozeTimeTick()
+ verify(mLowLightClockController).dozeTimeTick()
+ }
+
+ @Test
+ fun testLowLightClockHiddenWhenNotDozing() {
+ mController.setDozing(true)
+ verify(mLowLightClockController).showLowLightClock(true)
+ mController.setDozing(false)
+ verify(mLowLightClockController).showLowLightClock(false)
+ }
}
private val downEv = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
index d885da8..6c33113 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
@@ -37,6 +37,7 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingCollectorFake;
import com.android.systemui.dock.DockManager;
+import com.android.systemui.lowlightclock.LowLightClockController;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.NotificationShadeDepthController;
@@ -56,6 +57,8 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.Optional;
+
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
@@ -79,6 +82,7 @@
@Mock private StatusBarWindowStateController mStatusBarWindowStateController;
@Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController;
@Mock private LockIconViewController mLockIconViewController;
+ @Mock private LowLightClockController mLowLightClockController;
@Captor private ArgumentCaptor<NotificationShadeWindowView.InteractionEventHandler>
mInteractionEventHandlerCaptor;
@@ -110,7 +114,8 @@
mNotificationStackScrollLayoutController,
mStatusBarKeyguardViewManager,
mStatusBarWindowStateController,
- mLockIconViewController);
+ mLockIconViewController,
+ Optional.of(mLowLightClockController));
mController.setupExpandedStatusBar();
mController.setService(mStatusBar, mNotificationShadeWindowController);
mController.setDragDownHelper(mDragDownHelper);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 107ba81..8b93de5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -53,6 +53,7 @@
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.unfold.SysUIUnfoldComponent;
import org.junit.Before;
import org.junit.Test;
@@ -60,6 +61,8 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.Optional;
+
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -100,6 +103,8 @@
@Mock
private ShadeController mShadeController;
@Mock
+ private SysUIUnfoldComponent mSysUiUnfoldComponent;
+ @Mock
private DreamOverlayStateController mDreamOverlayStateController;
@Mock
private LatencyTracker mLatencyTracker;
@@ -130,6 +135,7 @@
mock(NotificationMediaManager.class),
mKeyguardBouncerFactory,
mKeyguardMessageAreaFactory,
+ Optional.of(mSysUiUnfoldComponent),
() -> mShadeController,
mLatencyTracker);
mStatusBarKeyguardViewManager.registerStatusBar(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index a7809c2..c7db9e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -116,6 +116,7 @@
import com.android.systemui.statusbar.PulseExpansionHandler;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateControllerImpl;
+import com.android.systemui.statusbar.charging.WiredChargingRippleController;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
@@ -288,6 +289,7 @@
@Mock private InteractionJankMonitor mJankMonitor;
@Mock private DeviceStateManager mDeviceStateManager;
@Mock private DreamOverlayStateController mDreamOverlayStateController;
+ @Mock private WiredChargingRippleController mWiredChargingRippleController;
private ShadeController mShadeController;
private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
private FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock);
@@ -479,7 +481,8 @@
mNotifPipelineFlags,
mJankMonitor,
mDeviceStateManager,
- mDreamOverlayStateController);
+ mDreamOverlayStateController,
+ mWiredChargingRippleController);
when(mKeyguardViewMediator.registerStatusBar(
any(StatusBar.class),
any(NotificationPanelViewController.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
index f5554c5..9f9cb40 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
@@ -205,6 +205,12 @@
mTestableLooper.processAllMessages();
verify(callback, times(1)).onLocationActiveChanged(false);
+
+ when(mAppOpsController.getActiveAppOps()).thenReturn(ImmutableList.of());
+ mLocationController.onActiveStateChanged(AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION, 0,
+ "com.google.android.googlequicksearchbox", true);
+ mTestableLooper.processAllMessages();
+ verify(callback, times(1)).onLocationActiveChanged(true);
}
@Test
diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
index cd53227..66fc2ae 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
@@ -30,6 +30,9 @@
<!-- Controls whether the navigation bar lets through taps. -->
<bool name="config_navBarTapThrough">true</bool>
+ <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
+ <bool name="config_imeDrawsImeNavBar">true</bool>
+
<!-- Controls the size of the back gesture inset. -->
<dimen name="config_backGestureInset">30dp</dimen>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
index 88cb74d79..120a489 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
@@ -30,6 +30,9 @@
<!-- Controls whether the navigation bar lets through taps. -->
<bool name="config_navBarTapThrough">true</bool>
+ <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
+ <bool name="config_imeDrawsImeNavBar">true</bool>
+
<!-- Controls the size of the back gesture inset. -->
<dimen name="config_backGestureInset">40dp</dimen>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
index 70c41d0..c18d892 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
@@ -30,6 +30,9 @@
<!-- Controls whether the navigation bar lets through taps. -->
<bool name="config_navBarTapThrough">true</bool>
+ <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
+ <bool name="config_imeDrawsImeNavBar">true</bool>
+
<!-- Controls the size of the back gesture inset. -->
<dimen name="config_backGestureInset">18dp</dimen>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
index de26394..877b5f8 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
@@ -30,6 +30,9 @@
<!-- Controls whether the navigation bar lets through taps. -->
<bool name="config_navBarTapThrough">true</bool>
+ <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
+ <bool name="config_imeDrawsImeNavBar">true</bool>
+
<!-- Controls the size of the back gesture inset. -->
<dimen name="config_backGestureInset">32dp</dimen>
diff --git a/services/Android.bp b/services/Android.bp
index e010469..2e4405f 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -24,6 +24,7 @@
"-Xep:ArrayHashCode:ERROR",
"-Xep:SelfAssignment:ERROR",
"-Xep:ArrayEquals:ERROR",
+ "-Xep:IdentityBinaryExpression:ERROR",
// NOTE: only enable to generate local patchfiles
// "-XepPatchChecks:refaster:frameworks/base/errorprone/refaster/EfficientXml.java.refaster",
// "-XepPatchLocation:/tmp/refaster/",
@@ -53,7 +54,9 @@
SYSTEM_OPTIMIZE_JAVA: {
optimize: {
enabled: true,
- optimize: true,
+ // TODO(b/210510433): Enable optimizations after improving
+ // retracing infra.
+ optimize: false,
shrink: true,
proguard_flags_files: ["proguard.flags"],
},
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
index b70ffb2..c376bf8 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
@@ -78,6 +78,7 @@
private static final boolean DEBUG = false;
private static final String TAG = "MagnificationController";
+
private final AccessibilityManagerService mAms;
private final PointF mTempPoint = new PointF();
private final Object mLock;
@@ -194,11 +195,10 @@
*/
public void transitionMagnificationModeLocked(int displayId, int targetMode,
@NonNull TransitionCallBack transitionCallBack) {
- final PointF magnificationCenter = getCurrentMagnificationBoundsCenterLocked(displayId,
- targetMode);
+ final PointF currentCenter = getCurrentMagnificationCenterLocked(displayId, targetMode);
final DisableMagnificationCallback animationCallback =
getDisableMagnificationEndRunnableLocked(displayId);
- if (magnificationCenter == null && animationCallback == null) {
+ if (currentCenter == null && animationCallback == null) {
transitionCallBack.onResult(displayId, true);
return;
}
@@ -213,7 +213,7 @@
}
}
- if (magnificationCenter == null) {
+ if (currentCenter == null) {
Slog.w(TAG, "Invalid center, ignore it");
transitionCallBack.onResult(displayId, true);
return;
@@ -221,10 +221,10 @@
final FullScreenMagnificationController screenMagnificationController =
getFullScreenMagnificationController();
final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr();
- final float scale = mScaleProvider.getScale(displayId);
+ final float scale = getTargetModeScaleFromCurrentMagnification(displayId, targetMode);
final DisableMagnificationCallback animationEndCallback =
new DisableMagnificationCallback(transitionCallBack, displayId, targetMode,
- scale, magnificationCenter, true);
+ scale, currentCenter, true);
if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
screenMagnificationController.reset(displayId, animationEndCallback);
} else {
@@ -247,17 +247,20 @@
*/
public void transitionMagnificationConfigMode(int displayId, MagnificationConfig config,
boolean animate, int id) {
+ if (DEBUG) {
+ Slog.d(TAG, "transitionMagnificationConfigMode displayId = " + displayId
+ + ", config = " + config);
+ }
synchronized (mLock) {
final int targetMode = config.getMode();
- final PointF currentBoundsCenter = getCurrentMagnificationBoundsCenterLocked(displayId,
- targetMode);
+ final PointF currentCenter = getCurrentMagnificationCenterLocked(displayId, targetMode);
final PointF magnificationCenter = new PointF(config.getCenterX(), config.getCenterY());
- if (currentBoundsCenter != null) {
+ if (currentCenter != null) {
final float centerX = Float.isNaN(config.getCenterX())
- ? currentBoundsCenter.x
+ ? currentCenter.x
: config.getCenterX();
final float centerY = Float.isNaN(config.getCenterY())
- ? currentBoundsCenter.y
+ ? currentCenter.y
: config.getCenterY();
magnificationCenter.set(centerX, centerY);
}
@@ -272,24 +275,36 @@
final FullScreenMagnificationController screenMagnificationController =
getFullScreenMagnificationController();
final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr();
- final float scale = mScaleProvider.getScale(displayId);
+ final float targetScale = Float.isNaN(config.getScale())
+ ? getTargetModeScaleFromCurrentMagnification(displayId, targetMode)
+ : config.getScale();
if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
screenMagnificationController.reset(displayId, false);
windowMagnificationMgr.enableWindowMagnification(displayId,
- scale, magnificationCenter.x, magnificationCenter.y,
+ targetScale, magnificationCenter.x, magnificationCenter.y,
animate ? STUB_ANIMATION_CALLBACK : null, id);
} else if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) {
windowMagnificationMgr.disableWindowMagnification(displayId, false, null);
if (!screenMagnificationController.isRegistered(displayId)) {
screenMagnificationController.register(displayId);
}
- screenMagnificationController.setScaleAndCenter(displayId, scale,
+ screenMagnificationController.setScaleAndCenter(displayId, targetScale,
magnificationCenter.x, magnificationCenter.y, animate,
id);
}
}
}
+ // We assume the target mode is different from the current mode, and there is only
+ // two modes, so we get the target scale from another mode.
+ private float getTargetModeScaleFromCurrentMagnification(int displayId, int targetMode) {
+ if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
+ return getFullScreenMagnificationController().getScale(displayId);
+ } else {
+ return getWindowMagnificationMgr().getScale(displayId);
+ }
+ }
+
/**
* Return {@code true} if disable magnification animation callback of the display is running.
*
@@ -384,7 +399,7 @@
public void onSourceBoundsChanged(int displayId, Rect bounds) {
final MagnificationConfig config = new MagnificationConfig.Builder()
.setMode(MAGNIFICATION_MODE_WINDOW)
- .setScale(mScaleProvider.getScale(displayId))
+ .setScale(getWindowMagnificationMgr().getScale(displayId))
.setCenterX(bounds.exactCenterX())
.setCenterY(bounds.exactCenterY()).build();
mAms.notifyMagnificationChanged(displayId, new Region(bounds), config);
@@ -607,8 +622,7 @@
}
}
- private @Nullable
- PointF getCurrentMagnificationBoundsCenterLocked(int displayId, int targetMode) {
+ private @Nullable PointF getCurrentMagnificationCenterLocked(int displayId, int targetMode) {
if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) {
if (mWindowMagnificationMgr == null
|| !mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId)) {
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java
index 9eb77b4..175182c 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java
@@ -26,6 +26,7 @@
import android.accessibilityservice.MagnificationConfig;
import android.annotation.NonNull;
import android.graphics.Region;
+import android.util.Slog;
import android.view.Display;
import java.io.PrintWriter;
@@ -56,6 +57,9 @@
*/
public class MagnificationProcessor {
+ private static final String TAG = "MagnificationProcessor";
+ private static final boolean DEBUG = false;
+
private final MagnificationController mController;
public MagnificationProcessor(MagnificationController controller) {
@@ -103,6 +107,9 @@
*/
public boolean setMagnificationConfig(int displayId, @NonNull MagnificationConfig config,
boolean animate, int id) {
+ if (DEBUG) {
+ Slog.d(TAG, "setMagnificationConfig config=" + config);
+ }
if (transitionModeIfNeeded(displayId, config, animate, id)) {
return true;
}
@@ -125,15 +132,13 @@
}
private boolean setScaleAndCenterForFullScreenMagnification(int displayId, float scale,
- float centerX, float centerY,
- boolean animate, int id) {
+ float centerX, float centerY, boolean animate, int id) {
+
if (!isRegistered(displayId)) {
register(displayId);
}
return mController.getFullScreenMagnificationController().setScaleAndCenter(
- displayId,
- scale,
- centerX, centerY, animate, id);
+ displayId, scale, centerX, centerY, animate, id);
}
/**
@@ -143,8 +148,12 @@
private boolean transitionModeIfNeeded(int displayId, MagnificationConfig config,
boolean animate, int id) {
int currentMode = getControllingMode(displayId);
- if (currentMode == config.getMode()
- || !mController.hasDisableMagnificationCallback(displayId)) {
+ if (config.getMode() == MagnificationConfig.MAGNIFICATION_MODE_DEFAULT) {
+ return false;
+ }
+ // Target mode is as same as current mode and is not transitioning.
+ if (currentMode == config.getMode() && !mController.hasDisableMagnificationCallback(
+ displayId)) {
return false;
}
mController.transitionMagnificationConfigMode(displayId, config, animate, id);
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java
index 278f3f9..89910ea 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java
@@ -177,6 +177,9 @@
* @param connection {@link IWindowMagnificationConnection}
*/
public void setConnection(@Nullable IWindowMagnificationConnection connection) {
+ if (DBG) {
+ Slog.d(TAG, "setConnection :" + connection);
+ }
synchronized (mLock) {
// Reset connectionWrapper.
if (mConnectionWrapper != null) {
@@ -223,6 +226,9 @@
* @return {@code true} if {@link IWindowMagnificationConnection} state is going to change.
*/
public boolean requestConnection(boolean connect) {
+ if (DBG) {
+ Slog.d(TAG, "requestConnection :" + connect);
+ }
synchronized (mLock) {
if (connect == isConnected()) {
return false;
@@ -485,10 +491,6 @@
final boolean enabled;
boolean previousEnabled;
synchronized (mLock) {
- if (mConnectionWrapper == null) {
- Slog.w(TAG, "enableWindowMagnification failed: connection null");
- return false;
- }
WindowMagnifier magnifier = mWindowMagnifiers.get(displayId);
if (magnifier == null) {
magnifier = createWindowMagnifier(displayId);
@@ -528,10 +530,10 @@
final boolean disabled;
synchronized (mLock) {
WindowMagnifier magnifier = mWindowMagnifiers.get(displayId);
- if (magnifier == null || mConnectionWrapper == null) {
- Slog.w(TAG, "disableWindowMagnification failed: connection " + mConnectionWrapper);
+ if (magnifier == null) {
return false;
}
+
disabled = magnifier.disableWindowMagnificationInternal(animationCallback);
if (clear) {
mWindowMagnifiers.delete(displayId);
@@ -1018,25 +1020,33 @@
}
}
+ @GuardedBy("mLock")
private boolean enableWindowMagnificationInternal(int displayId, float scale, float centerX,
float centerY, float magnificationFrameOffsetRatioX,
float magnificationFrameOffsetRatioY,
MagnificationAnimationCallback animationCallback) {
- synchronized (mLock) {
- return mConnectionWrapper != null && mConnectionWrapper.enableWindowMagnification(
- displayId, scale, centerX, centerY,
- magnificationFrameOffsetRatioX, magnificationFrameOffsetRatioY,
- animationCallback);
+ if (mConnectionWrapper == null) {
+ Slog.w(TAG, "enableWindowMagnificationInternal mConnectionWrapper is null");
+ return false;
}
+ return mConnectionWrapper.enableWindowMagnification(
+ displayId, scale, centerX, centerY,
+ magnificationFrameOffsetRatioX, magnificationFrameOffsetRatioY,
+ animationCallback);
}
private boolean setScaleInternal(int displayId, float scale) {
return mConnectionWrapper != null && mConnectionWrapper.setScale(displayId, scale);
}
+ @GuardedBy("mLock")
private boolean disableWindowMagnificationInternal(int displayId,
MagnificationAnimationCallback animationCallback) {
- return mConnectionWrapper != null && mConnectionWrapper.disableWindowMagnification(
+ if (mConnectionWrapper == null) {
+ Slog.w(TAG, "mConnectionWrapper is null");
+ return false;
+ }
+ return mConnectionWrapper.disableWindowMagnification(
displayId, animationCallback);
}
diff --git a/services/autofill/OWNERS b/services/autofill/OWNERS
index c52751d..edfb211 100644
--- a/services/autofill/OWNERS
+++ b/services/autofill/OWNERS
@@ -1 +1 @@
-include /core/java/android/service/autofill/OWNERS
+include /core/java/android/view/autofill/OWNERS
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 76ee728..e0fa67f 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -103,7 +103,6 @@
import android.util.SparseArray;
import android.util.TimeUtils;
import android.view.KeyEvent;
-import android.view.accessibility.AccessibilityManager;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillManager.SmartSuggestionMode;
@@ -367,8 +366,6 @@
@Nullable
private ClientSuggestionsSession mClientSuggestionsSession;
- private final AccessibilityManager mAccessibilityManager;
-
// TODO(b/216576510): Share one BroadcastReceiver between all Sessions instead of creating a
// new one per Session.
private final BroadcastReceiver mDelayedFillBroadcastReceiver =
@@ -518,10 +515,7 @@
return;
}
- // If a11y touch exploration is enabled, then we do not send an inline fill request
- // to the regular af service, because dropdown UI is easier to use.
- if (mPendingInlineSuggestionsRequest.isServiceSupported()
- && !mAccessibilityManager.isTouchExplorationEnabled()) {
+ if (mPendingInlineSuggestionsRequest.isServiceSupported()) {
mPendingFillRequest = new FillRequest(mPendingFillRequest.getId(),
mPendingFillRequest.getFillContexts(),
mPendingFillRequest.getClientState(),
@@ -1064,7 +1058,6 @@
mRemoteFillService = serviceComponentName == null ? null
: new RemoteFillService(context, serviceComponentName, userId, this,
bindInstantServiceAllowed);
- mAccessibilityManager = AccessibilityManager.getInstance(context);
mActivityToken = activityToken;
mHasCallback = hasCallback;
mUiLatencyHistory = uiLatencyHistory;
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index efa026b..e10151d 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -137,6 +137,8 @@
import com.android.server.backup.utils.BackupObserverUtils;
import com.android.server.backup.utils.SparseArrayUtils;
+import dalvik.annotation.optimization.NeverCompile;
+
import com.google.android.collect.Sets;
import java.io.BufferedInputStream;
@@ -4072,6 +4074,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
private void dumpInternal(PrintWriter pw) {
// Add prefix for only non-system users so that system user dumpsys is the same as before
String userPrefix = mUserId == UserHandle.USER_SYSTEM ? "" : "User " + mUserId + ":";
diff --git a/services/companion/java/com/android/server/companion/CompanionApplicationController.java b/services/companion/java/com/android/server/companion/CompanionApplicationController.java
index be1bc79..c39b59a 100644
--- a/services/companion/java/com/android/server/companion/CompanionApplicationController.java
+++ b/services/companion/java/com/android/server/companion/CompanionApplicationController.java
@@ -26,6 +26,7 @@
import android.content.Context;
import android.os.Handler;
import android.util.Log;
+import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -120,6 +121,12 @@
mBoundCompanionApplications.setValueForPackage(userId, packageName, serviceConnectors);
}
+ if (serviceConnectors.isEmpty()) {
+ Slog.e(TAG, "Can't find CompanionDeviceService implementer in package: "
+ + packageName + ". Please check if they are correctly declared.");
+ return;
+ }
+
// The first connector in the list is always the primary connector: set a listener to it.
serviceConnectors.get(0).setListener(this::onPrimaryServiceBindingDied);
diff --git a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java
index a771e7b..b026990 100644
--- a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java
+++ b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java
@@ -21,6 +21,8 @@
import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED;
import static android.bluetooth.BluetoothAdapter.EXTRA_PREVIOUS_STATE;
import static android.bluetooth.BluetoothAdapter.EXTRA_STATE;
+import static android.bluetooth.BluetoothAdapter.STATE_BLE_ON;
+import static android.bluetooth.BluetoothAdapter.STATE_ON;
import static android.bluetooth.BluetoothAdapter.nameForState;
import static android.bluetooth.le.ScanCallback.SCAN_FAILED_ALREADY_STARTED;
import static android.bluetooth.le.ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED;
@@ -232,8 +234,14 @@
return;
}
- mBleScanner.stopScan(mScanCallback);
mScanning = false;
+
+ if (mBtAdapter.getState() != STATE_ON && mBtAdapter.getState() != STATE_BLE_ON) {
+ Log.d(TAG, "BT Adapter is not turned ON");
+ return;
+ }
+
+ mBleScanner.stopScan(mScanCallback);
}
@MainThread
diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
index 4afa96c..bc1f28d 100644
--- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
+++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
@@ -37,6 +37,7 @@
import android.view.Display;
import android.window.DisplayWindowPolicyController;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.BlockedAppStreamingActivity;
import java.util.List;
@@ -75,9 +76,11 @@
private final ArraySet<ComponentName> mAllowedActivities;
@Nullable
private final ArraySet<ComponentName> mBlockedActivities;
+ private final Object mGenericWindowPolicyControllerLock = new Object();
private Consumer<ActivityInfo> mActivityBlockedCallback;
@NonNull
+ @GuardedBy("mGenericWindowPolicyControllerLock")
final ArraySet<Integer> mRunningUids = new ArraySet<>();
@Nullable private final ActivityListener mActivityListener;
private final Handler mHandler = new Handler(Looper.getMainLooper());
@@ -149,11 +152,13 @@
@Override
public void onRunningAppsChanged(ArraySet<Integer> runningUids) {
- mRunningUids.clear();
- mRunningUids.addAll(runningUids);
- if (mActivityListener != null && mRunningUids.isEmpty()) {
- // Post callback on the main thread so it doesn't block activity launching
- mHandler.post(() -> mActivityListener.onDisplayEmpty(Display.INVALID_DISPLAY));
+ synchronized (mGenericWindowPolicyControllerLock) {
+ mRunningUids.clear();
+ mRunningUids.addAll(runningUids);
+ if (mActivityListener != null && mRunningUids.isEmpty()) {
+ // Post callback on the main thread so it doesn't block activity launching
+ mHandler.post(() -> mActivityListener.onDisplayEmpty(Display.INVALID_DISPLAY));
+ }
}
if (mRunningAppsChangedListener != null) {
mRunningAppsChangedListener.onRunningAppsChanged(runningUids);
@@ -165,7 +170,9 @@
* this controller.
*/
boolean containsUid(int uid) {
- return mRunningUids.contains(uid);
+ synchronized (mGenericWindowPolicyControllerLock) {
+ return mRunningUids.contains(uid);
+ }
}
private boolean canContainActivity(ActivityInfo activityInfo, int windowFlags,
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index 387d911..c0a904f 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -235,6 +235,10 @@
});
mPerDisplayWakelocks.clear();
}
+ if (mVirtualAudioController != null) {
+ mVirtualAudioController.stopListening();
+ mVirtualAudioController = null;
+ }
}
mListener.onClose(mAssociationInfo.getId());
mAppToken.unlinkToDeath(this, 0);
diff --git a/services/core/java/com/android/server/BinaryTransparencyService.java b/services/core/java/com/android/server/BinaryTransparencyService.java
index 6c220f6..6986d3b 100644
--- a/services/core/java/com/android/server/BinaryTransparencyService.java
+++ b/services/core/java/com/android/server/BinaryTransparencyService.java
@@ -36,16 +36,12 @@
import com.android.internal.os.IBinaryTransparencyService;
import com.android.internal.util.FrameworkStatsLog;
-import java.io.File;
import java.io.FileDescriptor;
-import java.io.IOException;
import java.io.PrintWriter;
-import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
@@ -261,7 +257,6 @@
pw.println("");
}
} catch (PackageManager.NameNotFoundException e) {
- pw.println(packageName);
pw.println(packageName
+ ";ERROR:Unable to find PackageInfo for this module.");
if (verbose) {
@@ -370,13 +365,10 @@
// we are only interested in doing things at PHASE_BOOT_COMPLETED
if (phase == PHASE_BOOT_COMPLETED) {
+ // due to potentially long computation that holds up boot time, apex sha computations
+ // are deferred to first call
Slog.i(TAG, "Boot completed. Getting VBMeta Digest.");
getVBMetaDigestInformation();
-
- // due to potentially long computation that may hold up boot time, SHA256 computations
- // for APEXs and Modules will be executed via threads.
- Slog.i(TAG, "Executing APEX & Module digest computations");
- computeApexAndModuleDigests();
}
}
@@ -386,12 +378,6 @@
FrameworkStatsLog.write(FrameworkStatsLog.VBMETA_DIGEST_REPORTED, mVbmetaDigest);
}
- private void computeApexAndModuleDigests() {
- // using Executors will allow the computations to be done asynchronously, thus not holding
- // up boot time.
- Executors.defaultThreadFactory().newThread(() -> updateBinaryMeasurements()).start();
- }
-
@NonNull
private List<PackageInfo> getInstalledApexs() {
List<PackageInfo> results = new ArrayList<PackageInfo>();
@@ -445,7 +431,7 @@
entry.setValue(packageInfo.lastUpdateTime);
// compute the digest for the updated package
- String sha256digest = computeSha256DigestOfFile(
+ String sha256digest = PackageUtils.computeSha256DigestForLargeFile(
packageInfo.applicationInfo.sourceDir);
if (sha256digest == null) {
Slog.e(TAG, "Failed to compute SHA256sum for file at "
@@ -482,7 +468,7 @@
ApplicationInfo appInfo = packageInfo.applicationInfo;
// compute SHA256 for these APEXs
- String sha256digest = computeSha256DigestOfFile(appInfo.sourceDir);
+ String sha256digest = PackageUtils.computeSha256DigestForLargeFile(appInfo.sourceDir);
if (sha256digest == null) {
Slog.e(TAG, String.format("Failed to compute SHA256 digest for %s",
packageInfo.packageName));
@@ -517,7 +503,8 @@
ApplicationInfo appInfo = packageInfo.applicationInfo;
// compute SHA256 digest for these modules
- String sha256digest = computeSha256DigestOfFile(appInfo.sourceDir);
+ String sha256digest = PackageUtils.computeSha256DigestForLargeFile(
+ appInfo.sourceDir);
if (sha256digest == null) {
Slog.e(TAG, String.format("Failed to compute SHA256 digest for %s",
packageName));
@@ -536,16 +523,4 @@
}
}
- @Nullable
- private String computeSha256DigestOfFile(@NonNull String pathToFile) {
- File apexFile = new File(pathToFile);
-
- try {
- byte[] apexFileBytes = Files.readAllBytes(apexFile.toPath());
- return PackageUtils.computeSha256Digest(apexFileBytes);
- } catch (IOException e) {
- Slog.e(TAG, String.format("I/O error occurs when reading from %s", pathToFile));
- return null;
- }
- }
}
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index 8e53101..16ff167 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -18,6 +18,7 @@
import static android.app.ActivityManager.UID_OBSERVER_ACTIVE;
import static android.app.ActivityManager.UID_OBSERVER_GONE;
+import static android.os.Process.SYSTEM_UID;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -261,6 +262,37 @@
}
}
+ /** Returns information about pinned files and sizes for StatsPullAtomService. */
+ public List<PinnedFileStats> dumpDataForStatsd() {
+ List<PinnedFileStats> pinnedFileStats = new ArrayList<>();
+ synchronized (PinnerService.this) {
+ for (PinnedFile pinnedFile : mPinnedFiles) {
+ pinnedFileStats.add(new PinnedFileStats(SYSTEM_UID, pinnedFile));
+ }
+
+ for (int key : mPinnedApps.keySet()) {
+ PinnedApp app = mPinnedApps.get(key);
+ for (PinnedFile pinnedFile : mPinnedApps.get(key).mFiles) {
+ pinnedFileStats.add(new PinnedFileStats(app.uid, pinnedFile));
+ }
+ }
+ }
+ return pinnedFileStats;
+ }
+
+ /** Wrapper class for statistics for a pinned file. */
+ public static class PinnedFileStats {
+ public final int uid;
+ public final String filename;
+ public final int sizeKb;
+
+ protected PinnedFileStats(int uid, PinnedFile file) {
+ this.uid = uid;
+ this.filename = file.fileName.substring(file.fileName.lastIndexOf('/') + 1);
+ this.sizeKb = file.bytesPinned / 1024;
+ }
+ }
+
/**
* Handler for on start pinning message
*/
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 811f2f5..efbc4de 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -103,6 +103,8 @@
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.am.BatteryStatsService;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -2879,6 +2881,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
@@ -3016,14 +3019,32 @@
intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
intent.putExtra(PHONE_CONSTANTS_SLOT_KEY, phoneId);
intent.putExtra(SubscriptionManager.EXTRA_SLOT_INDEX, phoneId);
+
// Send the broadcast twice -- once for all apps with READ_PHONE_STATE, then again
- // for all apps with READ_PRIV but not READ_PHONE_STATE. This ensures that any app holding
- // either READ_PRIV or READ_PHONE get this broadcast exactly once.
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL, Manifest.permission.READ_PHONE_STATE);
- mContext.createContextAsUser(UserHandle.ALL, 0)
- .sendBroadcastMultiplePermissions(intent,
- new String[] { Manifest.permission.READ_PRIVILEGED_PHONE_STATE },
- new String[] { Manifest.permission.READ_PHONE_STATE });
+ // for all apps with READ_PRIVILEGED_PHONE_STATE but not READ_PHONE_STATE.
+ // Do this again twice, the first time for apps with ACCESS_FINE_LOCATION, then again with
+ // the location-sanitized service state for all apps without ACCESS_FINE_LOCATION.
+ // This ensures that any app holding either READ_PRIVILEGED_PHONE_STATE or READ_PHONE_STATE
+ // get this broadcast exactly once, and we are not exposing location without permission.
+ mContext.createContextAsUser(UserHandle.ALL, 0).sendBroadcastMultiplePermissions(intent,
+ new String[] {Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.ACCESS_FINE_LOCATION});
+ mContext.createContextAsUser(UserHandle.ALL, 0).sendBroadcastMultiplePermissions(intent,
+ new String[] {Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ Manifest.permission.ACCESS_FINE_LOCATION},
+ new String[] {Manifest.permission.READ_PHONE_STATE});
+
+ // Replace bundle with location-sanitized ServiceState
+ data = new Bundle();
+ state.createLocationInfoSanitizedCopy(true).fillInNotifierBundle(data);
+ intent.putExtras(data);
+ mContext.createContextAsUser(UserHandle.ALL, 0).sendBroadcastMultiplePermissions(intent,
+ new String[] {Manifest.permission.READ_PHONE_STATE},
+ new String[] {Manifest.permission.ACCESS_FINE_LOCATION});
+ mContext.createContextAsUser(UserHandle.ALL, 0).sendBroadcastMultiplePermissions(intent,
+ new String[] {Manifest.permission.READ_PRIVILEGED_PHONE_STATE},
+ new String[] {Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.ACCESS_FINE_LOCATION});
}
private void broadcastSignalStrengthChanged(SignalStrength signalStrength, int phoneId,
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index c236a7f..569d480 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -43,6 +43,7 @@
import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.app.UiModeManager;
+import android.app.UiModeManager.NightModeCustomReturnType;
import android.app.UiModeManager.NightModeCustomType;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -111,6 +112,9 @@
// Enable launching of applications when entering the dock.
private static final boolean ENABLE_LAUNCH_DESK_DOCK_APP = true;
private static final String SYSTEM_PROPERTY_DEVICE_THEME = "persist.sys.theme";
+ @VisibleForTesting
+ public static final Set<Integer> SUPPORTED_NIGHT_MODE_CUSTOM_TYPES = new ArraySet(
+ new Integer[]{MODE_NIGHT_CUSTOM_TYPE_SCHEDULE, MODE_NIGHT_CUSTOM_TYPE_BEDTIME});
private final Injector mInjector;
private final Object mLock = new Object();
@@ -631,6 +635,8 @@
+ "permission ENTER_CAR_MODE_PRIORITIZED");
}
+ assertLegit(callingPackage);
+
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
@@ -671,6 +677,9 @@
// mode flag to be specified; this is so that the user can disable car mode at all
// priorities using the persistent notification.
boolean isSystemCaller = mInjector.getCallingUid() == Process.SYSTEM_UID;
+ if (!isSystemCaller) {
+ assertLegit(callingPackage);
+ }
final int carModeFlags =
isSystemCaller ? flags : flags & ~UiModeManager.DISABLE_CAR_MODE_ALL_PRIORITIES;
@@ -728,8 +737,13 @@
case UiModeManager.MODE_NIGHT_NO:
case UiModeManager.MODE_NIGHT_YES:
case MODE_NIGHT_AUTO:
- case MODE_NIGHT_CUSTOM:
break;
+ case MODE_NIGHT_CUSTOM:
+ if (SUPPORTED_NIGHT_MODE_CUSTOM_TYPES.contains(customModeType)) {
+ break;
+ }
+ throw new IllegalArgumentException(
+ "Can't set the custom type to " + customModeType);
default:
throw new IllegalArgumentException("Unknown mode: " + mode);
}
@@ -783,7 +797,7 @@
}
@Override
- public int getNightModeCustomType() {
+ public @NightModeCustomReturnType int getNightModeCustomType() {
if (getContext().checkCallingOrSelfPermission(
android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
!= PackageManager.PERMISSION_GRANTED) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index e2e53cb..5fe8719 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -46,6 +46,8 @@
import com.android.internal.annotations.GuardedBy;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
@@ -1430,6 +1432,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
void dump(PrintWriter pw) {
pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) "
+ Settings.Global.ACTIVITY_MANAGER_CONSTANTS + ":");
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 2371101..6c39a11 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -188,6 +188,7 @@
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.app.PendingIntentStats;
import android.app.ProcessMemoryState;
import android.app.ProfilerInfo;
import android.app.SyncNotedAppOp;
@@ -414,6 +415,7 @@
import com.android.server.wm.WindowManagerService;
import com.android.server.wm.WindowProcessController;
+import dalvik.annotation.optimization.NeverCompile;
import dalvik.system.VMRuntime;
import libcore.util.EmptyArray;
@@ -5614,15 +5616,29 @@
synchronized (mProcLock) {
synchronized (mPidsSelfLocked) {
+ int newestTimeIndex = -1;
+ long newestTime = Long.MIN_VALUE;
for (int i = 0; i < pids.length; i++) {
ProcessRecord pr = mPidsSelfLocked.get(pids[i]);
if (pr != null) {
- final boolean isPendingTop =
- mPendingStartActivityUids.isPendingTopPid(pr.uid, pids[i]);
- states[i] = isPendingTop ? PROCESS_STATE_TOP : pr.mState.getCurProcState();
- if (scores != null) {
- scores[i] = isPendingTop
- ? (ProcessList.FOREGROUND_APP_ADJ - 1) : pr.mState.getCurAdj();
+ final long pendingTopTime =
+ mPendingStartActivityUids.getPendingTopPidTime(pr.uid, pids[i]);
+ if (pendingTopTime != PendingStartActivityUids.INVALID_TIME) {
+ // The uid in mPendingStartActivityUids gets the TOP process state.
+ states[i] = PROCESS_STATE_TOP;
+ if (scores != null) {
+ // The uid in mPendingStartActivityUids gets a better score.
+ scores[i] = ProcessList.FOREGROUND_APP_ADJ - 1;
+ }
+ if (pendingTopTime > newestTime) {
+ newestTimeIndex = i;
+ newestTime = pendingTopTime;
+ }
+ } else {
+ states[i] = pr.mState.getCurProcState();
+ if (scores != null) {
+ scores[i] = pr.mState.getCurAdj();
+ }
}
} else {
states[i] = PROCESS_STATE_NONEXISTENT;
@@ -5631,6 +5647,13 @@
}
}
}
+ // The uid with the newest timestamp in mPendingStartActivityUids gets the best
+ // score.
+ if (newestTimeIndex != -1) {
+ if (scores != null) {
+ scores[newestTimeIndex] = ProcessList.FOREGROUND_APP_ADJ - 2;
+ }
+ }
}
}
}
@@ -6658,6 +6681,7 @@
reportCurWakefulnessUsageEvent();
mActivityTaskManager.onScreenAwakeChanged(isAwake);
mOomAdjProfiler.onWakefulnessChanged(wakefulness);
+ mOomAdjuster.onWakefulnessChanged(wakefulness);
}
updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
@@ -9153,6 +9177,7 @@
/**
* Wrapper function to print out debug data filtered by specified arguments.
*/
+ @NeverCompile // Avoid size overhead of debugging code.
private void doDump(FileDescriptor fd, PrintWriter pw, String[] args, boolean useProto) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
@@ -9687,6 +9712,7 @@
return needSep;
}
+ @NeverCompile // Avoid size overhead of debugging code.
@GuardedBy({"this", "mProcLock"})
void dumpOtherProcessesInfoLSP(FileDescriptor fd, PrintWriter pw,
boolean dumpAll, String dumpPackage, int dumpAppId, int numPers, boolean needSep) {
@@ -10808,6 +10834,7 @@
boolean dumpProto;
}
+ @NeverCompile // Avoid size overhead of debugging code.
final void dumpApplicationMemoryUsage(FileDescriptor fd, PrintWriter pw, String prefix,
String[] args, boolean brief, PrintWriter categoryPw, boolean asProto) {
MemoryUsageDumpOptions opts = new MemoryUsageDumpOptions();
@@ -10890,6 +10917,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
private final void dumpApplicationMemoryUsage(FileDescriptor fd, PrintWriter pw, String prefix,
MemoryUsageDumpOptions opts, final String[] innerArgs, boolean brief,
ArrayList<ProcessRecord> procs, PrintWriter categoryPw) {
@@ -11539,6 +11567,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
private final void dumpApplicationMemoryUsage(FileDescriptor fd,
MemoryUsageDumpOptions opts, final String[] innerArgs, boolean brief,
ArrayList<ProcessRecord> procs) {
@@ -15952,6 +15981,11 @@
implements ActivityManagerLocal {
@Override
+ public List<PendingIntentStats> getPendingIntentStats() {
+ return mPendingIntentController.dumpPendingIntentStatsForStatsd();
+ }
+
+ @Override
public Pair<String, String> getAppProfileStatsForDebugging(long time, int lines) {
return mAppProfiler.getAppProfileStatsForDebugging(time, lines);
}
@@ -17149,6 +17183,11 @@
// It's a CopyOnWriteArrayList, so no lock is needed.
mBindServiceEventListeners.add(listener);
}
+
+ @Override
+ public void restart() {
+ ActivityManagerService.this.restart();
+ }
}
long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 08508b2..bcde343 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -107,6 +107,8 @@
import com.android.server.compat.PlatformCompat;
import com.android.server.utils.Slogf;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
@@ -3309,6 +3311,7 @@
dumpHelp(pw, mDumping);
}
+ @NeverCompile // Avoid size overhead of debugging code.
static void dumpHelp(PrintWriter pw, boolean dumping) {
if (dumping) {
pw.println("Activity manager dump options:");
diff --git a/services/core/java/com/android/server/am/AnrHelper.java b/services/core/java/com/android/server/am/AnrHelper.java
index 34d9a60..1e1024e 100644
--- a/services/core/java/com/android/server/am/AnrHelper.java
+++ b/services/core/java/com/android/server/am/AnrHelper.java
@@ -60,6 +60,10 @@
*/
private long mLastAnrTimeMs = 0L;
+ /** The pid which is running appNotResponding(). */
+ @GuardedBy("mAnrRecords")
+ private int mProcessingPid = -1;
+
AnrHelper(final ActivityManagerService service) {
mService = service;
}
@@ -73,7 +77,18 @@
void appNotResponding(ProcessRecord anrProcess, String activityShortComponentName,
ApplicationInfo aInfo, String parentShortComponentName,
WindowProcessController parentProcess, boolean aboveSystem, String annotation) {
+ final int incomingPid = anrProcess.mPid;
synchronized (mAnrRecords) {
+ if (mProcessingPid == incomingPid) {
+ Slog.i(TAG, "Skip duplicated ANR, pid=" + incomingPid + " " + annotation);
+ return;
+ }
+ for (int i = mAnrRecords.size() - 1; i >= 0; i--) {
+ if (mAnrRecords.get(i).mPid == incomingPid) {
+ Slog.i(TAG, "Skip queued ANR, pid=" + incomingPid + " " + annotation);
+ return;
+ }
+ }
mAnrRecords.add(new AnrRecord(anrProcess, activityShortComponentName, aInfo,
parentShortComponentName, parentProcess, aboveSystem, annotation));
}
@@ -87,8 +102,8 @@
}
/**
- * The thread to execute {@link ProcessRecord#appNotResponding}. It will terminate if all
- * records are handled.
+ * The thread to execute {@link ProcessErrorStateRecord#appNotResponding}. It will terminate if
+ * all records are handled.
*/
private class AnrConsumerThread extends Thread {
AnrConsumerThread() {
@@ -97,7 +112,12 @@
private AnrRecord next() {
synchronized (mAnrRecords) {
- return mAnrRecords.isEmpty() ? null : mAnrRecords.remove(0);
+ if (mAnrRecords.isEmpty()) {
+ return null;
+ }
+ final AnrRecord record = mAnrRecords.remove(0);
+ mProcessingPid = record.mPid;
+ return record;
}
}
@@ -106,6 +126,13 @@
AnrRecord r;
while ((r = next()) != null) {
scheduleBinderHeavyHitterAutoSamplerIfNecessary();
+ final int currentPid = r.mApp.mPid;
+ if (currentPid != r.mPid) {
+ // The process may have restarted or died.
+ Slog.i(TAG, "Skip ANR with mismatched pid=" + r.mPid + ", current pid="
+ + currentPid);
+ continue;
+ }
final long startTime = SystemClock.uptimeMillis();
// If there are many ANR at the same time, the latency may be larger. If the latency
// is too large, the stack trace might not be meaningful.
@@ -120,6 +147,7 @@
mRunning.set(false);
synchronized (mAnrRecords) {
+ mProcessingPid = -1;
// The race should be unlikely to happen. Just to make sure we don't miss.
if (!mAnrRecords.isEmpty()) {
startAnrConsumerIfNeeded();
@@ -139,6 +167,7 @@
private static class AnrRecord {
final ProcessRecord mApp;
+ final int mPid;
final String mActivityShortComponentName;
final String mParentShortComponentName;
final String mAnnotation;
@@ -151,6 +180,7 @@
ApplicationInfo aInfo, String parentShortComponentName,
WindowProcessController parentProcess, boolean aboveSystem, String annotation) {
mApp = anrProcess;
+ mPid = anrProcess.mPid;
mActivityShortComponentName = activityShortComponentName;
mParentShortComponentName = parentShortComponentName;
mAnnotation = annotation;
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 6c1a00d..97dd323 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -1018,6 +1018,7 @@
Settings.Secure.SHOW_FIRST_CRASH_DIALOG_DEV_OPTION,
0,
mService.mUserController.getCurrentUserId()) != 0;
+ final String packageName = proc.info.packageName;
final boolean crashSilenced = mAppsNotReportingCrashes != null
&& mAppsNotReportingCrashes.contains(proc.info.packageName);
final long now = SystemClock.uptimeMillis();
@@ -1026,6 +1027,7 @@
if ((mService.mAtmInternal.canShowErrorDialogs() || showBackground)
&& !crashSilenced && !shouldThottle
&& (showFirstCrash || showFirstCrashDevOption || data.repeating)) {
+ Slog.i(TAG, "Showing crash dialog for package " + packageName + " u" + userId);
errState.getDialogController().showCrashDialogs(data);
if (!proc.isolated) {
mProcessCrashShowDialogTimes.put(proc.processName, proc.uid, now);
diff --git a/services/core/java/com/android/server/am/AppFGSTracker.java b/services/core/java/com/android/server/am/AppFGSTracker.java
index 5ac5a70..075402f 100644
--- a/services/core/java/com/android/server/am/AppFGSTracker.java
+++ b/services/core/java/com/android/server/am/AppFGSTracker.java
@@ -560,20 +560,22 @@
int changes = serviceTypes ^ mForegroundServiceTypes;
for (int serviceType = Integer.highestOneBit(changes); serviceType != 0;) {
final int i = foregroundServiceTypeToIndex(serviceType);
- if ((serviceTypes & serviceType) != 0) {
- // Start this type.
- if (mEvents[i] == null) {
- mEvents[i] = new LinkedList<>();
- }
- if (!isActive(i)) {
- mEvents[i].add(new BaseTimeEvent(now));
- notifyListenersOnStateChangeIfNecessary(true, now, serviceType);
- }
- } else {
- // Stop this type.
- if (mEvents[i] != null && isActive(i)) {
- mEvents[i].add(new BaseTimeEvent(now));
- notifyListenersOnStateChangeIfNecessary(false, now, serviceType);
+ if (i < mEvents.length) {
+ if ((serviceTypes & serviceType) != 0) {
+ // Start this type.
+ if (mEvents[i] == null) {
+ mEvents[i] = new LinkedList<>();
+ }
+ if (!isActive(i)) {
+ mEvents[i].add(new BaseTimeEvent(now));
+ notifyListenersOnStateChangeIfNecessary(true, now, serviceType);
+ }
+ } else {
+ // Stop this type.
+ if (mEvents[i] != null && isActive(i)) {
+ mEvents[i].add(new BaseTimeEvent(now));
+ notifyListenersOnStateChangeIfNecessary(false, now, serviceType);
+ }
}
}
changes &= ~serviceType;
diff --git a/services/core/java/com/android/server/am/AppPermissionTracker.java b/services/core/java/com/android/server/am/AppPermissionTracker.java
index 7f48d52..69f70ca 100644
--- a/services/core/java/com/android/server/am/AppPermissionTracker.java
+++ b/services/core/java/com/android/server/am/AppPermissionTracker.java
@@ -64,6 +64,8 @@
@GuardedBy("mLock")
private SparseArray<ArraySet<String>> mUidGrantedPermissionsInMonitor = new SparseArray<>();
+ private volatile boolean mLockedBootCompleted = false;
+
AppPermissionTracker(Context context, AppRestrictionController controller) {
this(context, controller, null, null);
}
@@ -85,20 +87,20 @@
final PackageManagerInternal pmi = mInjector.getPackageManagerInternal();
final PermissionManagerServiceInternal pm = mInjector.getPermissionManagerServiceInternal();
final String[] permissions = mInjector.getPolicy().getBgPermissionsInMonitor();
+ final SparseArray<ArraySet<String>> uidPerms = mUidGrantedPermissionsInMonitor;
for (int userId : allUsers) {
final List<ApplicationInfo> apps = pmi.getInstalledApplications(0, userId, SYSTEM_UID);
if (apps == null) {
continue;
}
- synchronized (mLock) {
- final SparseArray<ArraySet<String>> uidPerms = mUidGrantedPermissionsInMonitor;
- final long now = SystemClock.elapsedRealtime();
- for (int i = 0, size = apps.size(); i < size; i++) {
- final ApplicationInfo ai = apps.get(i);
- for (String permission : permissions) {
- if (pm.checkUidPermission(ai.uid, permission) != PERMISSION_GRANTED) {
- continue;
- }
+ final long now = SystemClock.elapsedRealtime();
+ for (int i = 0, size = apps.size(); i < size; i++) {
+ final ApplicationInfo ai = apps.get(i);
+ for (String permission : permissions) {
+ if (pm.checkUidPermission(ai.uid, permission) != PERMISSION_GRANTED) {
+ continue;
+ }
+ synchronized (mLock) {
ArraySet<String> grantedPermissions = uidPerms.get(ai.uid);
if (grantedPermissions == null) {
grantedPermissions = new ArraySet<String>();
@@ -132,25 +134,30 @@
private void handlePermissionsChanged(int uid) {
final String[] permissions = mInjector.getPolicy().getBgPermissionsInMonitor();
if (permissions != null && permissions.length > 0) {
+ final PermissionManagerServiceInternal pm =
+ mInjector.getPermissionManagerServiceInternal();
+ final boolean[] states = new boolean[permissions.length];
+ for (int i = 0; i < permissions.length; i++) {
+ states[i] = pm.checkUidPermission(uid, permissions[i]) == PERMISSION_GRANTED;
+ if (DEBUG_PERMISSION_TRACKER) {
+ Slog.i(TAG, UserHandle.formatUid(uid) + " " + permissions[i] + "=" + states[i]);
+ }
+ }
synchronized (mLock) {
- handlePermissionsChangedLocked(uid);
+ handlePermissionsChangedLocked(uid, permissions, states);
}
}
}
@GuardedBy("mLock")
- private void handlePermissionsChangedLocked(int uid) {
- final PermissionManagerServiceInternal pm = mInjector.getPermissionManagerServiceInternal();
+ private void handlePermissionsChangedLocked(int uid, String[] permissions, boolean[] states) {
final int index = mUidGrantedPermissionsInMonitor.indexOfKey(uid);
ArraySet<String> grantedPermissions = index >= 0
? mUidGrantedPermissionsInMonitor.valueAt(index) : null;
- final String[] permissions = mInjector.getPolicy().getBgPermissionsInMonitor();
final long now = SystemClock.elapsedRealtime();
- for (String permission: permissions) {
- boolean granted = pm.checkUidPermission(uid, permission) == PERMISSION_GRANTED;
- if (DEBUG_PERMISSION_TRACKER) {
- Slog.i(TAG, UserHandle.formatUid(uid) + " " + permission + "=" + granted);
- }
+ for (int i = 0; i < permissions.length; i++) {
+ final String permission = permissions[i];
+ final boolean granted = states[i];
boolean changed = false;
if (granted) {
if (grantedPermissions == null) {
@@ -200,6 +207,10 @@
}
private void onPermissionTrackerEnabled(boolean enabled) {
+ if (!mLockedBootCompleted) {
+ // Not ready, bail out.
+ return;
+ }
final PermissionManager pm = mInjector.getPermissionManager();
if (enabled) {
pm.addOnPermissionsChangeListener(this);
@@ -211,6 +222,12 @@
}
@Override
+ void onLockedBootCompleted() {
+ mLockedBootCompleted = true;
+ onPermissionTrackerEnabled(mInjector.getPolicy().isEnabled());
+ }
+
+ @Override
void dump(PrintWriter pw, String prefix) {
pw.print(prefix);
pw.println("APP PERMISSIONS TRACKER:");
diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java
index 1129c19..2ffd487 100644
--- a/services/core/java/com/android/server/am/AppRestrictionController.java
+++ b/services/core/java/com/android/server/am/AppRestrictionController.java
@@ -71,6 +71,7 @@
import static android.os.PowerExemptionManager.REASON_SYSTEM_UID;
import static android.os.PowerExemptionManager.reasonCodeToString;
import static android.os.Process.SYSTEM_UID;
+import static android.os.Process.THREAD_PRIORITY_BACKGROUND;
import static com.android.internal.notification.SystemNotificationChannels.ABUSIVE_BACKGROUND_APPS;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
@@ -792,7 +793,7 @@
mInjector = injector;
mContext = injector.getContext();
mActivityManagerService = service;
- mBgHandlerThread = new HandlerThread("bgres-controller");
+ mBgHandlerThread = new HandlerThread("bgres-controller", THREAD_PRIORITY_BACKGROUND);
mBgHandlerThread.start();
mBgHandler = new BgHandler(mBgHandlerThread.getLooper(), injector);
mBgExecutor = new HandlerExecutor(mBgHandler);
@@ -816,9 +817,11 @@
mInjector.getAppStandbyInternal().addListener(mAppIdleStateChangeListener);
mInjector.getRoleManager().addOnRoleHoldersChangedListenerAsUser(mBgExecutor,
mRoleHolderChangedListener, UserHandle.ALL);
- for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
- mAppStateTrackers.get(i).onSystemReady();
- }
+ mInjector.scheduleInitTrackers(mBgHandler, () -> {
+ for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
+ mAppStateTrackers.get(i).onSystemReady();
+ }
+ });
}
@VisibleForTesting
@@ -2137,6 +2140,10 @@
}
return null;
}
+
+ void scheduleInitTrackers(Handler handler, Runnable initializers) {
+ handler.post(initializers);
+ }
}
private void registerForSystemBroadcasts() {
@@ -2221,6 +2228,21 @@
userFilter.addAction(Intent.ACTION_USER_REMOVED);
userFilter.addAction(Intent.ACTION_UID_REMOVED);
mContext.registerReceiverForAllUsers(broadcastReceiver, userFilter, null, mBgHandler);
+ final BroadcastReceiver bootReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ switch (intent.getAction()) {
+ case Intent.ACTION_LOCKED_BOOT_COMPLETED: {
+ onLockedBootCompleted();
+ } break;
+ }
+ }
+ };
+ final IntentFilter bootFilter = new IntentFilter();
+ bootFilter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
+ mContext.registerReceiverAsUser(bootReceiver, UserHandle.SYSTEM,
+ bootFilter, null, mBgHandler);
}
void forEachTracker(Consumer<BaseAppStateTracker> sink) {
@@ -2275,6 +2297,12 @@
mRestrictionSettings.removeUid(uid);
}
+ private void onLockedBootCompleted() {
+ for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
+ mAppStateTrackers.get(i).onLockedBootCompleted();
+ }
+ }
+
boolean isBgAutoRestrictedBucketFeatureFlagEnabled() {
return mConstantsObserver.mBgAutoRestrictedBucket;
}
diff --git a/services/core/java/com/android/server/am/BaseAppStateTracker.java b/services/core/java/com/android/server/am/BaseAppStateTracker.java
index 482d697..0fada53 100644
--- a/services/core/java/com/android/server/am/BaseAppStateTracker.java
+++ b/services/core/java/com/android/server/am/BaseAppStateTracker.java
@@ -204,6 +204,12 @@
}
/**
+ * Called when the system sends LOCKED_BOOT_COMPLETED.
+ */
+ void onLockedBootCompleted() {
+ }
+
+ /**
* Called when a device config property in the activity manager namespace
* has changed.
*/
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 7af73eb..86ca699 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -28,6 +28,7 @@
import android.os.Debug;
import android.os.Handler;
import android.os.Message;
+import android.os.PowerManagerInternal;
import android.os.Process;
import android.os.SystemClock;
import android.os.Trace;
@@ -1051,6 +1052,15 @@
}
}
+ void onWakefulnessChanged(int wakefulness) {
+ if(wakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE) {
+ // Remove any pending compaction we may have scheduled to happen while screen was off
+ Slog.e(TAG_AM, "Cancel pending or running compactions as system is awake");
+ mPendingCompactionProcesses.clear();
+ cancelCompaction();
+ }
+ }
+
@GuardedBy({"mService", "mProcLock"})
void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) {
// Cancel any currently executing compactions
@@ -1105,6 +1115,9 @@
int lastOomAdj = msg.arg1;
int procState = msg.arg2;
synchronized (mProcLock) {
+ if(mPendingCompactionProcesses.isEmpty()) {
+ return;
+ }
proc = mPendingCompactionProcesses.remove(0);
opt = proc.mOptRecord;
diff --git a/services/core/java/com/android/server/am/DataConnectionStats.java b/services/core/java/com/android/server/am/DataConnectionStats.java
index f0910dc..4c96078 100644
--- a/services/core/java/com/android/server/am/DataConnectionStats.java
+++ b/services/core/java/com/android/server/am/DataConnectionStats.java
@@ -73,7 +73,8 @@
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SIM_STATE_CHANGED);
- mContext.registerReceiver(this, filter, null /* broadcastPermission */, mListenerHandler);
+ mContext.registerReceiver(this, filter, null /* broadcastPermission */, mListenerHandler,
+ Context.RECEIVER_NOT_EXPORTED);
}
@Override
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 6c9187a..8d77eda 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2470,6 +2470,10 @@
}
}
+ void onWakefulnessChanged(int wakefulness) {
+ mCachedAppOptimizer.onWakefulnessChanged(wakefulness);
+ }
+
/** Applies the computed oomadj, procstate and sched group values and freezes them in set* */
@GuardedBy({"mService", "mProcLock"})
private boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now,
diff --git a/services/core/java/com/android/server/am/PendingIntentController.java b/services/core/java/com/android/server/am/PendingIntentController.java
index c49e696..7ee96aa 100644
--- a/services/core/java/com/android/server/am/PendingIntentController.java
+++ b/services/core/java/com/android/server/am/PendingIntentController.java
@@ -28,6 +28,7 @@
import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
import android.app.PendingIntent;
+import android.app.PendingIntentStats;
import android.content.IIntentSender;
import android.content.Intent;
import android.os.Binder;
@@ -60,6 +61,7 @@
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
/**
* Helper class for {@link ActivityManagerService} responsible for managing pending intents.
@@ -422,6 +424,55 @@
}
/**
+ * Provides some stats tracking of the current state of the PendingIntent queue.
+ *
+ * Data about the pending intent queue is intended to be used for memory impact tracking.
+ * Returned data (one per uid) will consist of instances of PendingIntentStats containing
+ * (I) number of PendingIntents and (II) total size of all bundled extras in the PIs.
+ *
+ * @hide
+ */
+ public List<PendingIntentStats> dumpPendingIntentStatsForStatsd() {
+ List<PendingIntentStats> pendingIntentStats = new ArrayList<>();
+
+ synchronized (mLock) {
+ if (mIntentSenderRecords.size() > 0) {
+ // First, aggregate PendingIntent data by package uid.
+ final SparseIntArray countsByUid = new SparseIntArray();
+ final SparseIntArray bundleSizesByUid = new SparseIntArray();
+
+ for (WeakReference<PendingIntentRecord> reference : mIntentSenderRecords.values()) {
+ if (reference == null || reference.get() == null) {
+ continue;
+ }
+ PendingIntentRecord record = reference.get();
+ int index = countsByUid.indexOfKey(record.uid);
+
+ if (index < 0) { // ie. the key was not found
+ countsByUid.put(record.uid, 1);
+ bundleSizesByUid.put(record.uid,
+ record.key.requestIntent.getExtrasTotalSize());
+ } else {
+ countsByUid.put(record.uid, countsByUid.valueAt(index) + 1);
+ bundleSizesByUid.put(record.uid,
+ bundleSizesByUid.valueAt(index)
+ + record.key.requestIntent.getExtrasTotalSize());
+ }
+ }
+
+ // Now generate the output.
+ for (int i = 0, size = countsByUid.size(); i < size; i++) {
+ pendingIntentStats.add(new PendingIntentStats(
+ countsByUid.keyAt(i),
+ countsByUid.valueAt(i),
+ /* NB: int conversion here */ bundleSizesByUid.valueAt(i) / 1024));
+ }
+ }
+ }
+ return pendingIntentStats;
+ }
+
+ /**
* Increment the number of the PendingIntentRecord for the given uid, log a warning
* if there are too many for this uid already.
*/
diff --git a/services/core/java/com/android/server/am/PendingStartActivityUids.java b/services/core/java/com/android/server/am/PendingStartActivityUids.java
index 6bf9d4e..802ea00 100644
--- a/services/core/java/com/android/server/am/PendingStartActivityUids.java
+++ b/services/core/java/com/android/server/am/PendingStartActivityUids.java
@@ -35,6 +35,8 @@
final class PendingStartActivityUids {
static final String TAG = ActivityManagerService.TAG;
+ public static final long INVALID_TIME = 0;
+
// Key is uid, value is Pair of pid and SystemClock.elapsedRealtime() when the
// uid is added.
private final SparseArray<Pair<Integer, Long>> mPendingUids = new SparseArray();
@@ -63,13 +65,20 @@
}
}
- synchronized boolean isPendingTopPid(int uid, int pid) {
+ /**
+ * Return the elapsedRealtime when the uid is added to the mPendingUids map.
+ * @param uid
+ * @param pid
+ * @return elapsedRealtime if the uid is in the mPendingUids map;
+ * INVALID_TIME if the uid is not in the mPendingUids map.
+ */
+ synchronized long getPendingTopPidTime(int uid, int pid) {
+ long ret = INVALID_TIME;
final Pair<Integer, Long> pendingPid = mPendingUids.get(uid);
- if (pendingPid != null) {
- return pendingPid.first == pid;
- } else {
- return false;
+ if (pendingPid != null && pendingPid.first == pid) {
+ ret = pendingPid.second;
}
+ return ret;
}
synchronized boolean isPendingTopUid(int uid) {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index c4163e6..763bbee 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -1718,17 +1718,18 @@
return Zygote.MEMORY_TAG_LEVEL_NONE;
}
- // Check to see that the compat feature for TBI is enabled.
- if (mPlatformCompat.isChangeEnabled(NATIVE_HEAP_POINTER_TAGGING, app.info)) {
- return Zygote.MEMORY_TAG_LEVEL_TBI;
- }
-
String defaultLevel = SystemProperties.get("persist.arm64.memtag.app_default");
if ("sync".equals(defaultLevel)) {
return Zygote.MEMORY_TAG_LEVEL_SYNC;
} else if ("async".equals(defaultLevel)) {
return Zygote.MEMORY_TAG_LEVEL_ASYNC;
}
+
+ // Check to see that the compat feature for TBI is enabled.
+ if (mPlatformCompat.isChangeEnabled(NATIVE_HEAP_POINTER_TAGGING, app.info)) {
+ return Zygote.MEMORY_TAG_LEVEL_TBI;
+ }
+
return Zygote.MEMORY_TAG_LEVEL_NONE;
}
diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java
index 84d2b1f..7371d07 100644
--- a/services/core/java/com/android/server/am/ProcessStatsService.java
+++ b/services/core/java/com/android/server/am/ProcessStatsService.java
@@ -44,6 +44,8 @@
import com.android.internal.os.BackgroundThread;
import com.android.server.LocalServices;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
@@ -932,6 +934,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
private void dumpInner(PrintWriter pw, String[] args) {
final long now = SystemClock.uptimeMillis();
diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
index 90aefe0..d239c02 100644
--- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java
+++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
@@ -230,7 +230,9 @@
"Caller did not have permission while calling " + methodName);
userId = handleIncomingUser(userId, methodName);
synchronized (mLock) {
- if (!checkUserStatesExist(userId, methodName)) {
+ // Don't log as this method can be called before user states exist as part of the
+ // force-stop check.
+ if (!checkUserStatesExist(userId, methodName, /* shouldLog= */ false)) {
return false;
}
final Map<String, UserLevelState> packageStates = mUserStates.get(userId);
@@ -238,8 +240,6 @@
if (pkgState == null
|| !mPackageManagerInternal.canQueryPackage(
Binder.getCallingUid(), packageName)) {
- Slog.e(TAG, TextUtils.formatSimple("Package %s is not installed for user %s",
- packageName, userId));
return false;
}
return pkgState.hibernated;
@@ -289,7 +289,7 @@
"Caller does not have MANAGE_APP_HIBERNATION permission.");
final int realUserId = handleIncomingUser(userId, methodName);
synchronized (mLock) {
- if (!checkUserStatesExist(realUserId, methodName)) {
+ if (!checkUserStatesExist(realUserId, methodName, /* shouldLog= */ true)) {
return;
}
final Map<String, UserLevelState> packageStates = mUserStates.get(realUserId);
@@ -382,7 +382,7 @@
"Caller does not have MANAGE_APP_HIBERNATION permission.");
userId = handleIncomingUser(userId, methodName);
synchronized (mLock) {
- if (!checkUserStatesExist(userId, methodName)) {
+ if (!checkUserStatesExist(userId, methodName, /* shouldLog= */ true)) {
return hibernatingPackages;
}
Map<String, UserLevelState> userStates = mUserStates.get(userId);
@@ -419,7 +419,7 @@
"Caller does not have MANAGE_APP_HIBERNATION permission.");
userId = handleIncomingUser(userId, methodName);
synchronized (mLock) {
- if (!checkUserStatesExist(userId, methodName)) {
+ if (!checkUserStatesExist(userId, methodName, /* shouldLog= */ true)) {
return statsMap;
}
final Map<String, UserLevelState> userPackageStates = mUserStates.get(userId);
@@ -431,7 +431,7 @@
}
if (!mGlobalHibernationStates.containsKey(pkgName)
|| !userPackageStates.containsKey(pkgName)) {
- Slog.w(TAG, String.format(
+ Slog.w(TAG, TextUtils.formatSimple(
"No hibernation state associated with package %s user %d. Maybe"
+ "the package was uninstalled? ", pkgName, userId));
continue;
@@ -585,7 +585,7 @@
PackageInfo pkgInfo = installedPackages.get(packageName);
UserLevelState currentState = diskStates.get(i);
if (pkgInfo == null) {
- Slog.w(TAG, String.format(
+ Slog.w(TAG, TextUtils.formatSimple(
"No hibernation state associated with package %s user %d. Maybe"
+ "the package was uninstalled? ", packageName, userId));
continue;
@@ -633,7 +633,7 @@
for (int i = 0, size = diskStates.size(); i < size; i++) {
GlobalLevelState state = diskStates.get(i);
if (!installedPackages.contains(state.packageName)) {
- Slog.w(TAG, String.format(
+ Slog.w(TAG, TextUtils.formatSimple(
"No hibernation state associated with package %s. Maybe the "
+ "package was uninstalled? ", state.packageName));
continue;
@@ -742,18 +742,24 @@
*
* @param userId user to check
* @param methodName method name that is calling. Used for logging purposes.
+ * @param shouldLog whether we should log why the user state doesn't exist
* @return true if user states exist
*/
@GuardedBy("mLock")
- private boolean checkUserStatesExist(int userId, String methodName) {
+ private boolean checkUserStatesExist(int userId, String methodName, boolean shouldLog) {
if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
- Slog.e(TAG, String.format(
- "Attempt to call %s on stopped or nonexistent user %d", methodName, userId));
+ if (shouldLog) {
+ Slog.w(TAG, TextUtils.formatSimple(
+ "Attempt to call %s on stopped or nonexistent user %d",
+ methodName, userId));
+ }
return false;
}
if (!mUserStates.contains(userId)) {
- Slog.w(TAG, String.format(
- "Attempt to call %s before states have been read from disk", methodName));
+ if (shouldLog) {
+ Slog.w(TAG, TextUtils.formatSimple(
+ "Attempt to call %s before states have been read from disk", methodName));
+ }
return false;
}
return true;
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index cebcc64f..e2d00f7 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -179,6 +179,8 @@
import com.android.server.pm.PackageList;
import com.android.server.pm.parsing.pkg.AndroidPackage;
+import dalvik.annotation.optimization.NeverCompile;
+
import libcore.util.EmptyArray;
import org.json.JSONException;
@@ -5902,6 +5904,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java
index d2fa386..567d1ae 100644
--- a/services/core/java/com/android/server/attention/AttentionManagerService.java
+++ b/services/core/java/com/android/server/attention/AttentionManagerService.java
@@ -30,7 +30,7 @@
import android.app.ActivityThread;
import android.attention.AttentionManagerInternal;
import android.attention.AttentionManagerInternal.AttentionCallbackInternal;
-import android.attention.AttentionManagerInternal.ProximityCallbackInternal;
+import android.attention.AttentionManagerInternal.ProximityUpdateCallbackInternal;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -59,7 +59,7 @@
import android.service.attention.AttentionService.AttentionSuccessCodes;
import android.service.attention.IAttentionCallback;
import android.service.attention.IAttentionService;
-import android.service.attention.IProximityCallback;
+import android.service.attention.IProximityUpdateCallback;
import android.text.TextUtils;
import android.util.Slog;
@@ -336,7 +336,7 @@
* @return {@code true} if the framework was able to dispatch the request
*/
@VisibleForTesting
- boolean onStartProximityUpdates(ProximityCallbackInternal callbackInternal) {
+ boolean onStartProximityUpdates(ProximityUpdateCallbackInternal callbackInternal) {
Objects.requireNonNull(callbackInternal);
if (!mIsServiceEnabled) {
Slog.w(LOG_TAG, "Trying to call onProximityUpdate() on an unsupported device.");
@@ -385,7 +385,7 @@
/** Cancels the specified proximity registration. */
@VisibleForTesting
- void onStopProximityUpdates(ProximityCallbackInternal callbackInternal) {
+ void onStopProximityUpdates(ProximityUpdateCallbackInternal callbackInternal) {
synchronized (mLock) {
if (mCurrentProximityUpdate == null
|| !mCurrentProximityUpdate.mCallbackInternal.equals(callbackInternal)
@@ -506,12 +506,12 @@
@Override
public boolean onStartProximityUpdates(
- ProximityCallbackInternal callback) {
+ ProximityUpdateCallbackInternal callback) {
return AttentionManagerService.this.onStartProximityUpdates(callback);
}
@Override
- public void onStopProximityUpdates(ProximityCallbackInternal callback) {
+ public void onStopProximityUpdates(ProximityUpdateCallbackInternal callback) {
AttentionManagerService.this.onStopProximityUpdates(callback);
}
}
@@ -635,13 +635,13 @@
@VisibleForTesting
final class ProximityUpdate {
- private final ProximityCallbackInternal mCallbackInternal;
- private final IProximityCallback mIProximityCallback;
+ private final ProximityUpdateCallbackInternal mCallbackInternal;
+ private final IProximityUpdateCallback mIProximityUpdateCallback;
private boolean mStartedUpdates;
- ProximityUpdate(ProximityCallbackInternal callbackInternal) {
+ ProximityUpdate(ProximityUpdateCallbackInternal callbackInternal) {
mCallbackInternal = callbackInternal;
- mIProximityCallback = new IProximityCallback.Stub() {
+ mIProximityUpdateCallback = new IProximityUpdateCallback.Stub() {
@Override
public void onProximityUpdate(double distance) {
synchronized (mLock) {
@@ -664,7 +664,7 @@
return false;
}
try {
- mService.onStartProximityUpdates(mIProximityCallback);
+ mService.onStartProximityUpdates(mIProximityUpdateCallback);
mStartedUpdates = true;
} catch (RemoteException e) {
Slog.e(LOG_TAG, "Cannot call into the AttentionService", e);
@@ -758,7 +758,8 @@
if (mCurrentProximityUpdate != null && mCurrentProximityUpdate.mStartedUpdates) {
if (mService != null) {
try {
- mService.onStartProximityUpdates(mCurrentProximityUpdate.mIProximityCallback);
+ mService.onStartProximityUpdates(
+ mCurrentProximityUpdate.mIProximityUpdateCallback);
} catch (RemoteException e) {
Slog.e(LOG_TAG, "Cannot call into the AttentionService", e);
}
@@ -913,7 +914,7 @@
}
}
- class TestableProximityCallbackInternal extends ProximityCallbackInternal {
+ class TestableProximityUpdateCallbackInternal extends ProximityUpdateCallbackInternal {
private double mLastCallbackCode = PROXIMITY_UNKNOWN;
@Override
@@ -932,8 +933,8 @@
final TestableAttentionCallbackInternal mTestableAttentionCallback =
new TestableAttentionCallbackInternal();
- final TestableProximityCallbackInternal mTestableProximityCallback =
- new TestableProximityCallbackInternal();
+ final TestableProximityUpdateCallbackInternal mTestableProximityUpdateCallback =
+ new TestableProximityUpdateCallbackInternal();
@Override
public int onCommand(@Nullable final String cmd) {
@@ -964,8 +965,8 @@
return cmdClearTestableAttentionService();
case "getLastTestCallbackCode":
return cmdGetLastTestCallbackCode();
- case "getLastTestProximityCallbackCode":
- return cmdGetLastTestProximityCallbackCode();
+ case "getLastTestProximityUpdateCallbackCode":
+ return cmdGetLastTestProximityUpdateCallbackCode();
default:
return handleDefaultCommands(cmd);
}
@@ -990,7 +991,7 @@
private int cmdClearTestableAttentionService() {
sTestAttentionServicePackage = "";
mTestableAttentionCallback.reset();
- mTestableProximityCallback.reset();
+ mTestableProximityUpdateCallback.reset();
resetStates();
return 0;
}
@@ -1011,14 +1012,14 @@
private int cmdCallOnStartProximityUpdates() {
final PrintWriter out = getOutPrintWriter();
- boolean calledSuccessfully = onStartProximityUpdates(mTestableProximityCallback);
+ boolean calledSuccessfully = onStartProximityUpdates(mTestableProximityUpdateCallback);
out.println(calledSuccessfully ? "true" : "false");
return 0;
}
private int cmdCallOnStopProximityUpdates() {
final PrintWriter out = getOutPrintWriter();
- onStopProximityUpdates(mTestableProximityCallback);
+ onStopProximityUpdates(mTestableProximityUpdateCallback);
out.println("true");
return 0;
}
@@ -1036,9 +1037,9 @@
return 0;
}
- private int cmdGetLastTestProximityCallbackCode() {
+ private int cmdGetLastTestProximityUpdateCallbackCode() {
final PrintWriter out = getOutPrintWriter();
- out.println(mTestableProximityCallback.getLastCallbackCode());
+ out.println(mTestableProximityUpdateCallback.getLastCallbackCode());
return 0;
}
@@ -1081,7 +1082,7 @@
out.println(
" := true, if the request was successfully dispatched to the service "
+ "implementation."
- + " (to see the result, call getLastTestProximityCallbackCode)");
+ + " (to see the result, call getLastTestProximityUpdateCallbackCode)");
out.println(" := false, otherwise");
out.println(" call onStopProximityUpdates: Cancels proximity updates");
out.println(" getLastTestCallbackCode");
@@ -1089,7 +1090,7 @@
out.println(
" := An integer, representing the last callback code received from the "
+ "bounded implementation. If none, it will return -1");
- out.println(" getLastTestProximityCallbackCode");
+ out.println(" getLastTestProximityUpdateCallbackCode");
out.println(" ---returns:");
out.println(
" := A double, representing the last proximity value received from the "
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 3e5e435..0b9fb1a 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -36,6 +36,7 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -87,6 +88,7 @@
import android.media.AudioRoutesInfo;
import android.media.AudioSystem;
import android.media.BluetoothProfileConnectionInfo;
+import android.media.IAudioDeviceVolumeDispatcher;
import android.media.IAudioFocusDispatcher;
import android.media.IAudioModeDispatcher;
import android.media.IAudioRoutesObserver;
@@ -108,6 +110,7 @@
import android.media.MediaRecorder.AudioSource;
import android.media.PlayerBase;
import android.media.Spatializer;
+import android.media.VolumeInfo;
import android.media.VolumePolicy;
import android.media.audiofx.AudioEffect;
import android.media.audiopolicy.AudioMix;
@@ -3327,6 +3330,13 @@
}
}
+ private void enforceAccessUltrasoundPermission() {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.ACCESS_ULTRASOUND)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Missing ACCESS_ULTRASOUND permission");
+ }
+ }
+
private void enforceQueryStatePermission() {
if (mContext.checkCallingOrSelfPermission(Manifest.permission.QUERY_AUDIO_STATE)
!= PackageManager.PERMISSION_GRANTED) {
@@ -3459,6 +3469,12 @@
attributionTag, Binder.getCallingUid(), callingOrSelfHasAudioSettingsPermission());
}
+ /** @see AudioManager#isUltrasoundSupported() */
+ public boolean isUltrasoundSupported() {
+ enforceAccessUltrasoundPermission();
+ return AudioSystem.isUltrasoundSupported();
+ }
+
private boolean canChangeAccessibilityVolume() {
synchronized (mAccessibilityServiceUidsLock) {
if (PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission(
@@ -4246,6 +4262,24 @@
return (mStreamStates[streamType].getIndex(device) + 5) / 10;
}
+ /**
+ * Default VolumeInfo returned by {@link VolumeInfo#getDefaultVolumeInfo()}
+ * Lazily initialized in {@link #getDefaultVolumeInfo()}
+ */
+ static VolumeInfo sDefaultVolumeInfo;
+
+ /** @see VolumeInfo#getDefaultVolumeInfo() */
+ public VolumeInfo getDefaultVolumeInfo() {
+ if (sDefaultVolumeInfo == null) {
+ sDefaultVolumeInfo = new VolumeInfo.Builder(AudioSystem.STREAM_MUSIC)
+ .setMinVolumeIndex(getStreamMinVolume(AudioSystem.STREAM_MUSIC))
+ .setMaxVolumeIndex(getStreamMaxVolume(AudioSystem.STREAM_MUSIC))
+ .setMuted(false)
+ .build();
+ }
+ return sDefaultVolumeInfo;
+ }
+
/** @see AudioManager#getUiSoundsStreamType()
* TODO(b/181140246): when using VolumeGroup alias, we are lacking configurability for
* UI Sounds identification.
@@ -6310,6 +6344,37 @@
}
/**
+ * @see AudioDeviceVolumeManager#setDeviceAbsoluteMultiVolumeBehavior
+ * @param cb
+ * @param attr
+ * @param volumes
+ */
+ @RequiresPermission(anyOf = { android.Manifest.permission.MODIFY_AUDIO_ROUTING,
+ android.Manifest.permission.BLUETOOTH_PRIVILEGED })
+ public void registerDeviceVolumeDispatcherForAbsoluteVolume(boolean register,
+ IAudioDeviceVolumeDispatcher cb, String packageName,
+ AudioDeviceAttributes device, List<VolumeInfo> volumes) {
+ // verify permissions
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ != PackageManager.PERMISSION_GRANTED
+ && mContext.checkCallingOrSelfPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException(
+ "Missing MODIFY_AUDIO_ROUTING or BLUETOOTH_PRIVILEGED permissions");
+ }
+ // verify arguments
+ Objects.requireNonNull(device);
+ Objects.requireNonNull(volumes);
+
+ // current implementation maps this call to existing abs volume API of AudioManager
+ // TODO implement the volume/device listener through IAudioDeviceVolumeDispatcher
+ final int volumeBehavior = volumes.size() == 1
+ ? AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE
+ : AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE;
+ setDeviceVolumeBehavior(device, volumeBehavior, packageName);
+ }
+
+ /**
* @see AudioManager#setDeviceVolumeBehavior(AudioDeviceAttributes, int)
* @param device the audio device to be affected
* @param deviceVolumeBehavior one of the device behaviors
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index f4aa88f..73afa60 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -116,6 +116,8 @@
import com.android.server.content.SyncStorageEngine.OnSyncRequestListener;
import com.android.server.job.JobSchedulerInternal;
+import dalvik.annotation.optimization.NeverCompile;
+
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
@@ -2169,6 +2171,7 @@
return true;
}
+ @NeverCompile // Avoid size overhead of debugging code.
protected void dumpSyncState(PrintWriter pw, SyncAdapterStateFetcher buckets) {
final StringBuilder sb = new StringBuilder();
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java
index 2c2a2bf..17215e5 100644
--- a/services/core/java/com/android/server/display/BrightnessTracker.java
+++ b/services/core/java/com/android/server/display/BrightnessTracker.java
@@ -131,6 +131,7 @@
private static final int MSG_STOP_SENSOR_LISTENER = 2;
private static final int MSG_START_SENSOR_LISTENER = 3;
private static final int MSG_BRIGHTNESS_CONFIG_CHANGED = 4;
+ private static final int MSG_SENSOR_CHANGED = 5;
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
@@ -158,6 +159,7 @@
// These members should only be accessed on the mBgHandler thread.
private BroadcastReceiver mBroadcastReceiver;
private SensorListener mSensorListener;
+ private Sensor mLightSensor;
private SettingsObserver mSettingsObserver;
private DisplayListener mDisplayListener;
private boolean mSensorRegistered;
@@ -327,6 +329,14 @@
m.sendToTarget();
}
+ /**
+ * Updates the light sensor to use.
+ */
+ public void setLightSensor(Sensor lightSensor) {
+ mBgHandler.obtainMessage(MSG_SENSOR_CHANGED, 0 /*unused*/, 0/*unused*/, lightSensor)
+ .sendToTarget();
+ }
+
private void handleBrightnessChanged(float brightness, boolean userInitiated,
float powerBrightnessFactor, boolean isUserSetBrightness,
boolean isDefaultBrightnessConfig, long timestamp, String uniqueDisplayId) {
@@ -428,13 +438,28 @@
}
}
+ private void handleSensorChanged(Sensor lightSensor) {
+ if (mLightSensor != lightSensor) {
+ mLightSensor = lightSensor;
+ stopSensorListener();
+ synchronized (mDataCollectionLock) {
+ mLastSensorReadings.clear();
+ }
+ // Attempt to restart the sensor listener. It will check to see if it should be running
+ // so there is no need to also check here.
+ startSensorListener();
+ }
+ }
+
private void startSensorListener() {
if (!mSensorRegistered
+ && mLightSensor != null
+ && mAmbientBrightnessStatsTracker != null
&& mInjector.isInteractive(mContext)
&& mInjector.isBrightnessModeAutomatic(mContentResolver)) {
mAmbientBrightnessStatsTracker.start();
mSensorRegistered = true;
- mInjector.registerSensorListener(mContext, mSensorListener,
+ mInjector.registerSensorListener(mContext, mSensorListener, mLightSensor,
mInjector.getBackgroundHandler());
}
}
@@ -736,6 +761,7 @@
pw.println("BrightnessTracker state:");
synchronized (mDataCollectionLock) {
pw.println(" mStarted=" + mStarted);
+ pw.println(" mLightSensor=" + mLightSensor);
pw.println(" mLastBatteryLevel=" + mLastBatteryLevel);
pw.println(" mLastBrightness=" + mLastBrightness);
pw.println(" mLastSensorReadings.size=" + mLastSensorReadings.size());
@@ -1017,6 +1043,9 @@
disableColorSampling();
}
break;
+ case MSG_SENSOR_CHANGED:
+ handleSensorChanged((Sensor) msg.obj);
+ break;
}
}
@@ -1045,9 +1074,8 @@
@VisibleForTesting
static class Injector {
public void registerSensorListener(Context context,
- SensorEventListener sensorListener, Handler handler) {
+ SensorEventListener sensorListener, Sensor lightSensor, Handler handler) {
SensorManager sensorManager = context.getSystemService(SensorManager.class);
- Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(sensorListener,
lightSensor, SensorManager.SENSOR_DELAY_NORMAL, handler);
}
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 6866137..064e307 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -42,7 +42,6 @@
import com.android.server.display.config.DisplayQuirks;
import com.android.server.display.config.HbmTiming;
import com.android.server.display.config.HighBrightnessMode;
-import com.android.server.display.config.Interpolation;
import com.android.server.display.config.NitsMap;
import com.android.server.display.config.Point;
import com.android.server.display.config.RefreshRateRange;
@@ -1254,19 +1253,17 @@
}
}
- private int convertInterpolationType(Interpolation value) {
- if (value == null) {
+ private int convertInterpolationType(String value) {
+ if (TextUtils.isEmpty(value)) {
return INTERPOLATION_DEFAULT;
}
- switch (value) {
- case _default:
- return INTERPOLATION_DEFAULT;
- case linear:
- return INTERPOLATION_LINEAR;
- default:
- Slog.wtf(TAG, "Unexpected Interpolation Type: " + value);
- return INTERPOLATION_DEFAULT;
+
+ if ("linear".equals(value)) {
+ return INTERPOLATION_LINEAR;
}
+
+ Slog.wtf(TAG, "Unexpected Interpolation Type: " + value);
+ return INTERPOLATION_DEFAULT;
}
private void loadAmbientHorizonFromDdc(DisplayConfiguration config) {
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 418e91d..9067f2e 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -826,7 +826,6 @@
private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
// All properties that depend on the associated DisplayDevice and the DDC must be
// updated here.
- loadAmbientLightSensor();
loadBrightnessRampRates();
loadProximitySensor();
loadNitsRange(mContext.getResources());
@@ -972,6 +971,9 @@
}
loadAmbientLightSensor();
+ if (mBrightnessTracker != null) {
+ mBrightnessTracker.setLightSensor(mLightSensor);
+ }
if (mAutomaticBrightnessController != null) {
mAutomaticBrightnessController.stop();
diff --git a/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java b/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java
index cb93cc8..f529c4c 100644
--- a/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java
+++ b/services/core/java/com/android/server/display/color/ReduceBrightColorsTintController.java
@@ -98,6 +98,13 @@
return ColorDisplayManager.isColorTransformAccelerated(context);
}
+ @Override
+ public void setActivated(Boolean isActivated) {
+ super.setActivated(isActivated);
+ Slog.i(ColorDisplayService.TAG, (isActivated != null && isActivated)
+ ? "Turning on reduce bright colors" : "Turning off reduce bright colors");
+ }
+
public int getStrength() {
return mStrength;
}
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 940c25c..c15242a 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -41,6 +41,9 @@
import android.content.res.XmlResourceParser;
import android.database.ContentObserver;
import android.graphics.PointF;
+import android.hardware.SensorPrivacyManager;
+import android.hardware.SensorPrivacyManager.Sensors;
+import android.hardware.SensorPrivacyManagerInternal;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayViewport;
import android.hardware.input.IInputDevicesChangedListener;
@@ -550,6 +553,19 @@
}
}
+ // Set the HW mic toggle switch state
+ final int micMuteState = getSwitchState(-1 /* deviceId */, InputDevice.SOURCE_ANY,
+ SW_MUTE_DEVICE);
+ if (micMuteState != InputManager.SWITCH_STATE_UNKNOWN) {
+ setSensorPrivacy(Sensors.MICROPHONE, micMuteState != InputManager.SWITCH_STATE_OFF);
+ }
+ // Set the HW camera toggle switch state
+ final int cameraMuteState = getSwitchState(-1 /* deviceId */, InputDevice.SOURCE_ANY,
+ SW_CAMERA_LENS_COVER);
+ if (cameraMuteState != InputManager.SWITCH_STATE_UNKNOWN) {
+ setSensorPrivacy(Sensors.CAMERA, cameraMuteState != InputManager.SWITCH_STATE_OFF);
+ }
+
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
@@ -2816,6 +2832,8 @@
if ((switchMask & SW_CAMERA_LENS_COVER_BIT) != 0) {
final boolean lensCovered = ((switchValues & SW_CAMERA_LENS_COVER_BIT) != 0);
mWindowManagerCallbacks.notifyCameraLensCoverSwitchChanged(whenNanos, lensCovered);
+ // Use SW_CAMERA_LENS_COVER code for camera privacy toggles
+ setSensorPrivacy(Sensors.CAMERA, lensCovered);
}
if (mUseDevInputEventForAudioJack && (switchMask & SW_JACK_BITS) != 0) {
@@ -2836,9 +2854,20 @@
final boolean micMute = ((switchValues & SW_MUTE_DEVICE_BIT) != 0);
AudioManager audioManager = mContext.getSystemService(AudioManager.class);
audioManager.setMicrophoneMuteFromSwitch(micMute);
+
+ setSensorPrivacy(Sensors.MICROPHONE, micMute);
}
}
+ // Set the sensor privacy state based on the hardware toggles switch states
+ private void setSensorPrivacy(@SensorPrivacyManager.Sensors.Sensor int sensor,
+ boolean enablePrivacy) {
+ final SensorPrivacyManagerInternal sensorPrivacyManagerInternal =
+ LocalServices.getService(SensorPrivacyManagerInternal.class);
+ sensorPrivacyManagerInternal.setPhysicalToggleSensorPrivacy(UserHandle.USER_CURRENT, sensor,
+ enablePrivacy);
+ }
+
// Native callback.
@SuppressWarnings("unused")
private void notifyInputChannelBroken(IBinder token) {
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 7068ed1..0b7e391 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -130,6 +130,7 @@
import android.view.WindowManager.DisplayImePolicy;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
+import android.view.accessibility.AccessibilityManager;
import android.view.autofill.AutofillId;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InlineSuggestionsRequest;
@@ -287,6 +288,9 @@
private final InputMethodMenuController mMenuController;
private final InputMethodBindingController mBindingController;
+ // TODO(b/219056452): Use AccessibilityManagerInternal instead.
+ private final AccessibilityManager mAccessibilityManager;
+
/**
* Cache the result of {@code LocalServices.getService(AudioManagerInternal.class)}.
*
@@ -1627,6 +1631,7 @@
mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
mUserManager = mContext.getSystemService(UserManager.class);
mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
+ mAccessibilityManager = AccessibilityManager.getInstance(context);
mHasFeature = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INPUT_METHODS);
mPlatformCompat = IPlatformCompat.Stub.asInterface(
@@ -1995,12 +2000,13 @@
@GuardedBy("ImfLock.class")
private void onCreateInlineSuggestionsRequestLocked(@UserIdInt int userId,
- InlineSuggestionsRequestInfo requestInfo, IInlineSuggestionsRequestCallback callback) {
+ InlineSuggestionsRequestInfo requestInfo, IInlineSuggestionsRequestCallback callback,
+ boolean touchExplorationEnabled) {
final InputMethodInfo imi = mMethodMap.get(getSelectedMethodIdLocked());
try {
IInputMethodInvoker curMethod = getCurMethodLocked();
- if (userId == mSettings.getCurrentUserId() && imi != null
- && imi.isInlineSuggestionsEnabled() && curMethod != null) {
+ if (userId == mSettings.getCurrentUserId() && curMethod != null
+ && imi != null && isInlineSuggestionsEnabled(imi, touchExplorationEnabled)) {
final IInlineSuggestionsRequestCallback callbackImpl =
new InlineSuggestionsRequestCallbackDecorator(callback,
imi.getPackageName(), mCurTokenDisplayId, getCurTokenLocked(),
@@ -2014,6 +2020,13 @@
}
}
+ private static boolean isInlineSuggestionsEnabled(InputMethodInfo imi,
+ boolean touchExplorationEnabled) {
+ return imi.isInlineSuggestionsEnabled()
+ && (!touchExplorationEnabled
+ || imi.supportsInlineSuggestionsWithTouchExploration());
+ }
+
/**
* The decorator which validates the host package name in the
* {@link InlineSuggestionsRequest} argument to make sure it matches the IME package name.
@@ -5197,8 +5210,12 @@
@Override
public void onCreateInlineSuggestionsRequest(@UserIdInt int userId,
InlineSuggestionsRequestInfo requestInfo, IInlineSuggestionsRequestCallback cb) {
+ // Get the device global touch exploration state before lock to avoid deadlock.
+ boolean touchExplorationEnabled = mAccessibilityManager.isTouchExplorationEnabled();
+
synchronized (ImfLock.class) {
- onCreateInlineSuggestionsRequestLocked(userId, requestInfo, cb);
+ onCreateInlineSuggestionsRequestLocked(userId, requestInfo, cb,
+ touchExplorationEnabled);
}
}
diff --git a/services/core/java/com/android/server/logcat/LogcatManagerService.java b/services/core/java/com/android/server/logcat/LogcatManagerService.java
index 34614d5..490e00e 100644
--- a/services/core/java/com/android/server/logcat/LogcatManagerService.java
+++ b/services/core/java/com/android/server/logcat/LogcatManagerService.java
@@ -329,6 +329,20 @@
if (mStart) {
+ ActivityManagerInternal ami = LocalServices.getService(
+ ActivityManagerInternal.class);
+ boolean isCallerInstrumented = ami.isUidCurrentlyInstrumented(mUid);
+
+ // The instrumented apks only run for testing, so we don't check user permission.
+ if (isCallerInstrumented) {
+ try {
+ getLogdService().approve(mUid, mGid, mPid, mFd);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ return;
+ }
+
// TODO Temporarily approve all the requests to unblock testing failures.
try {
getLogdService().approve(mUid, mGid, mPid, mFd);
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 8d05415..0052df3 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -257,6 +257,8 @@
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
+import dalvik.annotation.optimization.NeverCompile;
+
import libcore.io.IoUtils;
import java.io.File;
@@ -3748,6 +3750,7 @@
return 0;
}
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, writer)) return;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 3d34976..16b5fb1 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -682,7 +682,14 @@
return mBuffer.descendingIterator();
}
- public StatusBarNotification[] getArray(int count, boolean includeSnoozed) {
+ public StatusBarNotification[] getArray(UserManager um, int count, boolean includeSnoozed) {
+ ArrayList<Integer> currentUsers = new ArrayList<>();
+ currentUsers.add(UserHandle.USER_ALL);
+ Binder.withCleanCallingIdentity(() -> {
+ for (int user : um.getProfileIds(ActivityManager.getCurrentUser(), false)) {
+ currentUsers.add(user);
+ }
+ });
synchronized (mBufferLock) {
if (count == 0) count = mBufferSize;
List<StatusBarNotification> a = new ArrayList();
@@ -691,8 +698,10 @@
while (iter.hasNext() && i < count) {
Pair<StatusBarNotification, Integer> pair = iter.next();
if (pair.second != REASON_SNOOZED || includeSnoozed) {
- i++;
- a.add(pair.first);
+ if (currentUsers.contains(pair.first.getUserId())) {
+ i++;
+ a.add(pair.first);
+ }
}
}
return a.toArray(new StatusBarNotification[a.size()]);
@@ -4200,22 +4209,32 @@
android.Manifest.permission.ACCESS_NOTIFICATIONS,
"NotificationManagerService.getActiveNotifications");
- StatusBarNotification[] tmp = null;
+ ArrayList<StatusBarNotification> tmp = new ArrayList<>();
int uid = Binder.getCallingUid();
+ ArrayList<Integer> currentUsers = new ArrayList<>();
+ currentUsers.add(UserHandle.USER_ALL);
+ Binder.withCleanCallingIdentity(() -> {
+ for (int user : mUm.getProfileIds(ActivityManager.getCurrentUser(), false)) {
+ currentUsers.add(user);
+ }
+ });
+
// noteOp will check to make sure the callingPkg matches the uid
if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg,
callingAttributionTag, null)
== MODE_ALLOWED) {
synchronized (mNotificationLock) {
- tmp = new StatusBarNotification[mNotificationList.size()];
final int N = mNotificationList.size();
- for (int i=0; i<N; i++) {
- tmp[i] = mNotificationList.get(i).getSbn();
+ for (int i = 0; i < N; i++) {
+ final StatusBarNotification sbn = mNotificationList.get(i).getSbn();
+ if (currentUsers.contains(sbn.getUserId())) {
+ tmp.add(sbn);
+ }
}
}
}
- return tmp;
+ return tmp.toArray(new StatusBarNotification[tmp.size()]);
}
/**
@@ -4324,7 +4343,7 @@
callingAttributionTag, null)
== MODE_ALLOWED) {
synchronized (mArchive) {
- tmp = mArchive.getArray(count, includeSnoozed);
+ tmp = mArchive.getArray(mUm, count, includeSnoozed);
}
}
return tmp;
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 70e968f..66c7c50 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -69,6 +69,8 @@
import com.android.server.LocalServices;
import com.android.server.uri.UriGrantsManagerInternal;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
@@ -467,6 +469,7 @@
rv.getPackage(), rv.getLayoutId(), rv.estimateMemoryUsage(), rv.toString());
}
+ @NeverCompile // Avoid size overhead of debugging code.
void dump(PrintWriter pw, String prefix, Context baseContext, boolean redact) {
final Notification notification = getSbn().getNotification();
pw.println(prefix + this);
diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java
index d80d9f3..6b9e374 100644
--- a/services/core/java/com/android/server/notification/PermissionHelper.java
+++ b/services/core/java/com/android/server/notification/PermissionHelper.java
@@ -185,11 +185,13 @@
return;
}
try {
- if (grant && !reviewRequired) {
+ boolean currentlyGranted = mPmi.checkPermission(packageName, NOTIFICATION_PERMISSION,
+ userId) != PackageManager.PERMISSION_DENIED;
+ if (grant && !reviewRequired && !currentlyGranted) {
mPermManager.grantRuntimePermission(packageName, NOTIFICATION_PERMISSION, userId);
- } else {
- mPermManager.revokeRuntimePermission(packageName, NOTIFICATION_PERMISSION, userId,
- TAG);
+ } else if (!grant && currentlyGranted) {
+ mPermManager.revokeRuntimePermission(packageName, NOTIFICATION_PERMISSION,
+ userId, TAG);
}
if (userSet) {
mPermManager.updatePermissionFlags(packageName, NOTIFICATION_PERMISSION,
diff --git a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
index dc4d04f..bdc5711 100644
--- a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
+++ b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
@@ -70,11 +70,15 @@
"validate_notification_people_enabled";
private static final String[] LOOKUP_PROJECTION = { Contacts._ID, Contacts.LOOKUP_KEY,
Contacts.STARRED, Contacts.HAS_PHONE_NUMBER };
- private static final String[] PHONE_LOOKUP_PROJECTION =
- { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER };
private static final int MAX_PEOPLE = 10;
private static final int PEOPLE_CACHE_SIZE = 200;
+ /** Columns used to look up phone numbers for contacts. */
+ @VisibleForTesting
+ static final String[] PHONE_LOOKUP_PROJECTION =
+ { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER,
+ ContactsContract.CommonDataKinds.Phone.NUMBER };
+
/** Indicates that the notification does not reference any valid contacts. */
static final float NONE = 0f;
@@ -548,14 +552,21 @@
return mPhoneLookupKey;
}
- // Merge phone number found in this lookup and store it in mPhoneNumbers.
+ // Merge phone numbers found in this lookup and store them in mPhoneNumbers.
public void mergePhoneNumber(Cursor cursor) {
- final int phoneNumIdx = cursor.getColumnIndex(
+ final int normalizedNumIdx = cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER);
- if (phoneNumIdx >= 0) {
- mPhoneNumbers.add(cursor.getString(phoneNumIdx));
+ if (normalizedNumIdx >= 0) {
+ mPhoneNumbers.add(cursor.getString(normalizedNumIdx));
} else {
- if (DEBUG) Slog.d(TAG, "invalid cursor: no NORMALIZED_NUMBER");
+ if (DEBUG) Slog.d(TAG, "cursor data not found: no NORMALIZED_NUMBER");
+ }
+
+ final int numIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
+ if (numIdx >= 0) {
+ mPhoneNumbers.add(cursor.getString(numIdx));
+ } else {
+ if (DEBUG) Slog.d(TAG, "cursor data not found: no NUMBER");
}
}
diff --git a/services/core/java/com/android/server/notification/ZenModeFiltering.java b/services/core/java/com/android/server/notification/ZenModeFiltering.java
index d04b331..2a6dd84 100644
--- a/services/core/java/com/android/server/notification/ZenModeFiltering.java
+++ b/services/core/java/com/android/server/notification/ZenModeFiltering.java
@@ -40,8 +40,6 @@
import com.android.internal.util.NotificationMessagingUtil;
import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
import java.util.Date;
public class ZenModeFiltering {
@@ -416,16 +414,10 @@
if (person == null) continue;
final Uri uri = Uri.parse(person);
if ("tel".equals(uri.getScheme())) {
- String tel = uri.getSchemeSpecificPart();
- // while ideally we should not need to do this, sometimes we have seen tel
- // numbers given in a url-encoded format
- try {
- tel = URLDecoder.decode(tel, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- // ignore, keep the original tel string
- Slog.w(TAG, "unsupported encoding in tel: uri input");
- }
- mTelCalls.put(tel, now);
+ // while ideally we should not need to decode this, sometimes we have seen tel
+ // numbers given in an encoded format
+ String tel = Uri.decode(uri.getSchemeSpecificPart());
+ if (tel != null) mTelCalls.put(tel, now);
} else {
// for non-tel calls, store the entire string, uri-component and all
mOtherCalls.put(person, now);
@@ -436,7 +428,7 @@
// provided; these are in the format of just a phone number string
if (phoneNumbers != null) {
for (String num : phoneNumbers) {
- mTelCalls.put(num, now);
+ if (num != null) mTelCalls.put(num, now);
}
}
}
@@ -456,17 +448,13 @@
return true;
} else {
// see if a number that matches via areSameNumber exists
- String numberToCheck = number;
- try {
- numberToCheck = URLDecoder.decode(number, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- // ignore, continue to use the original string
- Slog.w(TAG, "unsupported encoding in tel: uri input");
- }
- for (String prev : mTelCalls.keySet()) {
- if (PhoneNumberUtils.areSamePhoneNumber(
- numberToCheck, prev, defaultCountryCode)) {
- return true;
+ String numberToCheck = Uri.decode(number);
+ if (numberToCheck != null) {
+ for (String prev : mTelCalls.keySet()) {
+ if (PhoneNumberUtils.areSamePhoneNumber(
+ numberToCheck, prev, defaultCountryCode)) {
+ return true;
+ }
}
}
}
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 2d87099..9b10058 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -40,6 +40,7 @@
import android.os.ServiceManager;
import android.os.Trace;
import android.sysprop.ApexProperties;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.PrintWriterPrinter;
@@ -582,6 +583,8 @@
ApexInfo ai = parsingApexInfo.get(parseResult.scanFile);
if (throwable == null) {
+ // Calling hideAsFinal to assign derived fields for the app info flags.
+ parseResult.parsedPackage.hideAsFinal();
final PackageInfo packageInfo = PackageInfoWithoutStateUtils.generate(
parseResult.parsedPackage, ai, flags);
if (packageInfo == null) {
@@ -606,18 +609,21 @@
continue;
}
- String name = service.getName();
- for (ApexSystemServiceInfo info : mApexSystemServices) {
- if (info.getName().equals(name)) {
- throw new IllegalStateException(String.format(
- "Duplicate apex-system-service %s from %s, %s",
- name, info.mJarPath, service.getJarPath()));
+ if (ai.isActive) {
+ String name = service.getName();
+ for (int j = 0; j < mApexSystemServices.size(); j++) {
+ ApexSystemServiceInfo info = mApexSystemServices.get(j);
+ if (info.getName().equals(name)) {
+ throw new IllegalStateException(TextUtils.formatSimple(
+ "Duplicate apex-system-service %s from %s, %s", name,
+ info.mJarPath, service.getJarPath()));
+ }
}
+ ApexSystemServiceInfo info = new ApexSystemServiceInfo(
+ service.getName(), service.getJarPath(),
+ service.getInitOrder());
+ mApexSystemServices.add(info);
}
-
- ApexSystemServiceInfo info = new ApexSystemServiceInfo(
- service.getName(), service.getJarPath(), service.getInitOrder());
- mApexSystemServices.add(info);
}
Collections.sort(mApexSystemServices);
mPackageNameToApexModuleName.put(packageInfo.packageName, ai.moduleName);
diff --git a/services/core/java/com/android/server/pm/AppDataHelper.java b/services/core/java/com/android/server/pm/AppDataHelper.java
index d745a23..0b0d1458 100644
--- a/services/core/java/com/android/server/pm/AppDataHelper.java
+++ b/services/core/java/com/android/server/pm/AppDataHelper.java
@@ -377,6 +377,12 @@
+ Integer.toHexString(flags) + " migrateAppData=" + migrateAppData);
List<String> result = onlyCoreApps ? new ArrayList<>() : null;
+ try {
+ mInstaller.cleanupInvalidPackageDirs(volumeUuid, userId, flags);
+ } catch (Installer.InstallerException e) {
+ logCriticalInfo(Log.WARN, "Failed to cleanup deleted dirs: " + e);
+ }
+
final File ceDir = Environment.getDataUserCeDirectory(volumeUuid, userId);
final File deDir = Environment.getDataUserDeDirectory(volumeUuid, userId);
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index 4f1a9e7..d117967 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -1382,7 +1382,7 @@
}
} else {
callingPkgSetting = null;
- callingSharedPkgSettings = ((SharedUserSetting) callingSetting).packages;
+ callingSharedPkgSettings = ((SharedUserSetting) callingSetting).getPackageStates();
}
if (DEBUG_TRACING) {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 04f0aab..c437697 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -2176,11 +2176,13 @@
return null;
}
final SharedUserSetting sus = (SharedUserSetting) obj;
- final int n = sus.packages.size();
+ final ArraySet<PackageStateInternal> packageStates =
+ (ArraySet<PackageStateInternal>) sus.getPackageStates();
+ final int n = packageStates.size();
String[] res = new String[n];
int i = 0;
for (int index = 0; index < n; index++) {
- final PackageStateInternal ps = sus.packages.valueAt(index);
+ final PackageStateInternal ps = packageStates.valueAt(index);
if (ps.getUserStateOrDefault(userId).isInstalled()
&& !shouldFilterApplication(ps, callingUid, userId)) {
res[i++] = ps.getPackageName();
@@ -2710,8 +2712,10 @@
public final boolean shouldFilterApplication(@NonNull SharedUserSetting sus,
int callingUid, int userId) {
boolean filterApp = true;
- for (int index = sus.packages.size() - 1; index >= 0 && filterApp; index--) {
- filterApp &= shouldFilterApplication(sus.packages.valueAt(index),
+ final ArraySet<PackageStateInternal> packageStates =
+ (ArraySet<PackageStateInternal>) sus.getPackageStates();
+ for (int index = packageStates.size() - 1; index >= 0 && filterApp; index--) {
+ filterApp &= shouldFilterApplication(packageStates.valueAt(index),
callingUid, /* component */ null, TYPE_UNKNOWN, userId);
}
return filterApp;
@@ -4468,9 +4472,11 @@
final Object obj = mSettings.getSettingBase(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
- final int numPackages = sus.packages.size();
+ final ArraySet<PackageStateInternal> packageStates =
+ (ArraySet<PackageStateInternal>) sus.getPackageStates();
+ final int numPackages = packageStates.size();
for (int index = 0; index < numPackages; index++) {
- final PackageSetting ps = sus.packages.valueAt(index);
+ final PackageStateInternal ps = packageStates.valueAt(index);
if (ps.isPrivileged()) {
return true;
}
@@ -5290,8 +5296,9 @@
final AndroidPackage pkg = ((PackageSetting) setting).getPkg();
return pkg != null && mAppsFilter.canQueryPackage(pkg, targetPackageName);
} else {
- final ArraySet<PackageSetting> callingSharedPkgSettings =
- ((SharedUserSetting) setting).packages;
+ final ArraySet<PackageStateInternal> callingSharedPkgSettings =
+ (ArraySet<PackageStateInternal>)
+ ((SharedUserSetting) setting).getPackageStates();
for (int i = callingSharedPkgSettings.size() - 1; i >= 0; i--) {
final AndroidPackage pkg = callingSharedPkgSettings.valueAt(i).getPkg();
if (pkg != null && mAppsFilter.canQueryPackage(pkg, targetPackageName)) {
@@ -5595,10 +5602,12 @@
final SettingBase settingBase = mSettings.getSettingBase(appId);
if (settingBase instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) settingBase;
+ final ArraySet<PackageStateInternal> packageStates =
+ (ArraySet<PackageStateInternal>) sus.getPackageStates();
int vers = Build.VERSION_CODES.CUR_DEVELOPMENT;
- final int numPackages = sus.packages.size();
+ final int numPackages = packageStates.size();
for (int index = 0; index < numPackages; index++) {
- final PackageSetting ps = sus.packages.valueAt(index);
+ final PackageStateInternal ps = packageStates.valueAt(index);
if (ps.getPkg() != null) {
int v = ps.getPkg().getTargetSdkVersion();
if (v < vers) vers = v;
diff --git a/services/core/java/com/android/server/pm/DumpHelper.java b/services/core/java/com/android/server/pm/DumpHelper.java
index 5ab0c4c..d5a882b 100644
--- a/services/core/java/com/android/server/pm/DumpHelper.java
+++ b/services/core/java/com/android/server/pm/DumpHelper.java
@@ -37,6 +37,8 @@
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.function.BiConsumer;
@@ -51,6 +53,7 @@
mPm = pm;
}
+ @NeverCompile // Avoid size overhead of debugging code.
public void doDump(FileDescriptor fd, PrintWriter pw, String[] args) {
DumpState dumpState = new DumpState();
ArraySet<String> permissionNames = null;
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 684e6ba..2ef092e 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -3701,7 +3701,7 @@
&& sharedUserSetting != null) {
Log.d(TAG, "Shared UserID " + parsedPackage.getSharedUserId()
+ " (uid=" + sharedUserSetting.mAppId + "):"
- + " packages=" + sharedUserSetting.packages);
+ + " packages=" + sharedUserSetting.getPackageStates());
}
if (installedPkgSetting != null) {
oldSharedUserSetting = mPm.mSettings.getSharedUserSettingLPr(installedPkgSetting);
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index c4389a7..742cc02 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -357,6 +357,20 @@
}
}
+ /**
+ * Remove all invalid dirs under app data folder.
+ * All dirs are supposed to be valid file and package names.
+ */
+ public void cleanupInvalidPackageDirs(String uuid, int userId, int flags)
+ throws InstallerException {
+ if (!checkBeforeRemote()) return;
+ try {
+ mInstalld.cleanupInvalidPackageDirs(uuid, userId, flags);
+ } catch (Exception e) {
+ throw InstallerException.from(e);
+ }
+ }
+
public void moveCompleteApp(String fromUuid, String toUuid, String packageName,
int appId, String seInfo, int targetSdkVersion,
String fromCodePath) throws InstallerException {
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelper.java b/services/core/java/com/android/server/pm/PackageAbiHelper.java
index ca7c2db..1dbab90 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelper.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelper.java
@@ -18,15 +18,16 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.util.ArraySet;
import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
import com.android.server.pm.parsing.pkg.ParsedPackage;
+import com.android.server.pm.pkg.PackageStateInternal;
import java.io.File;
-import java.util.Set;
@@ -74,8 +75,8 @@
* belonging to the shared user.
*/
@Nullable
- String getAdjustedAbiForSharedUser(
- Set<PackageSetting> packagesForUser, AndroidPackage scannedPackage);
+ String getAdjustedAbiForSharedUser(ArraySet<? extends PackageStateInternal> packagesForUser,
+ AndroidPackage scannedPackage);
/**
* The native library paths and related properties that should be set on a
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
index 1af508f..73d81ba 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
@@ -34,6 +34,7 @@
import android.os.FileUtils;
import android.os.Trace;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.Pair;
import android.util.Slog;
@@ -41,6 +42,7 @@
import com.android.internal.util.ArrayUtils;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
+import com.android.server.pm.pkg.PackageStateInternal;
import dalvik.system.VMRuntime;
@@ -48,7 +50,6 @@
import java.io.File;
import java.io.IOException;
-import java.util.Set;
final class PackageAbiHelperImpl implements PackageAbiHelper {
@@ -496,7 +497,8 @@
@Override
@Nullable
public String getAdjustedAbiForSharedUser(
- Set<PackageSetting> packagesForUser, AndroidPackage scannedPackage) {
+ ArraySet<? extends PackageStateInternal> packagesForUser,
+ AndroidPackage scannedPackage) {
String requiredInstructionSet = null;
if (scannedPackage != null) {
String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(scannedPackage);
@@ -505,8 +507,8 @@
}
}
- PackageSetting requirer = null;
- for (PackageSetting ps : packagesForUser) {
+ PackageStateInternal requirer = null;
+ for (PackageStateInternal ps : packagesForUser) {
// If packagesForUser contains scannedPackage, we skip it. This will happen
// when scannedPackage is an update of an existing package. Without this check,
// we will never be able to change the ABI of any package belonging to a shared
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index d230004..ced1c7d 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -469,16 +469,16 @@
@Nullable
final StagedSession mStagedSession;
+ /**
+ * The callback to run when pre-reboot verification has ended. Used by {@link #abandon()}
+ * to delay session clean-up until it is safe to do so.
+ */
+ @GuardedBy("mLock")
+ @Nullable
+ private Runnable mPendingAbandonCallback;
+
@VisibleForTesting
public class StagedSession implements StagingManager.StagedSession {
- /**
- * The callback to run when pre-reboot verification has ended. Used by {@link #abandon()}
- * to delay session clean-up until it is safe to do so.
- */
- @GuardedBy("mLock")
- @Nullable
- private Runnable mPendingAbandonCallback;
-
@Override
public List<StagingManager.StagedSession> getChildSessions() {
if (!params.isMultiPackage) {
@@ -575,9 +575,7 @@
@Override
public boolean isInTerminalState() {
- synchronized (mLock) {
- return mSessionApplied || mSessionFailed;
- }
+ return PackageInstallerSession.this.isInTerminalState();
}
@Override
@@ -612,48 +610,7 @@
@Override
public void abandon() {
- final Runnable r;
- synchronized (mLock) {
- assertNotChild("StagedSession#abandon");
- assertCallerIsOwnerOrRootOrSystem();
- if (isInTerminalState()) {
- // We keep the session in the database if it's in a finalized state. It will be
- // removed by PackageInstallerService when the last update time is old enough.
- // Also, in such cases cleanStageDir() has already been executed so no need to
- // do it now.
- return;
- }
- mDestroyed = true;
- r = () -> {
- assertNotLocked("abandonStaged");
- if (mCommitted.get()) {
- mStagingManager.abortCommittedSession(this);
- }
- destroy();
- dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
- maybeFinishChildSessions(INSTALL_FAILED_ABORTED,
- "Session was abandoned because the parent session is abandoned");
- };
- if (mStageDirInUse) {
- // Pre-reboot verification is ongoing, not safe to clean up the session yet.
- mPendingAbandonCallback = r;
- mCallback.onSessionChanged(PackageInstallerSession.this);
- return;
- }
- }
- r.run();
- }
-
- /**
- * Called when pre-reboot verification has ended.
- * Now it is safe to clean up the session if {@link #abandon()} has been called previously.
- */
- private void notifyEndPreRebootVerification() {
- synchronized (mLock) {
- Preconditions.checkState(mStageDirInUse);
- mStageDirInUse = false;
- }
- dispatchPendingAbandonCallback();
+ PackageInstallerSession.this.abandon();
}
/**
@@ -669,17 +626,6 @@
Preconditions.checkArgument(!isInTerminalState());
verify();
}
-
- private void dispatchPendingAbandonCallback() {
- final Runnable callback;
- synchronized (mLock) {
- callback = mPendingAbandonCallback;
- mPendingAbandonCallback = null;
- }
- if (callback != null) {
- callback.run();
- }
- }
}
/**
@@ -1138,9 +1084,15 @@
}
}
+ private boolean isInTerminalState() {
+ synchronized (mLock) {
+ return mSessionApplied || mSessionFailed;
+ }
+ }
+
/** Returns true if a staged session has reached a final state and can be forgotten about */
public boolean isStagedAndInTerminalState() {
- return params.isStaged && mStagedSession.isInTerminalState();
+ return params.isStaged && isInTerminalState();
}
private void assertNotLocked(String cookie) {
@@ -1968,9 +1920,6 @@
private void onSessionVerificationFailure(int error, String msg) {
Slog.e(TAG, "Failed to verify session " + sessionId);
- if (isStaged()) {
- mStagedSession.notifyEndPreRebootVerification();
- }
// Dispatch message to remove session from PackageInstallerService.
dispatchSessionFinished(error, msg, null);
maybeFinishChildSessions(error, msg);
@@ -2279,6 +2228,17 @@
}
}
+ @GuardedBy("mLock")
+ private void markStageDirInUseLocked() throws PackageManagerException {
+ if (mDestroyed) {
+ throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
+ "Session destroyed");
+ }
+ // Set this flag to prevent abandon() from deleting staging files when verification or
+ // installation is about to start.
+ mStageDirInUse = true;
+ }
+
private void parseApkAndExtractNativeLibraries() throws PackageManagerException {
synchronized (mLock) {
if (mStageDirInUse) {
@@ -2324,19 +2284,14 @@
private void verifyNonStaged()
throws PackageManagerException {
synchronized (mLock) {
- if (mDestroyed) {
- throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
- "Session destroyed");
- }
- // Set this flag to prevent abandon() from deleting staging files while verification is
- // in progress. For staged sessions, we will reset this flag when verification is done
- // so abandon() can take effect. For non-staged sessions, the staging files will be
- // deleted when install is completed (no matter success or not). No need to reset
- // the flag.
- mStageDirInUse = true;
+ markStageDirInUseLocked();
}
mSessionProvider.getSessionVerifier().verify(this, (error, msg) -> {
mHandler.post(() -> {
+ if (dispatchPendingAbandonCallback()) {
+ // No need to continue if abandoned
+ return;
+ }
if (error == INSTALL_SUCCEEDED) {
onVerificationComplete();
} else {
@@ -2426,7 +2381,6 @@
@WorkerThread
private void onVerificationComplete() {
if (isStaged()) {
- mStagedSession.notifyEndPreRebootVerification();
mStagingManager.commitSession(mStagedSession);
sendUpdateToRemoteStatusReceiver(INSTALL_SUCCEEDED, "Session staged", null);
return;
@@ -2444,14 +2398,11 @@
private InstallParams makeInstallParams(CompletableFuture<Void> future)
throws PackageManagerException {
synchronized (mLock) {
- if (mDestroyed) {
- throw new PackageManagerException(
- INSTALL_FAILED_INTERNAL_ERROR, "Session destroyed");
- }
if (!mSealed) {
throw new PackageManagerException(
INSTALL_FAILED_INTERNAL_ERROR, "Session not sealed");
}
+ markStageDirInUseLocked();
}
if (isMultiPackage()) {
@@ -3523,22 +3474,6 @@
}
}
- private void abandonNonStaged() {
- synchronized (mLock) {
- assertNotChild("abandonNonStaged");
- assertCallerIsOwnerOrRootOrSystem();
- if (mStageDirInUse) {
- if (LOGD) Slog.d(TAG, "Ignoring abandon for staging files are in use");
- return;
- }
- mDestroyed = true;
- }
- destroy();
- dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
- maybeFinishChildSessions(INSTALL_FAILED_ABORTED,
- "Session was abandoned because the parent session is abandoned");
- }
-
private void assertNotChild(String cookie) {
if (hasParentSessionId()) {
throw new IllegalStateException(cookie + " can't be called on a child session, id="
@@ -3546,13 +3481,56 @@
}
}
+ /**
+ * Called when verification has completed. Now it is safe to clean up the session
+ * if {@link #abandon()} has been called previously.
+ *
+ * @return True if this session has been abandoned.
+ */
+ private boolean dispatchPendingAbandonCallback() {
+ final Runnable callback;
+ synchronized (mLock) {
+ Preconditions.checkState(mStageDirInUse);
+ mStageDirInUse = false;
+ callback = mPendingAbandonCallback;
+ mPendingAbandonCallback = null;
+ }
+ if (callback != null) {
+ callback.run();
+ return true;
+ }
+ return false;
+ }
+
@Override
public void abandon() {
- if (params.isStaged) {
- mStagedSession.abandon();
- } else {
- abandonNonStaged();
+ final Runnable r;
+ synchronized (mLock) {
+ assertNotChild("abandon");
+ assertCallerIsOwnerOrRootOrSystem();
+ if (isInTerminalState()) {
+ // Finalized sessions have been properly cleaned up. No need to abandon them.
+ return;
+ }
+ mDestroyed = true;
+ r = () -> {
+ assertNotLocked("abandonStaged");
+ if (isStaged() && mCommitted.get()) {
+ mStagingManager.abortCommittedSession(mStagedSession);
+ }
+ destroy();
+ dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
+ maybeFinishChildSessions(INSTALL_FAILED_ABORTED,
+ "Session was abandoned because the parent session is abandoned");
+ };
+ if (mStageDirInUse) {
+ // Verification is ongoing, not safe to clean up the session yet.
+ mPendingAbandonCallback = r;
+ mCallback.onSessionChanged(this);
+ return;
+ }
}
+ r.run();
}
@Override
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 5c68fac..725e92a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2005,7 +2005,7 @@
ScanPackageUtils.applyAdjustedAbiToSharedUser(
setting, null /*scannedPackage*/,
mInjector.getAbiHelper().getAdjustedAbiForSharedUser(
- setting.packages, null /*scannedPackage*/));
+ setting.getPackageStates(), null /*scannedPackage*/));
if (changedAbiCodePath != null && changedAbiCodePath.size() > 0) {
for (int i = changedAbiCodePath.size() - 1; i >= 0; --i) {
final String codePathString = changedAbiCodePath.get(i);
@@ -6255,6 +6255,13 @@
}
});
+ if (wasNotLaunched) {
+ final String installerPackageName = wasNotLaunchedAndInstallerPackageName.second;
+ if (installerPackageName != null) {
+ notifyFirstLaunch(packageName, installerPackageName, userId);
+ }
+ }
+
scheduleWritePackageRestrictions(userId);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 0dae12f..2f56bfe 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -573,9 +573,10 @@
// Special case: if the sharedUserId capability check failed it could be due to this
// being the only package in the sharedUserId so far and the lineage being updated to
// deny the sharedUserId capability of the previous key in the lineage.
- if (!match && sharedUserSetting.packages.size() == 1
- && sharedUserSetting.packages
- .valueAt(0).getPackageName().equals(packageName)) {
+ final ArraySet<PackageStateInternal> susPackageStates =
+ (ArraySet<PackageStateInternal>) sharedUserSetting.getPackageStates();
+ if (!match && susPackageStates.size() == 1
+ && susPackageStates.valueAt(0).getPackageName().equals(packageName)) {
match = true;
}
if (!match && compareCompat) {
@@ -605,7 +606,8 @@
// Iterate over all of the packages in the sharedUserId and ensure any that are signed
// with a key in this package's lineage have the SHARED_USER_ID capability granted.
if (parsedSignatures.hasPastSigningCertificates()) {
- for (PackageSetting shUidPkgSetting : sharedUserSetting.packages) {
+ for (int i = 0; i < susPackageStates.size(); i++) {
+ PackageStateInternal shUidPkgSetting = susPackageStates.valueAt(i);
// if the current package in the sharedUserId is the package being updated then
// skip this check as the update may revoke the sharedUserId capability from
// the key with which this app was previously signed.
diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java
index 99d9d58..33f0b54 100644
--- a/services/core/java/com/android/server/pm/ScanPackageUtils.java
+++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java
@@ -62,6 +62,7 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
import android.util.Slog;
@@ -85,6 +86,7 @@
import com.android.server.pm.pkg.component.ParsedProvider;
import com.android.server.pm.pkg.component.ParsedService;
import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
+import com.android.server.utils.WatchedArraySet;
import dalvik.system.VMRuntime;
@@ -94,7 +96,6 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import java.util.Set;
import java.util.UUID;
/**
@@ -400,7 +401,7 @@
// code and package path correct.
changedAbiCodePath = applyAdjustedAbiToSharedUser(oldSharedUserSetting,
parsedPackage, packageAbiHelper.getAdjustedAbiForSharedUser(
- oldSharedUserSetting.packages, parsedPackage));
+ oldSharedUserSetting.getPackageStates(), parsedPackage));
}
parsedPackage.setFactoryTest(isUnderFactoryTest && parsedPackage.getRequestedPermissions()
@@ -891,7 +892,7 @@
/**
* Applies the adjusted ABI calculated by
- * {@link PackageAbiHelper#getAdjustedAbiForSharedUser(Set, AndroidPackage)} to all
+ * {@link PackageAbiHelper#getAdjustedAbiForSharedUser(ArraySet, AndroidPackage)} to all
* relevant packages and settings.
* @param sharedUserSetting The {@code SharedUserSetting} to adjust
* @param scannedPackage the package being scanned or null
@@ -904,7 +905,10 @@
scannedPackage.setPrimaryCpuAbi(adjustedAbi);
}
List<String> changedAbiCodePath = null;
- for (PackageSetting ps : sharedUserSetting.packages) {
+ final WatchedArraySet<PackageSetting> sharedUserPackageSettings =
+ sharedUserSetting.getPackageSettings();
+ for (int i = 0; i < sharedUserPackageSettings.size(); i++) {
+ PackageSetting ps = sharedUserPackageSettings.valueAt(i);
if (scannedPackage == null
|| !scannedPackage.getPackageName().equals(ps.getPackageName())) {
if (ps.getPrimaryCpuAbi() != null) {
@@ -912,6 +916,7 @@
}
ps.setPrimaryCpuAbi(adjustedAbi);
+ ps.onChanged();
if (ps.getPkg() != null) {
if (!TextUtils.equals(adjustedAbi,
AndroidPackageUtils.getRawPrimaryCpuAbi(ps.getPkg()))) {
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 5966917..4d7da1b 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -24,6 +24,7 @@
import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN;
import static android.content.pm.PackageManager.UNINSTALL_REASON_USER_TYPE;
+import static android.os.Process.INVALID_UID;
import static android.os.Process.PACKAGE_INFO_GID;
import static android.os.Process.SYSTEM_UID;
@@ -136,6 +137,8 @@
import com.android.server.utils.WatchedSparseIntArray;
import com.android.server.utils.Watcher;
+import dalvik.annotation.optimization.NeverCompile;
+
import libcore.io.IoUtils;
import org.xmlpull.v1.XmlPullParser;
@@ -923,11 +926,30 @@
removeKeys.add(entry.getKey());
continue;
}
+ boolean changed = false;
// remove packages that are no longer installed
- sus.packages.removeIf(ps -> mPackages.get(ps.getPackageName()) == null);
- sus.mDisabledPackages.removeIf(
- ps -> mDisabledSysPackages.get(ps.getPackageName()) == null);
- if (sus.packages.isEmpty() && sus.mDisabledPackages.isEmpty()) {
+ WatchedArraySet<PackageSetting> sharedUserPackageSettings = sus.getPackageSettings();
+ for (int i = sharedUserPackageSettings.size() - 1; i >= 0; i--) {
+ PackageSetting ps = sharedUserPackageSettings.valueAt(i);
+ if (mPackages.get(ps.getPackageName()) == null) {
+ sharedUserPackageSettings.removeAt(i);
+ changed = true;
+ }
+ }
+ WatchedArraySet<PackageSetting> sharedUserDisabledPackageSettings =
+ sus.getDisabledPackageSettings();
+ for (int i = sharedUserDisabledPackageSettings.size() - 1; i >= 0; i--) {
+ PackageSetting ps = sharedUserDisabledPackageSettings.valueAt(i);
+ if (mDisabledSysPackages.get(ps.getPackageName()) == null) {
+ sharedUserDisabledPackageSettings.removeAt(i);
+ changed = true;
+ }
+ }
+ if (changed) {
+ sus.onChanged();
+ }
+ if (sharedUserPackageSettings.isEmpty()
+ && sharedUserDisabledPackageSettings.isEmpty()) {
removeValues.add(sus);
}
}
@@ -1098,6 +1120,9 @@
"Updating application package " + pkgName + " failed");
}
pkgSetting.setSharedUserAppId(sharedUser.mAppId);
+ } else {
+ // migrating off shared user
+ pkgSetting.setSharedUserAppId(INVALID_UID);
}
if (!pkgSetting.getPath().equals(codePath)) {
@@ -1289,7 +1314,8 @@
}
boolean checkAndPruneSharedUserLPw(SharedUserSetting s, boolean skipCheck) {
- if (skipCheck || (s.packages.isEmpty() && s.mDisabledPackages.isEmpty())) {
+ if (skipCheck || (s.getPackageStates().isEmpty()
+ && s.getDisabledPackageStates().isEmpty())) {
if (mSharedUsers.remove(s.name) != null) {
removeAppIdLPw(s.mAppId);
return true;
@@ -4494,6 +4520,7 @@
pw.decreaseIndent();
}
+ @NeverCompile // Avoid size overhead of debugging code.
void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
ArraySet<String> permissionNames, PackageSetting ps,
LegacyPermissionState permissionsState, SimpleDateFormat sdf, Date date,
@@ -5136,11 +5163,13 @@
pw.print(prefix); pw.print("userId="); pw.println(su.mAppId);
pw.print(prefix); pw.println("Packages");
- final int numPackages = su.packages.size();
+ final ArraySet<PackageStateInternal> susPackageStates =
+ (ArraySet<PackageStateInternal>) su.getPackageStates();
+ final int numPackages = susPackageStates.size();
for (int i = 0; i < numPackages; i++) {
- final PackageSetting ps = su.packages.valueAt(i);
+ final PackageStateInternal ps = susPackageStates.valueAt(i);
if (ps != null) {
- pw.print(prefix + " "); pw.println(ps.toString());
+ pw.print(prefix + " "); pw.println(ps);
} else {
pw.print(prefix + " "); pw.println("NULL?!");
}
diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java
index d0e1e6c..4d0bbc6 100644
--- a/services/core/java/com/android/server/pm/SharedUserSetting.java
+++ b/services/core/java/com/android/server/pm/SharedUserSetting.java
@@ -33,6 +33,7 @@
import com.android.server.pm.pkg.component.ParsedProcess;
import com.android.server.pm.pkg.component.ParsedProcessImpl;
import com.android.server.utils.SnapshotCache;
+import com.android.server.utils.WatchedArraySet;
import libcore.util.EmptyArray;
@@ -56,14 +57,14 @@
/** @see SharedUserApi#getSeInfoTargetSdkVersion() **/
int seInfoTargetSdkVersion;
- final ArraySet<PackageSetting> packages;
- private ArraySet<PackageStateInternal> mPackagesSnapshot;
+ private final WatchedArraySet<PackageSetting> mPackages;
+ private final SnapshotCache<WatchedArraySet<PackageSetting>> mPackagesSnapshot;
// It is possible for a system app to leave shared user ID by an update.
// We need to keep track of the shadowed PackageSettings so that it is possible to uninstall
// the update and revert the system app back into the original shared user ID.
- final ArraySet<PackageSetting> mDisabledPackages;
- private ArraySet<PackageStateInternal> mDisabledPackagesSnapshot;
+ final WatchedArraySet<PackageSetting> mDisabledPackages;
+ private final SnapshotCache<WatchedArraySet<PackageSetting>> mDisabledPackagesSnapshot;
final PackageSignatures signatures = new PackageSignatures();
Boolean signaturesChanged;
@@ -89,8 +90,12 @@
uidPrivateFlags = _pkgPrivateFlags;
name = _name;
seInfoTargetSdkVersion = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
- packages = new ArraySet<>();
- mDisabledPackages = new ArraySet<>();
+ mPackages = new WatchedArraySet<>();
+ mPackagesSnapshot = new SnapshotCache.Auto<>(mPackages, mPackages,
+ "SharedUserSetting.packages");
+ mDisabledPackages = new WatchedArraySet<>();
+ mDisabledPackagesSnapshot = new SnapshotCache.Auto<>(mDisabledPackages, mDisabledPackages,
+ "SharedUserSetting.mDisabledPackages");
processes = new ArrayMap<>();
mSnapshot = makeCache();
}
@@ -102,20 +107,10 @@
mAppId = orig.mAppId;
uidFlags = orig.uidFlags;
uidPrivateFlags = orig.uidPrivateFlags;
- packages = new ArraySet<>(orig.packages);
- if (!packages.isEmpty()) {
- mPackagesSnapshot = new ArraySet<>();
- for (int index = 0; index < packages.size(); index++) {
- mPackagesSnapshot.add(new PackageSetting(packages.valueAt(index)));
- }
- }
- mDisabledPackages = new ArraySet<>(orig.mDisabledPackages);
- if (!mDisabledPackages.isEmpty()) {
- mDisabledPackagesSnapshot = new ArraySet<>();
- for (int index = 0; index < mDisabledPackages.size(); index++) {
- mDisabledPackagesSnapshot.add(new PackageSetting(mDisabledPackages.valueAt(index)));
- }
- }
+ mPackages = orig.mPackagesSnapshot.snapshot();
+ mPackagesSnapshot = new SnapshotCache.Sealed<>();
+ mDisabledPackages = orig.mDisabledPackagesSnapshot.snapshot();
+ mDisabledPackagesSnapshot = new SnapshotCache.Sealed<>();
// A SigningDetails seems to consist solely of final attributes, so
// it is safe to copy the reference.
signatures.mSigningDetails = orig.signatures.mSigningDetails;
@@ -161,20 +156,22 @@
}
boolean removePackage(PackageSetting packageSetting) {
- if (!packages.remove(packageSetting)) {
+ if (!mPackages.remove(packageSetting)) {
return false;
}
// recalculate the pkgFlags for this shared user if needed
if ((this.getFlags() & packageSetting.getFlags()) != 0) {
int aggregatedFlags = uidFlags;
- for (PackageSetting ps : packages) {
+ for (int i = 0; i < mPackages.size(); i++) {
+ PackageSetting ps = mPackages.valueAt(i);
aggregatedFlags |= ps.getFlags();
}
setFlags(aggregatedFlags);
}
if ((this.getPrivateFlags() & packageSetting.getPrivateFlags()) != 0) {
int aggregatedPrivateFlags = uidPrivateFlags;
- for (PackageSetting ps : packages) {
+ for (int i = 0; i < mPackages.size(); i++) {
+ PackageSetting ps = mPackages.valueAt(i);
aggregatedPrivateFlags |= ps.getPrivateFlags();
}
setPrivateFlags(aggregatedPrivateFlags);
@@ -188,10 +185,10 @@
void addPackage(PackageSetting packageSetting) {
// If this is the first package added to this shared user, temporarily (until next boot) use
// its targetSdkVersion when assigning seInfo for the shared user.
- if ((packages.size() == 0) && (packageSetting.getPkg() != null)) {
+ if ((mPackages.size() == 0) && (packageSetting.getPkg() != null)) {
seInfoTargetSdkVersion = packageSetting.getPkg().getTargetSdkVersion();
}
- if (packages.add(packageSetting)) {
+ if (mPackages.add(packageSetting)) {
setFlags(this.getFlags() | packageSetting.getFlags());
setPrivateFlags(this.getPrivateFlags() | packageSetting.getPrivateFlags());
onChanged();
@@ -204,11 +201,12 @@
@NonNull
@Override
public List<AndroidPackage> getPackages() {
- if (packages == null || packages.size() == 0) {
+ if (mPackages == null || mPackages.size() == 0) {
return Collections.emptyList();
}
- final ArrayList<AndroidPackage> pkgList = new ArrayList<>(packages.size());
- for (PackageSetting ps : packages) {
+ final ArrayList<AndroidPackage> pkgList = new ArrayList<>(mPackages.size());
+ for (int i = 0; i < mPackages.size(); i++) {
+ PackageSetting ps = mPackages.valueAt(i);
if ((ps == null) || (ps.getPkg() == null)) {
continue;
}
@@ -229,10 +227,11 @@
* restrictive selinux domain.
*/
public void fixSeInfoLocked() {
- if (packages == null || packages.size() == 0) {
+ if (mPackages == null || mPackages.size() == 0) {
return;
}
- for (PackageSetting ps : packages) {
+ for (int i = 0; i < mPackages.size(); i++) {
+ PackageSetting ps = mPackages.valueAt(i);
if ((ps == null) || (ps.getPkg() == null)) {
continue;
}
@@ -242,7 +241,8 @@
}
}
- for (PackageSetting ps : packages) {
+ for (int i = 0; i < mPackages.size(); i++) {
+ PackageSetting ps = mPackages.valueAt(i);
if ((ps == null) || (ps.getPkg() == null)) {
continue;
}
@@ -258,8 +258,8 @@
*/
public void updateProcesses() {
processes.clear();
- for (int i = packages.size() - 1; i >= 0; i--) {
- final AndroidPackage pkg = packages.valueAt(i).getPkg();
+ for (int i = mPackages.size() - 1; i >= 0; i--) {
+ final AndroidPackage pkg = mPackages.valueAt(i).getPkg();
if (pkg != null) {
addProcesses(pkg.getProcesses());
}
@@ -269,7 +269,8 @@
/** Returns userIds which doesn't have any packages with this sharedUserId */
public int[] getNotInstalledUserIds() {
int[] excludedUserIds = null;
- for (PackageSetting ps : packages) {
+ for (int i = 0; i < mPackages.size(); i++) {
+ PackageSetting ps = mPackages.valueAt(i);
final int[] userIds = ps.getNotInstalledUserIds();
if (excludedUserIds == null) {
excludedUserIds = userIds;
@@ -291,8 +292,8 @@
this.uidFlags = sharedUser.uidFlags;
this.uidPrivateFlags = sharedUser.uidPrivateFlags;
this.seInfoTargetSdkVersion = sharedUser.seInfoTargetSdkVersion;
- this.packages.clear();
- this.packages.addAll(sharedUser.packages);
+ this.mPackages.clear();
+ this.mPackages.addAll(sharedUser.mPackages);
this.signaturesChanged = sharedUser.signaturesChanged;
if (sharedUser.processes != null) {
final int numProcs = sharedUser.processes.size();
@@ -335,22 +336,24 @@
return seInfoTargetSdkVersion;
}
+ public WatchedArraySet<PackageSetting> getPackageSettings() {
+ return mPackages;
+ }
+
+ public WatchedArraySet<PackageSetting> getDisabledPackageSettings() {
+ return mDisabledPackages;
+ }
+
@NonNull
@Override
public ArraySet<? extends PackageStateInternal> getPackageStates() {
- if (mPackagesSnapshot != null) {
- return mPackagesSnapshot;
- }
- return packages;
+ return mPackages.untrackedStorage();
}
@NonNull
@Override
public ArraySet<? extends PackageStateInternal> getDisabledPackageStates() {
- if (mDisabledPackagesSnapshot != null) {
- return mDisabledPackagesSnapshot;
- }
- return mDisabledPackages;
+ return mDisabledPackages.untrackedStorage();
}
@NonNull
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index bda2589..8921fee 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -442,6 +442,16 @@
sortShortcutsToActivities();
final ArrayList<ShortcutInfo> activityShortcuts = all.get(newShortcut.getActivity());
+ if (activityShortcuts != null && activityShortcuts.size() > maxShortcuts) {
+ Slog.e(TAG, "Error pushing shortcut. There are already "
+ + activityShortcuts.size() + " shortcuts, exceeding the " + maxShortcuts
+ + " shortcuts limit when pushing the new shortcut " + newShortcut
+ + ". Id of shortcuts currently available in system memory are "
+ + activityShortcuts.stream().map(ShortcutInfo::getId)
+ .collect(Collectors.joining(",", "[", "]")));
+ // TODO: This should not have happened. If it does, identify the root cause where
+ // possible, otherwise bail-out early to prevent memory issue.
+ }
if (activityShortcuts != null && activityShortcuts.size() == maxShortcuts) {
// Max has reached. Delete the shortcut with lowest rank.
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index f87063a..9c74dd7 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -71,6 +71,14 @@
"include-filter": "com.android.server.pm.test.OverlayActorVisibilityTest"
}
]
+ },
+ {
+ "name": "CtsSharedUserMigrationTestCases",
+ "options": [
+ {
+ "include-filter": "android.uidmigration.cts"
+ }
+ ]
}
],
"presubmit-large": [
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 60d2fc1..49553f4 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -740,7 +740,7 @@
grantPermissionsToSystemPackage(pm,
getDefaultSystemHandlerActivityPackage(pm,
DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, userId),
- userId, CONTACTS_PERMISSIONS);
+ userId, CONTACTS_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Maps
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0)) {
@@ -775,7 +775,7 @@
grantPermissionsToSystemPackage(pm, voiceInteractPackageName, userId,
CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS,
PHONE_PERMISSIONS, SMS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS,
- NEARBY_DEVICES_PERMISSIONS);
+ NEARBY_DEVICES_PERMISSIONS, NOTIFICATION_PERMISSIONS);
}
}
@@ -784,7 +784,8 @@
grantPermissionsToSystemPackage(pm,
getDefaultSystemHandlerActivityPackage(pm,
SearchManager.INTENT_ACTION_GLOBAL_SEARCH, userId),
- userId, MICROPHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS);
+ userId, MICROPHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS,
+ NOTIFICATION_PERMISSIONS);
}
// Voice recognition
diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
index 410fa97..da22b17 100644
--- a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
+++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
@@ -37,6 +37,8 @@
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedArraySet;
+import java.util.Collections;
+import java.util.Map;
import java.util.Objects;
@DataClass(genConstructor = false, genBuilder = false, genEqualsHashCode = true)
@@ -540,6 +542,13 @@
return this;
}
+ @NonNull
+ @Override
+ public Map<String, OverlayPaths> getSharedLibraryOverlayPaths() {
+ return mSharedLibraryOverlayPaths == null
+ ? Collections.emptyMap() : mSharedLibraryOverlayPaths;
+ }
+
@Override
public boolean equals(@Nullable Object o) {
// You can override field equality logic by defining either of the methods like:
@@ -703,11 +712,6 @@
}
@DataClass.Generated.Member
- public @Nullable WatchedArrayMap<String,OverlayPaths> getSharedLibraryOverlayPaths() {
- return mSharedLibraryOverlayPaths;
- }
-
- @DataClass.Generated.Member
public @Nullable String getSplashScreenTheme() {
return mSplashScreenTheme;
}
@@ -774,10 +778,10 @@
}
@DataClass.Generated(
- time = 1644638242940L,
+ time = 1645040852569L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java",
- inputSignatures = "protected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate long mFirstInstallTime\nprivate final @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTime(long)\npublic @java.lang.Override boolean equals(java.lang.Object)\npublic @java.lang.Override int hashCode()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)")
+ inputSignatures = "protected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate long mFirstInstallTime\nprivate final @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTime(long)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @java.lang.Override boolean equals(java.lang.Object)\npublic @java.lang.Override int hashCode()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)")
@Deprecated
private void __metadata() {}
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java
index f199841..91d2010 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java
@@ -887,7 +887,9 @@
| flag(pkg.hasRequestForegroundServiceExemption(),
ApplicationInfo.PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION)
| flag(pkg.areAttributionsUserVisible(),
- ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE);
+ ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE)
+ | flag(pkg.isOnBackInvokedCallbackEnabled(),
+ ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK);
// @formatter:on
return privateFlagsExt;
}
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java
index 1754877..cdc2b12 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java
@@ -387,6 +387,8 @@
*/
ParsingPackage setKnownActivityEmbeddingCerts(Set<String> knownActivityEmbeddingCerts);
+ ParsingPackage setOnBackInvokedCallbackEnabled(boolean enableOnBackInvokedCallback);
+
// TODO(b/135203078): This class no longer has access to ParsedPackage, find a replacement
// for moving to the next step
@CallSuper
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java
index c4b1275..177eaca 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java
@@ -548,6 +548,7 @@
private static final long RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED = 1L << 48;
private static final long SDK_LIBRARY = 1L << 49;
private static final long INHERIT_KEYSTORE_KEYS = 1L << 50;
+ private static final long ENABLE_ON_BACK_INVOKED_CALLBACK = 1L << 51;
}
private ParsingPackageImpl setBoolean(@Booleans.Values long flag, boolean value) {
@@ -2397,6 +2398,11 @@
}
@Override
+ public boolean isOnBackInvokedCallbackEnabled() {
+ return getBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK);
+ }
+
+ @Override
public ParsingPackageImpl setBaseRevisionCode(int value) {
baseRevisionCode = value;
return this;
@@ -2995,4 +3001,10 @@
mKnownActivityEmbeddingCerts = knownEmbeddingCerts;
return this;
}
+
+ @Override
+ public ParsingPackage setOnBackInvokedCallbackEnabled(boolean value) {
+ setBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK, value);
+ return this;
+ }
}
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java
index 4b659a14..428374f 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java
@@ -355,4 +355,9 @@
* @see R.styleable#AndroidManifest_inheritKeyStoreKeys
*/
boolean shouldInheritKeyStoreKeys();
+
+ /**
+ * @see R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback
+ */
+ boolean isOnBackInvokedCallbackEnabled();
}
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
index a891980..f30daa9 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
@@ -2202,8 +2202,9 @@
.setAutoRevokePermissions(anInt(R.styleable.AndroidManifestApplication_autoRevokePermissions, sa))
.setAttributionsAreUserVisible(bool(false, R.styleable.AndroidManifestApplication_attributionsAreUserVisible, sa))
.setResetEnabledSettingsOnAppDataCleared(bool(false,
- R.styleable.AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared,
- sa))
+ R.styleable.AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared,
+ sa))
+ .setOnBackInvokedCallbackEnabled(bool(false, R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback, sa))
// targetSdkVersion gated
.setAllowAudioPlaybackCapture(bool(targetSdk >= Build.VERSION_CODES.Q, R.styleable.AndroidManifestApplication_allowAudioPlaybackCapture, sa))
.setBaseHardwareAccelerated(bool(targetSdk >= Build.VERSION_CODES.ICE_CREAM_SANDWICH, R.styleable.AndroidManifestApplication_hardwareAccelerated, sa))
diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java
index 18c45e4..4ad6ed1 100644
--- a/services/core/java/com/android/server/policy/AppOpsPolicy.java
+++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java
@@ -33,6 +33,7 @@
import android.location.LocationManagerInternal;
import android.net.Uri;
import android.os.Binder;
+import android.os.Bundle;
import android.os.IBinder;
import android.os.PackageTagsList;
import android.os.Process;
@@ -342,8 +343,11 @@
+ Intent.ACTION_ACTIVITY_RECOGNIZER + ", ignoring!");
return;
}
- final String tagsList = resolvedService.serviceInfo.metaData.getString(
- ACTIVITY_RECOGNITION_TAGS);
+ final Bundle metaData = resolvedService.serviceInfo.metaData;
+ if (metaData == null) {
+ return;
+ }
+ final String tagsList = metaData.getString(ACTIVITY_RECOGNITION_TAGS);
if (!TextUtils.isEmpty(tagsList)) {
PackageTagsList packageTagsList = new PackageTagsList.Builder(1).add(
resolvedService.serviceInfo.packageName,
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 4b61970..4387249 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3547,6 +3547,10 @@
if (mCameraLensCoverState == lensCoverState) {
return;
}
+ if (!mContext.getResources().getBoolean(
+ R.bool.config_launchCameraOnCameraLensCoverToggle)) {
+ return;
+ }
if (mCameraLensCoverState == CAMERA_LENS_COVERED &&
lensCoverState == CAMERA_LENS_UNCOVERED) {
Intent intent;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index e523153..bd58472 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -128,6 +128,8 @@
import com.android.server.power.batterysaver.BatterySaverStateMachine;
import com.android.server.power.batterysaver.BatterySavingStats;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
@@ -1175,7 +1177,10 @@
@Override
public void onBootPhase(int phase) {
synchronized (mLock) {
- if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
+ if (phase == PHASE_SYSTEM_SERVICES_READY) {
+ systemReady();
+
+ } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
incrementBootCount();
} else if (phase == PHASE_BOOT_COMPLETED) {
@@ -1201,7 +1206,7 @@
}
}
- public void systemReady() {
+ private void systemReady() {
synchronized (mLock) {
mSystemReady = true;
mDreamManager = getLocalService(DreamManagerInternal.class);
@@ -4340,6 +4345,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
private void dumpInternal(PrintWriter pw) {
pw.println("POWER MANAGER (dumpsys power)\n");
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
index ffcb2bd..b4613a7 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
@@ -276,7 +276,7 @@
}
/**
- * Called by {@link PowerManagerService#systemReady}, *with no lock held.*
+ * Called by {@link PowerManagerService#onBootPhase}, *with no lock held.*
*/
public void systemReady() {
ConcurrentUtils.wtfIfLockHeld(TAG, mLock);
diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
index 1856786..fd64c75 100644
--- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
+++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
@@ -16,16 +16,11 @@
package com.android.server.rollback;
-import static com.android.internal.util.FrameworkStatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN;
-
import android.annotation.AnyThread;
import android.annotation.Nullable;
import android.annotation.WorkerThread;
-import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
@@ -240,64 +235,6 @@
return null;
}
- @WorkerThread
- private BroadcastReceiver listenForStagedSessionReady(RollbackManager rollbackManager,
- int rollbackId, @Nullable VersionedPackage logPackage) {
- assertInWorkerThread();
- BroadcastReceiver sessionUpdatedReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- handleStagedSessionChange(rollbackManager,
- rollbackId, this /* BroadcastReceiver */, logPackage);
- }
- };
- IntentFilter sessionUpdatedFilter =
- new IntentFilter(PackageInstaller.ACTION_SESSION_UPDATED);
- mContext.registerReceiver(sessionUpdatedReceiver, sessionUpdatedFilter, null, mHandler);
- return sessionUpdatedReceiver;
- }
-
- @WorkerThread
- private void handleStagedSessionChange(RollbackManager rollbackManager, int rollbackId,
- BroadcastReceiver listener, @Nullable VersionedPackage logPackage) {
- assertInWorkerThread();
- PackageInstaller packageInstaller =
- mContext.getPackageManager().getPackageInstaller();
- List<RollbackInfo> recentRollbacks =
- rollbackManager.getRecentlyCommittedRollbacks();
- for (int i = 0; i < recentRollbacks.size(); i++) {
- RollbackInfo recentRollback = recentRollbacks.get(i);
- int sessionId = recentRollback.getCommittedSessionId();
- if ((rollbackId == recentRollback.getRollbackId())
- && (sessionId != PackageInstaller.SessionInfo.INVALID_ID)) {
- PackageInstaller.SessionInfo sessionInfo =
- packageInstaller.getSessionInfo(sessionId);
- if (sessionInfo.isStagedSessionReady() && markStagedSessionHandled(rollbackId)) {
- mContext.unregisterReceiver(listener);
- saveStagedRollbackId(rollbackId, logPackage);
- WatchdogRollbackLogger.logEvent(logPackage,
- FrameworkStatsLog
- .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED,
- WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN,
- "");
- } else if (sessionInfo.isStagedSessionFailed()
- && markStagedSessionHandled(rollbackId)) {
- WatchdogRollbackLogger.logEvent(logPackage,
- FrameworkStatsLog
- .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
- WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN,
- "");
- mContext.unregisterReceiver(listener);
- }
- }
- }
-
- // Wait for all pending staged sessions to get handled before rebooting.
- if (isPendingStagedSessionsEmpty()) {
- mContext.getSystemService(PowerManager.class).reboot("Rollback staged install");
- }
- }
-
/**
* Returns {@code true} if staged session associated with {@code rollbackId} was marked
* as handled, {@code false} if already handled.
@@ -447,12 +384,12 @@
if (status == RollbackManager.STATUS_SUCCESS) {
if (rollback.isStaged()) {
int rollbackId = rollback.getRollbackId();
- mPendingStagedRollbackIds.add(rollbackId);
- BroadcastReceiver listener =
- listenForStagedSessionReady(rollbackManager, rollbackId,
- logPackage);
- handleStagedSessionChange(rollbackManager, rollbackId, listener,
- logPackage);
+ saveStagedRollbackId(rollbackId, logPackage);
+ WatchdogRollbackLogger.logEvent(logPackage,
+ FrameworkStatsLog
+ .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED,
+ reasonToLog, failedPackageToLog);
+
} else {
WatchdogRollbackLogger.logEvent(logPackage,
FrameworkStatsLog
@@ -460,14 +397,18 @@
reasonToLog, failedPackageToLog);
}
} else {
- if (rollback.isStaged()) {
- markStagedSessionHandled(rollback.getRollbackId());
- }
WatchdogRollbackLogger.logEvent(logPackage,
FrameworkStatsLog
.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
reasonToLog, failedPackageToLog);
}
+ if (rollback.isStaged()) {
+ markStagedSessionHandled(rollback.getRollbackId());
+ // Wait for all pending staged sessions to get handled before rebooting.
+ if (isPendingStagedSessionsEmpty()) {
+ mContext.getSystemService(PowerManager.class).reboot("Rollback staged install");
+ }
+ }
};
final LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver(result -> {
diff --git a/services/core/java/com/android/server/sensorprivacy/PersistedState.java b/services/core/java/com/android/server/sensorprivacy/PersistedState.java
index ce9fff5..e79efdb8 100644
--- a/services/core/java/com/android/server/sensorprivacy/PersistedState.java
+++ b/services/core/java/com/android/server/sensorprivacy/PersistedState.java
@@ -295,6 +295,11 @@
TypeUserSensor userSensor = states.keyAt(i);
SensorState sensorState = states.valueAt(i);
+ // Do not persist hardware toggle states. Will be restored on reboot
+ if (userSensor.mType != SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE) {
+ continue;
+ }
+
serializer.startTag(null, XML_TAG_SENSOR_STATE);
serializer.attributeInt(null, XML_ATTRIBUTE_TOGGLE_TYPE,
userSensor.mType);
@@ -473,7 +478,7 @@
for (int j = 0; j < numSensors; j++) {
int sensor = userIndividualEnabled.keyAt(j);
SensorState sensorState = userIndividualEnabled.valueAt(j);
- result.addState(SensorPrivacyManager.ToggleTypes.SOFTWARE,
+ result.addState(SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE,
userId, sensor, sensorState.getState(), sensorState.getLastChange());
}
}
diff --git a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
index 19c8cd2..a8e2d43 100644
--- a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
@@ -39,6 +39,8 @@
import static android.hardware.SensorPrivacyManager.Sources.QS_TILE;
import static android.hardware.SensorPrivacyManager.Sources.SETTINGS;
import static android.hardware.SensorPrivacyManager.Sources.SHELL;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_HARDWARE;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE;
import static android.os.UserHandle.USER_NULL;
import static android.service.SensorPrivacyIndividualEnabledSensorProto.UNKNOWN;
@@ -108,7 +110,6 @@
import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.Pair;
-import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.R;
@@ -127,6 +128,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
@@ -139,7 +141,7 @@
private static final boolean DEBUG_LOGGING = false;
private static final String SENSOR_PRIVACY_CHANNEL_ID = Context.SENSOR_PRIVACY_SERVICE;
- private static final String ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY =
+ private static final String ACTION_DISABLE_TOGGLE_SENSOR_PRIVACY =
SensorPrivacyService.class.getName() + ".action.disable_sensor_privacy";
public static final int REMINDER_DIALOG_DELAY_MILLIS = 500;
@@ -273,12 +275,12 @@
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- setIndividualSensorPrivacy(
+ setToggleSensorPrivacy(
((UserHandle) intent.getParcelableExtra(
Intent.EXTRA_USER)).getIdentifier(), OTHER,
intent.getIntExtra(EXTRA_SENSOR, UNKNOWN), false);
}
- }, new IntentFilter(ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY),
+ }, new IntentFilter(ACTION_DISABLE_TOGGLE_SENSOR_PRIVACY),
MANAGE_SENSOR_PRIVACY, null, Context.RECEIVER_EXPORTED);
mContext.registerReceiver(new BroadcastReceiver() {
@@ -299,7 +301,7 @@
mSensorPrivacyStateController.setSensorPrivacyListener(
mHandler,
(toggleType, userId, sensor, state) -> mHandler.handleSensorPrivacyChanged(
- userId, sensor, state.isEnabled()));
+ userId, toggleType, sensor, state.isEnabled()));
}
@Override
@@ -308,11 +310,12 @@
// Reset sensor privacy when restriction is added
if (!prevRestrictions.getBoolean(UserManager.DISALLOW_CAMERA_TOGGLE)
&& newRestrictions.getBoolean(UserManager.DISALLOW_CAMERA_TOGGLE)) {
- setIndividualSensorPrivacyUnchecked(userId, OTHER, CAMERA, false);
+ setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, userId, OTHER, CAMERA, false);
}
if (!prevRestrictions.getBoolean(UserManager.DISALLOW_MICROPHONE_TOGGLE)
&& newRestrictions.getBoolean(UserManager.DISALLOW_MICROPHONE_TOGGLE)) {
- setIndividualSensorPrivacyUnchecked(userId, OTHER, MICROPHONE, false);
+ setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, userId, OTHER, MICROPHONE,
+ false);
}
}
@@ -352,15 +355,15 @@
}
/**
- * Called when a sensor protected by individual sensor privacy is attempting to get used.
+ * Called when a sensor protected by toggle sensor privacy is attempting to get used.
*
* @param uid The uid of the app using the sensor
* @param packageName The package name of the app using the sensor
* @param sensor The sensor that is attempting to be used
*/
private void onSensorUseStarted(int uid, String packageName, int sensor) {
- UserHandle user = UserHandle.getUserHandleForUid(uid);
- if (!isIndividualSensorPrivacyEnabled(user.getIdentifier(), sensor)) {
+ UserHandle user = UserHandle.of(mCurrentUser);
+ if (!isCombinedToggleSensorPrivacyEnabled(sensor)) {
return;
}
@@ -371,12 +374,10 @@
}
synchronized (mLock) {
- UserHandle parentUser = UserHandle.of(mUserManagerInternal
- .getProfileParentId(user.getIdentifier()));
- if (mSuppressReminders.containsKey(new Pair<>(sensor, parentUser))) {
+ if (mSuppressReminders.containsKey(new Pair<>(sensor, user))) {
Log.d(TAG,
"Suppressed sensor privacy reminder for " + packageName + "/"
- + parentUser);
+ + user);
return;
}
}
@@ -406,8 +407,8 @@
}
tasksOfPackageUsingSensor.add(task);
- } else if (task.topActivity.flattenToString().equals(mContext.getResources()
- .getString(R.string.config_sensorUseStartedActivity))
+ } else if (task.topActivity.flattenToString().equals(
+ getSensorUseActivityName(new ArraySet<>(Arrays.asList(sensor))))
&& task.isFocused) {
enqueueSensorUseReminderDialogAsync(task.taskId, user, packageName,
sensor);
@@ -442,7 +443,7 @@
String inputMethodComponent = Settings.Secure.getStringForUser(
mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD,
- mCurrentUser);
+ user.getIdentifier());
String inputMethodPackageName = null;
if (inputMethodComponent != null) {
inputMethodPackageName = ComponentName.unflattenFromString(
@@ -534,9 +535,8 @@
return;
}
Intent dialogIntent = new Intent();
- dialogIntent.setComponent(ComponentName.unflattenFromString(
- mContext.getResources().getString(
- R.string.config_sensorUseStartedActivity)));
+ dialogIntent.setComponent(
+ ComponentName.unflattenFromString(getSensorUseActivityName(sensors)));
ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchTaskId(info.mTaskId);
@@ -560,6 +560,21 @@
}
/**
+ * Get the activity component based on which privacy toggles are enabled.
+ * @param sensors
+ * @return component name to launch
+ */
+ private String getSensorUseActivityName(ArraySet<Integer> sensors) {
+ for (Integer sensor : sensors) {
+ if (isToggleSensorPrivacyEnabled(TOGGLE_TYPE_HARDWARE, sensor)) {
+ return mContext.getResources().getString(
+ R.string.config_sensorUseStartedActivity_hwToggle);
+ }
+ }
+ return mContext.getResources().getString(R.string.config_sensorUseStartedActivity);
+ }
+
+ /**
* Show a notification that informs the user that a sensor use or a blocked sensor started.
* The user can then react to this event.
*
@@ -619,7 +634,7 @@
String actionTitle = getUiContext().getString(
R.string.sensor_privacy_start_use_dialog_turn_on_button);
PendingIntent actionIntent = PendingIntent.getBroadcast(mContext, sensor,
- new Intent(ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY)
+ new Intent(ACTION_DISABLE_TOGGLE_SENSOR_PRIVACY)
.setPackage(mContext.getPackageName())
.putExtra(EXTRA_SENSOR, sensor)
.putExtra(Intent.EXTRA_USER, user),
@@ -657,12 +672,12 @@
}
@Override
- public void setIndividualSensorPrivacy(@UserIdInt int userId,
+ public void setToggleSensorPrivacy(@UserIdInt int userId,
@SensorPrivacyManager.Sources.Source int source, int sensor, boolean enable) {
if (DEBUG) {
Log.d(TAG, "callingUid=" + Binder.getCallingUid()
+ " callingPid=" + Binder.getCallingPid()
- + " setIndividualSensorPrivacy("
+ + " setToggleSensorPrivacy("
+ "userId=" + userId
+ " source=" + source
+ " sensor=" + sensor
@@ -673,22 +688,22 @@
if (userId == UserHandle.USER_CURRENT) {
userId = mCurrentUser;
}
- if (!canChangeIndividualSensorPrivacy(userId, sensor)) {
+ if (!canChangeToggleSensorPrivacy(userId, sensor)) {
return;
}
- setIndividualSensorPrivacyUnchecked(userId, source, sensor, enable);
+ setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, userId, source, sensor, enable);
}
- private void setIndividualSensorPrivacyUnchecked(int userId, int source, int sensor,
- boolean enable) {
+ private void setToggleSensorPrivacyUnchecked(int toggleType, int userId, int source,
+ int sensor, boolean enable) {
final long[] lastChange = new long[1];
mSensorPrivacyStateController.atomic(() -> {
SensorState sensorState = mSensorPrivacyStateController
- .getState(SensorPrivacyManager.ToggleTypes.SOFTWARE, userId, sensor);
+ .getState(toggleType, userId, sensor);
lastChange[0] = sensorState.getLastChange();
mSensorPrivacyStateController.setState(
- SensorPrivacyManager.ToggleTypes.SOFTWARE, userId, sensor, enable, mHandler,
+ toggleType, userId, sensor, enable, mHandler,
changeSuccessful -> {
if (changeSuccessful) {
if (userId == mUserManagerInternal.getProfileParentId(userId)) {
@@ -701,7 +716,7 @@
});
}
- private boolean canChangeIndividualSensorPrivacy(@UserIdInt int userId, int sensor) {
+ private boolean canChangeToggleSensorPrivacy(@UserIdInt int userId, int sensor) {
if (sensor == MICROPHONE && mCallStateHelper.isInEmergencyCall()) {
// During emergency call the microphone toggle managed automatically
Log.i(TAG, "Can't change mic toggle during an emergency call");
@@ -784,7 +799,7 @@
}
@Override
- public void setIndividualSensorPrivacyForProfileGroup(@UserIdInt int userId,
+ public void setToggleSensorPrivacyForProfileGroup(@UserIdInt int userId,
@SensorPrivacyManager.Sources.Source int source, int sensor, boolean enable) {
enforceManageSensorPrivacyPermission();
if (userId == UserHandle.USER_CURRENT) {
@@ -793,7 +808,7 @@
int parentId = mUserManagerInternal.getProfileParentId(userId);
forAllUsers(userId2 -> {
if (parentId == mUserManagerInternal.getProfileParentId(userId2)) {
- setIndividualSensorPrivacy(userId2, source, sensor, enable);
+ setToggleSensorPrivacy(userId2, source, sensor, enable);
}
});
}
@@ -835,31 +850,55 @@
}
@Override
- public boolean isIndividualSensorPrivacyEnabled(@UserIdInt int userId, int sensor) {
+ public boolean isToggleSensorPrivacyEnabled(int toggleType, int sensor) {
if (DEBUG) {
Log.d(TAG, "callingUid=" + Binder.getCallingUid()
+ " callingPid=" + Binder.getCallingPid()
- + " isIndividualSensorPrivacyEnabled("
- + "userId=" + userId
+ + " isToggleSensorPrivacyEnabled("
+ + "toggleType=" + toggleType
+ " sensor=" + sensor
+ ")");
}
enforceObserveSensorPrivacyPermission();
- if (userId == UserHandle.USER_CURRENT) {
- userId = mCurrentUser;
- }
- return mSensorPrivacyStateController.getState(SensorPrivacyManager.ToggleTypes.SOFTWARE,
+
+ return mSensorPrivacyStateController.getState(toggleType, mCurrentUser, sensor)
+ .isEnabled();
+ }
+
+ @Override
+ public boolean isCombinedToggleSensorPrivacyEnabled(int sensor) {
+ return isToggleSensorPrivacyEnabled(TOGGLE_TYPE_SOFTWARE, sensor)
+ || isToggleSensorPrivacyEnabled(TOGGLE_TYPE_HARDWARE, sensor);
+ }
+
+ private boolean isToggleSensorPrivacyEnabledInternal(int userId, int toggleType,
+ int sensor) {
+
+ return mSensorPrivacyStateController.getState(toggleType,
userId, sensor).isEnabled();
}
@Override
- public boolean supportsSensorToggle(int sensor) {
- if (sensor == MICROPHONE) {
- return mContext.getResources().getBoolean(R.bool.config_supportsMicToggle);
- } else if (sensor == CAMERA) {
- return mContext.getResources().getBoolean(R.bool.config_supportsCamToggle);
+ public boolean supportsSensorToggle(int toggleType, int sensor) {
+ if (toggleType == TOGGLE_TYPE_SOFTWARE) {
+ if (sensor == MICROPHONE) {
+ return mContext.getResources()
+ .getBoolean(R.bool.config_supportsMicToggle);
+ } else if (sensor == CAMERA) {
+ return mContext.getResources()
+ .getBoolean(R.bool.config_supportsCamToggle);
+ }
+ } else if (toggleType == TOGGLE_TYPE_HARDWARE) {
+ if (sensor == MICROPHONE) {
+ return mContext.getResources()
+ .getBoolean(R.bool.config_supportsHardwareMicToggle);
+ } else if (sensor == CAMERA) {
+ return mContext.getResources()
+ .getBoolean(R.bool.config_supportsHardwareCamToggle);
+ }
}
- throw new IllegalArgumentException("Unable to find value " + sensor);
+ throw new IllegalArgumentException("Invalid arguments. "
+ + "toggleType=" + toggleType + " sensor=" + sensor);
}
/**
@@ -878,29 +917,13 @@
* Registers a listener to be notified when the sensor privacy state changes.
*/
@Override
- public void addIndividualSensorPrivacyListener(int userId, int sensor,
- ISensorPrivacyListener listener) {
+ public void addToggleSensorPrivacyListener(ISensorPrivacyListener listener) {
+ Log.d("evan", "trying to add from " + Binder.getCallingUid());
enforceObserveSensorPrivacyPermission();
if (listener == null) {
throw new IllegalArgumentException("listener cannot be null");
}
- mHandler.addListener(userId, sensor, listener);
- }
-
-
- /**
- * Registers a listener to be notified when the sensor privacy state changes. The callback
- * can be called if the user changes and the setting is different between the transitioning
- * users.
- */
- @Override
- public void addUserGlobalIndividualSensorPrivacyListener(int sensor,
- ISensorPrivacyListener listener) {
- enforceObserveSensorPrivacyPermission();
- if (listener == null) {
- throw new IllegalArgumentException("listener cannot be null");
- }
- mHandler.addUserGlobalListener(sensor, listener);
+ mHandler.addToggleListener(listener);
}
/**
@@ -919,27 +942,16 @@
* Unregisters a listener from sensor privacy state change notifications.
*/
@Override
- public void removeIndividualSensorPrivacyListener(int sensor,
- ISensorPrivacyListener listener) {
+ public void removeToggleSensorPrivacyListener(ISensorPrivacyListener listener) {
enforceObserveSensorPrivacyPermission();
if (listener == null) {
throw new IllegalArgumentException("listener cannot be null");
}
- mHandler.removeListener(sensor, listener);
+ mHandler.removeToggleListener(listener);
}
@Override
- public void removeUserGlobalIndividualSensorPrivacyListener(int sensor,
- ISensorPrivacyListener listener) {
- enforceObserveSensorPrivacyPermission();
- if (listener == null) {
- throw new IllegalArgumentException("listener cannot be null");
- }
- mHandler.removeUserGlobalListener(sensor, listener);
- }
-
- @Override
- public void suppressIndividualSensorPrivacyReminders(int userId, int sensor,
+ public void suppressToggleSensorPrivacyReminders(int userId, int sensor,
IBinder token, boolean suppress) {
enforceManageSensorPrivacyPermission();
if (userId == UserHandle.USER_CURRENT) {
@@ -976,7 +988,7 @@
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Can only be called by the system uid");
}
- if (!isIndividualSensorPrivacyEnabled(mCurrentUser, sensor)) {
+ if (!isCombinedToggleSensorPrivacyEnabled(sensor)) {
return;
}
enqueueSensorUseReminderDialogAsync(
@@ -984,23 +996,50 @@
}
private void userSwitching(int from, int to) {
- final boolean[] micState = new boolean[1];
- final boolean[] camState = new boolean[1];
- final boolean[] prevMicState = new boolean[1];
- final boolean[] prevCamState = new boolean[1];
+ final boolean[] micState = new boolean[2];
+ final boolean[] camState = new boolean[2];
+ final boolean[] prevMicState = new boolean[2];
+ final boolean[] prevCamState = new boolean[2];
+ final int swToggleIdx = 0;
+ final int hwToggleIdx = 1;
+ // Get SW toggles state
mSensorPrivacyStateController.atomic(() -> {
- prevMicState[0] = isIndividualSensorPrivacyEnabled(from, MICROPHONE);
- prevCamState[0] = isIndividualSensorPrivacyEnabled(from, CAMERA);
- micState[0] = isIndividualSensorPrivacyEnabled(to, MICROPHONE);
- camState[0] = isIndividualSensorPrivacyEnabled(to, CAMERA);
+ prevMicState[swToggleIdx] = isToggleSensorPrivacyEnabledInternal(from,
+ TOGGLE_TYPE_SOFTWARE, MICROPHONE);
+ prevCamState[swToggleIdx] = isToggleSensorPrivacyEnabledInternal(from,
+ TOGGLE_TYPE_SOFTWARE, CAMERA);
+ micState[swToggleIdx] = isToggleSensorPrivacyEnabledInternal(to,
+ TOGGLE_TYPE_SOFTWARE, MICROPHONE);
+ camState[swToggleIdx] = isToggleSensorPrivacyEnabledInternal(to,
+ TOGGLE_TYPE_SOFTWARE, CAMERA);
});
- if (from == USER_NULL || prevMicState[0] != micState[0]) {
- mHandler.onUserGlobalSensorPrivacyChanged(MICROPHONE, micState[0]);
- setGlobalRestriction(MICROPHONE, micState[0]);
+ // Get HW toggles state
+ mSensorPrivacyStateController.atomic(() -> {
+ prevMicState[hwToggleIdx] = isToggleSensorPrivacyEnabledInternal(from,
+ TOGGLE_TYPE_HARDWARE, MICROPHONE);
+ prevCamState[hwToggleIdx] = isToggleSensorPrivacyEnabledInternal(from,
+ TOGGLE_TYPE_HARDWARE, CAMERA);
+ micState[hwToggleIdx] = isToggleSensorPrivacyEnabledInternal(to,
+ TOGGLE_TYPE_HARDWARE, MICROPHONE);
+ camState[hwToggleIdx] = isToggleSensorPrivacyEnabledInternal(to,
+ TOGGLE_TYPE_HARDWARE, CAMERA);
+ });
+
+ if (from == USER_NULL || prevMicState[swToggleIdx] != micState[swToggleIdx]
+ || prevMicState[hwToggleIdx] != micState[hwToggleIdx]) {
+ mHandler.handleSensorPrivacyChanged(to, TOGGLE_TYPE_SOFTWARE, MICROPHONE,
+ micState[swToggleIdx]);
+ mHandler.handleSensorPrivacyChanged(to, TOGGLE_TYPE_HARDWARE, MICROPHONE,
+ micState[hwToggleIdx]);
+ setGlobalRestriction(MICROPHONE, micState[swToggleIdx] || micState[hwToggleIdx]);
}
- if (from == USER_NULL || prevCamState[0] != camState[0]) {
- mHandler.onUserGlobalSensorPrivacyChanged(CAMERA, camState[0]);
- setGlobalRestriction(CAMERA, camState[0]);
+ if (from == USER_NULL || prevCamState[swToggleIdx] != camState[swToggleIdx]
+ || prevCamState[hwToggleIdx] != camState[hwToggleIdx]) {
+ mHandler.handleSensorPrivacyChanged(to, TOGGLE_TYPE_SOFTWARE, CAMERA,
+ camState[swToggleIdx]);
+ mHandler.handleSensorPrivacyChanged(to, TOGGLE_TYPE_HARDWARE, CAMERA,
+ camState[hwToggleIdx]);
+ setGlobalRestriction(CAMERA, camState[swToggleIdx] || camState[hwToggleIdx]);
}
}
@@ -1153,7 +1192,7 @@
return -1;
}
- setIndividualSensorPrivacy(userId, SHELL, sensor, true);
+ setToggleSensorPrivacy(userId, SHELL, sensor, true);
}
break;
case "disable" : {
@@ -1163,7 +1202,7 @@
return -1;
}
- setIndividualSensorPrivacy(userId, SHELL, sensor, false);
+ setToggleSensorPrivacy(userId, SHELL, sensor, false);
}
break;
default:
@@ -1205,11 +1244,8 @@
private final RemoteCallbackList<ISensorPrivacyListener> mListeners =
new RemoteCallbackList<>();
@GuardedBy("mListenerLock")
- private final SparseArray<SparseArray<RemoteCallbackList<ISensorPrivacyListener>>>
- mIndividualSensorListeners = new SparseArray<>();
- @GuardedBy("mListenerLock")
- private final SparseArray<RemoteCallbackList<ISensorPrivacyListener>>
- mUserGlobalIndividualSensorListeners = new SparseArray<>();
+ private final RemoteCallbackList<ISensorPrivacyListener>
+ mToggleSensorListeners = new RemoteCallbackList<>();
@GuardedBy("mListenerLock")
private final ArrayMap<ISensorPrivacyListener, Pair<DeathRecipient, Integer>>
mDeathRecipients;
@@ -1221,12 +1257,6 @@
mContext = context;
}
- public void onUserGlobalSensorPrivacyChanged(int sensor, boolean enabled) {
- sendMessage(PooledLambda.obtainMessage(
- SensorPrivacyHandler::handleUserGlobalSensorPrivacyChanged,
- this, sensor, enabled));
- }
-
public void addListener(ISensorPrivacyListener listener) {
synchronized (mListenerLock) {
if (mListeners.register(listener)) {
@@ -1235,34 +1265,9 @@
}
}
- public void addListener(int userId, int sensor, ISensorPrivacyListener listener) {
+ public void addToggleListener(ISensorPrivacyListener listener) {
synchronized (mListenerLock) {
- SparseArray<RemoteCallbackList<ISensorPrivacyListener>> listenersForUser =
- mIndividualSensorListeners.get(userId);
- if (listenersForUser == null) {
- listenersForUser = new SparseArray<>();
- mIndividualSensorListeners.put(userId, listenersForUser);
- }
- RemoteCallbackList<ISensorPrivacyListener> listeners = listenersForUser.get(sensor);
- if (listeners == null) {
- listeners = new RemoteCallbackList<>();
- listenersForUser.put(sensor, listeners);
- }
- if (listeners.register(listener)) {
- addDeathRecipient(listener);
- }
- }
- }
-
- public void addUserGlobalListener(int sensor, ISensorPrivacyListener listener) {
- synchronized (mListenerLock) {
- RemoteCallbackList<ISensorPrivacyListener> listeners =
- mUserGlobalIndividualSensorListeners.get(sensor);
- if (listeners == null) {
- listeners = new RemoteCallbackList<>();
- mUserGlobalIndividualSensorListeners.put(sensor, listeners);
- }
- if (listeners.register(listener)) {
+ if (mToggleSensorListeners.register(listener)) {
addDeathRecipient(listener);
}
}
@@ -1276,28 +1281,10 @@
}
}
- public void removeListener(int sensor, ISensorPrivacyListener listener) {
+ public void removeToggleListener(ISensorPrivacyListener listener) {
synchronized (mListenerLock) {
- for (int i = 0, numUsers = mIndividualSensorListeners.size(); i < numUsers; i++) {
- RemoteCallbackList callbacks =
- mIndividualSensorListeners.valueAt(i).get(sensor);
- if (callbacks != null) {
- if (callbacks.unregister(listener)) {
- removeDeathRecipient(listener);
- }
- }
- }
- }
- }
-
- public void removeUserGlobalListener(int sensor, ISensorPrivacyListener listener) {
- synchronized (mListenerLock) {
- RemoteCallbackList callbacks =
- mUserGlobalIndividualSensorListeners.get(sensor);
- if (callbacks != null) {
- if (callbacks.unregister(listener)) {
- removeDeathRecipient(listener);
- }
+ if (mToggleSensorListeners.unregister(listener)) {
+ removeDeathRecipient(listener);
}
}
}
@@ -1307,7 +1294,7 @@
for (int i = 0; i < count; i++) {
ISensorPrivacyListener listener = mListeners.getBroadcastItem(i);
try {
- listener.onSensorPrivacyChanged(enabled);
+ listener.onSensorPrivacyChanged(-1, -1, enabled);
} catch (RemoteException e) {
Log.e(TAG, "Caught an exception notifying listener " + listener + ": ", e);
}
@@ -1315,62 +1302,34 @@
mListeners.finishBroadcast();
}
- public void handleSensorPrivacyChanged(int userId, int sensor, boolean enabled) {
- // TODO handle hardware
+ public void handleSensorPrivacyChanged(int userId, int toggleType, int sensor,
+ boolean enabled) {
mSensorPrivacyManagerInternal.dispatch(userId, sensor, enabled);
- SparseArray<RemoteCallbackList<ISensorPrivacyListener>> listenersForUser =
- mIndividualSensorListeners.get(userId);
if (userId == mCurrentUser) {
- mSensorPrivacyServiceImpl.setGlobalRestriction(sensor, enabled);
+ mSensorPrivacyServiceImpl.setGlobalRestriction(sensor,
+ mSensorPrivacyServiceImpl.isCombinedToggleSensorPrivacyEnabled(sensor));
}
- if (userId == mCurrentUser) {
- onUserGlobalSensorPrivacyChanged(sensor, enabled);
- }
-
- if (listenersForUser == null) {
+ if (userId != mCurrentUser) {
return;
}
- RemoteCallbackList<ISensorPrivacyListener> listeners = listenersForUser.get(sensor);
- if (listeners == null) {
- return;
- }
- try {
- final int count = listeners.beginBroadcast();
- for (int i = 0; i < count; i++) {
- ISensorPrivacyListener listener = listeners.getBroadcastItem(i);
- try {
- listener.onSensorPrivacyChanged(enabled);
- } catch (RemoteException e) {
- Log.e(TAG, "Caught an exception notifying listener " + listener + ": ", e);
+ synchronized (mListenerLock) {
+ try {
+ final int count = mToggleSensorListeners.beginBroadcast();
+ for (int i = 0; i < count; i++) {
+ ISensorPrivacyListener listener = mToggleSensorListeners.getBroadcastItem(
+ i);
+ try {
+ listener.onSensorPrivacyChanged(toggleType, sensor, enabled);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Caught an exception notifying listener " + listener + ": ",
+ e);
+ }
}
+ } finally {
+ mToggleSensorListeners.finishBroadcast();
}
- } finally {
- listeners.finishBroadcast();
- }
- }
-
- public void handleUserGlobalSensorPrivacyChanged(int sensor, boolean enabled) {
- RemoteCallbackList<ISensorPrivacyListener> listeners =
- mUserGlobalIndividualSensorListeners.get(sensor);
-
- if (listeners == null) {
- return;
- }
-
- try {
- final int count = listeners.beginBroadcast();
- for (int i = 0; i < count; i++) {
- ISensorPrivacyListener listener = listeners.getBroadcastItem(i);
- try {
- listener.onSensorPrivacyChanged(enabled);
- } catch (RemoteException e) {
- Log.e(TAG, "Caught an exception notifying listener " + listener + ": ", e);
- }
- }
- } finally {
- listeners.finishBroadcast();
}
}
@@ -1482,7 +1441,8 @@
@Override
public boolean isSensorPrivacyEnabled(int userId, int sensor) {
return SensorPrivacyService.this
- .mSensorPrivacyServiceImpl.isIndividualSensorPrivacyEnabled(userId, sensor);
+ .mSensorPrivacyServiceImpl.isToggleSensorPrivacyEnabledInternal(userId,
+ TOGGLE_TYPE_SOFTWARE, sensor);
}
@Override
@@ -1521,6 +1481,25 @@
sensorListeners.add(listener);
}
}
+
+ @Override
+ public void setPhysicalToggleSensorPrivacy(int userId, int sensor, boolean enable) {
+ final SensorPrivacyServiceImpl sps =
+ SensorPrivacyService.this.mSensorPrivacyServiceImpl;
+
+ // Convert userId to actual user Id. mCurrentUser is USER_NULL if toggle state is set
+ // before onUserStarting.
+ userId = (userId == UserHandle.USER_CURRENT ? mCurrentUser : userId);
+ final int realUserId = (userId == UserHandle.USER_NULL ? mContext.getUserId() : userId);
+
+ sps.setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_HARDWARE, realUserId, OTHER, sensor,
+ enable);
+ // Also disable the SW toggle when disabling the HW toggle
+ if (!enable) {
+ sps.setToggleSensorPrivacyUnchecked(TOGGLE_TYPE_SOFTWARE, realUserId, OTHER, sensor,
+ enable);
+ }
+ }
}
private class CallStateHelper {
@@ -1574,9 +1553,9 @@
if (!mIsInEmergencyCall) {
mIsInEmergencyCall = true;
if (mSensorPrivacyServiceImpl
- .isIndividualSensorPrivacyEnabled(mCurrentUser, MICROPHONE)) {
- mSensorPrivacyServiceImpl.setIndividualSensorPrivacyUnchecked(
- mCurrentUser, OTHER, MICROPHONE, false);
+ .isToggleSensorPrivacyEnabled(TOGGLE_TYPE_SOFTWARE, MICROPHONE)) {
+ mSensorPrivacyServiceImpl.setToggleSensorPrivacyUnchecked(
+ TOGGLE_TYPE_SOFTWARE, mCurrentUser, OTHER, MICROPHONE, false);
mMicUnmutedForEmergencyCall = true;
} else {
mMicUnmutedForEmergencyCall = false;
@@ -1601,8 +1580,8 @@
if (mIsInEmergencyCall) {
mIsInEmergencyCall = false;
if (mMicUnmutedForEmergencyCall) {
- mSensorPrivacyServiceImpl.setIndividualSensorPrivacyUnchecked(
- mCurrentUser, OTHER, MICROPHONE, true);
+ mSensorPrivacyServiceImpl.setToggleSensorPrivacyUnchecked(
+ TOGGLE_TYPE_SOFTWARE, mCurrentUser, OTHER, MICROPHONE, true);
mMicUnmutedForEmergencyCall = false;
}
}
diff --git a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyStateControllerImpl.java b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyStateControllerImpl.java
index d1ea8e9..3dcb4cf 100644
--- a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyStateControllerImpl.java
+++ b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyStateControllerImpl.java
@@ -16,7 +16,6 @@
package com.android.server.sensorprivacy;
-import android.hardware.SensorPrivacyManager;
import android.os.Handler;
import com.android.internal.util.dump.DualDumpOutputStream;
@@ -49,10 +48,6 @@
@Override
SensorState getStateLocked(int toggleType, int userId, int sensor) {
- if (toggleType == SensorPrivacyManager.ToggleTypes.HARDWARE) {
- // Device doesn't support hardware state
- return getDefaultSensorState();
- }
SensorState sensorState = mPersistedState.getState(toggleType, userId, sensor);
if (sensorState != null) {
return new SensorState(sensorState);
@@ -67,12 +62,6 @@
@Override
void setStateLocked(int toggleType, int userId, int sensor, boolean enabled,
Handler callbackHandler, SetStateResultCallback callback) {
- if (toggleType != SensorPrivacyManager.ToggleTypes.SOFTWARE) {
- // Implementation only supports software switch
- callbackHandler.sendMessage(PooledLambda.obtainMessage(
- SetStateResultCallback::callback, callback, false));
- return;
- }
// Changing the SensorState's mEnabled updates the timestamp of its last change.
// A nonexistent state -> unmuted should not set the timestamp.
SensorState lastState = mPersistedState.getState(toggleType, userId, sensor);
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index adee325..1b15351 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -15,7 +15,6 @@
*/
package com.android.server.stats.pull;
-
import static android.app.AppOpsManager.OP_FLAG_SELF;
import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXIED;
import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
@@ -74,6 +73,7 @@
import android.app.AppOpsManager.HistoricalPackageOps;
import android.app.AppOpsManager.HistoricalUidOps;
import android.app.INotificationManager;
+import android.app.PendingIntentStats;
import android.app.ProcessMemoryState;
import android.app.RuntimeAppOpAccessMessage;
import android.app.StatsManager;
@@ -197,6 +197,8 @@
import com.android.server.BinderCallsStatsService;
import com.android.server.LocalManagerRegistry;
import com.android.server.LocalServices;
+import com.android.server.PinnerService;
+import com.android.server.PinnerService.PinnedFileStats;
import com.android.server.SystemService;
import com.android.server.SystemServiceManager;
import com.android.server.am.MemoryStatUtil.MemoryStat;
@@ -727,6 +729,10 @@
return pullAccessibilityFloatingMenuStatsLocked(atomTag, data);
case FrameworkStatsLog.MEDIA_CAPABILITIES:
return pullMediaCapabilitiesStats(atomTag, data);
+ case FrameworkStatsLog.PINNED_FILE_SIZES_PER_PACKAGE:
+ return pullSystemServerPinnerStats(atomTag, data);
+ case FrameworkStatsLog.PENDING_INTENTS_PER_PACKAGE:
+ return pullPendingIntentsPerPackage(atomTag, data);
default:
throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
}
@@ -923,6 +929,8 @@
registerAccessibilityShortcutStats();
registerAccessibilityFloatingMenuStats();
registerMediaCapabilitiesStats();
+ registerPendingIntentsPerPackagePuller();
+ registerPinnerServiceStats();
}
private void initAndRegisterNetworkStatsPullers() {
@@ -1072,7 +1080,7 @@
private void registerWifiBytesTransfer() {
int tagId = FrameworkStatsLog.WIFI_BYTES_TRANSFER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {2, 3, 4, 5})
+ .setAdditiveFields(new int[]{2, 3, 4, 5})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1085,12 +1093,12 @@
@NonNull
private List<NetworkStatsExt> collectNetworkStatsSnapshotForAtom(int atomTag) {
List<NetworkStatsExt> ret = new ArrayList<>();
- switch(atomTag) {
+ switch (atomTag) {
case FrameworkStatsLog.WIFI_BYTES_TRANSFER: {
final NetworkStats stats = getUidNetworkStatsSnapshotForTransport(TRANSPORT_WIFI);
if (stats != null) {
ret.add(new NetworkStatsExt(sliceNetworkStatsByUid(stats),
- new int[] {TRANSPORT_WIFI}, /*slicedByFgbg=*/false));
+ new int[]{TRANSPORT_WIFI}, /*slicedByFgbg=*/false));
}
break;
}
@@ -1098,7 +1106,7 @@
final NetworkStats stats = getUidNetworkStatsSnapshotForTransport(TRANSPORT_WIFI);
if (stats != null) {
ret.add(new NetworkStatsExt(sliceNetworkStatsByUidAndFgbg(stats),
- new int[] {TRANSPORT_WIFI}, /*slicedByFgbg=*/true));
+ new int[]{TRANSPORT_WIFI}, /*slicedByFgbg=*/true));
}
break;
}
@@ -1107,7 +1115,7 @@
getUidNetworkStatsSnapshotForTransport(TRANSPORT_CELLULAR);
if (stats != null) {
ret.add(new NetworkStatsExt(sliceNetworkStatsByUid(stats),
- new int[] {TRANSPORT_CELLULAR}, /*slicedByFgbg=*/false));
+ new int[]{TRANSPORT_CELLULAR}, /*slicedByFgbg=*/false));
}
break;
}
@@ -1116,7 +1124,7 @@
getUidNetworkStatsSnapshotForTransport(TRANSPORT_CELLULAR);
if (stats != null) {
ret.add(new NetworkStatsExt(sliceNetworkStatsByUidAndFgbg(stats),
- new int[] {TRANSPORT_CELLULAR}, /*slicedByFgbg=*/true));
+ new int[]{TRANSPORT_CELLULAR}, /*slicedByFgbg=*/true));
}
break;
}
@@ -1125,11 +1133,11 @@
new NetworkTemplate.Builder(MATCH_WIFI).build(), /*includeTags=*/true);
final NetworkStats cellularStats = getUidNetworkStatsSnapshotForTemplate(
new NetworkTemplate.Builder(MATCH_MOBILE)
- .setMeteredness(METERED_YES).build(), /*includeTags=*/true);
+ .setMeteredness(METERED_YES).build(), /*includeTags=*/true);
if (wifiStats != null && cellularStats != null) {
final NetworkStats stats = wifiStats.add(cellularStats);
ret.add(new NetworkStatsExt(sliceNetworkStatsByUidTagAndMetered(stats),
- new int[] {TRANSPORT_WIFI, TRANSPORT_CELLULAR},
+ new int[]{TRANSPORT_WIFI, TRANSPORT_CELLULAR},
/*slicedByFgbg=*/false, /*slicedByTag=*/true,
/*slicedByMetered=*/true, TelephonyManager.NETWORK_TYPE_UNKNOWN,
/*subInfo=*/null, OEM_MANAGED_ALL));
@@ -1196,7 +1204,8 @@
return StatsManager.PULL_SUCCESS;
}
- @NonNull private static NetworkStats removeEmptyEntries(NetworkStats stats) {
+ @NonNull
+ private static NetworkStats removeEmptyEntries(NetworkStats stats) {
NetworkStats ret = new NetworkStats(0, 1);
for (NetworkStats.Entry e : stats) {
if (e.getRxBytes() != 0 || e.getRxPackets() != 0 || e.getTxBytes() != 0
@@ -1278,13 +1287,14 @@
}
}
- @NonNull private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForOemManaged() {
+ @NonNull
+ private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForOemManaged() {
final List<Pair<Integer, Integer>> matchRulesAndTransports = List.of(
new Pair(MATCH_ETHERNET, TRANSPORT_ETHERNET),
new Pair(MATCH_MOBILE, TRANSPORT_CELLULAR),
new Pair(MATCH_WIFI, TRANSPORT_WIFI)
);
- final int[] oemManagedTypes = new int[] {OEM_MANAGED_PAID | OEM_MANAGED_PRIVATE,
+ final int[] oemManagedTypes = new int[]{OEM_MANAGED_PAID | OEM_MANAGED_PRIVATE,
OEM_MANAGED_PAID, OEM_MANAGED_PRIVATE};
final List<NetworkStatsExt> ret = new ArrayList<>();
@@ -1301,7 +1311,7 @@
final Integer transport = ruleAndTransport.second;
if (stats != null) {
ret.add(new NetworkStatsExt(sliceNetworkStatsByUidAndFgbg(stats),
- new int[] {transport}, /*slicedByFgbg=*/true, /*slicedByTag=*/false,
+ new int[]{transport}, /*slicedByFgbg=*/true, /*slicedByTag=*/false,
/*slicedByMetered=*/false, TelephonyManager.NETWORK_TYPE_UNKNOWN,
/*subInfo=*/null, oemManaged));
}
@@ -1314,7 +1324,8 @@
/**
* Create a snapshot of NetworkStats for a given transport.
*/
- @Nullable private NetworkStats getUidNetworkStatsSnapshotForTransport(int transport) {
+ @Nullable
+ private NetworkStats getUidNetworkStatsSnapshotForTransport(int transport) {
NetworkTemplate template = null;
switch (transport) {
case TRANSPORT_CELLULAR:
@@ -1336,7 +1347,8 @@
* Note that this should be only used to calculate diff since the snapshot might contains
* some traffic before boot.
*/
- @Nullable private NetworkStats getUidNetworkStatsSnapshotForTemplate(
+ @Nullable
+ private NetworkStats getUidNetworkStatsSnapshotForTemplate(
@NonNull NetworkTemplate template, boolean includeTags) {
final long elapsedMillisSinceBoot = SystemClock.elapsedRealtime();
final long currentTimeInMillis = MICROSECONDS.toMillis(SystemClock.currentTimeMicro());
@@ -1354,8 +1366,8 @@
final android.app.usage.NetworkStats queryNonTaggedStats =
mNetworkStatsManager.querySummary(
- template, currentTimeInMillis - elapsedMillisSinceBoot - bucketDuration,
- currentTimeInMillis);
+ template, currentTimeInMillis - elapsedMillisSinceBoot - bucketDuration,
+ currentTimeInMillis);
final NetworkStats nonTaggedStats =
NetworkStatsUtils.fromPublicNetworkStats(queryNonTaggedStats);
@@ -1363,27 +1375,28 @@
final android.app.usage.NetworkStats queryTaggedStats =
mNetworkStatsManager.queryTaggedSummary(template,
- currentTimeInMillis - elapsedMillisSinceBoot - bucketDuration,
- currentTimeInMillis);
+ currentTimeInMillis - elapsedMillisSinceBoot - bucketDuration,
+ currentTimeInMillis);
final NetworkStats taggedStats =
NetworkStatsUtils.fromPublicNetworkStats(queryTaggedStats);
return nonTaggedStats.add(taggedStats);
}
- @NonNull private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForSub(
+ @NonNull
+ private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForSub(
@NonNull SubInfo subInfo) {
final List<NetworkStatsExt> ret = new ArrayList<>();
for (final int ratType : getAllCollapsedRatTypes()) {
final NetworkTemplate template =
new NetworkTemplate.Builder(MATCH_MOBILE)
- .setSubscriberIds(Set.of(subInfo.subscriberId))
- .setRatType(ratType)
- .setMeteredness(METERED_YES).build();
+ .setSubscriberIds(Set.of(subInfo.subscriberId))
+ .setRatType(ratType)
+ .setMeteredness(METERED_YES).build();
final NetworkStats stats =
getUidNetworkStatsSnapshotForTemplate(template, /*includeTags=*/false);
if (stats != null) {
ret.add(new NetworkStatsExt(sliceNetworkStatsByFgbg(stats),
- new int[] {TRANSPORT_CELLULAR}, /*slicedByFgbg=*/true,
+ new int[]{TRANSPORT_CELLULAR}, /*slicedByFgbg=*/true,
/*slicedByTag=*/false, /*slicedByMetered=*/false, ratType, subInfo,
OEM_MANAGED_ALL));
}
@@ -1412,51 +1425,55 @@
return com.android.net.module.util.CollectionUtils.toIntArray(collapsedRatTypes);
}
- @NonNull private NetworkStats sliceNetworkStatsByUid(@NonNull NetworkStats stats) {
+ @NonNull
+ private NetworkStats sliceNetworkStatsByUid(@NonNull NetworkStats stats) {
return sliceNetworkStats(stats,
(entry) -> {
- return new NetworkStats.Entry(null /* IFACE_ALL */, entry.getUid(),
- NetworkStats.SET_ALL, NetworkStats.TAG_NONE,
- NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
- NetworkStats.DEFAULT_NETWORK_ALL,
- entry.getRxBytes(), entry.getRxPackets(),
- entry.getTxBytes(), entry.getTxPackets(), 0);
+ return new NetworkStats.Entry(null /* IFACE_ALL */, entry.getUid(),
+ NetworkStats.SET_ALL, NetworkStats.TAG_NONE,
+ NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
+ NetworkStats.DEFAULT_NETWORK_ALL,
+ entry.getRxBytes(), entry.getRxPackets(),
+ entry.getTxBytes(), entry.getTxPackets(), 0);
});
}
- @NonNull private NetworkStats sliceNetworkStatsByFgbg(@NonNull NetworkStats stats) {
+ @NonNull
+ private NetworkStats sliceNetworkStatsByFgbg(@NonNull NetworkStats stats) {
return sliceNetworkStats(stats,
(entry) -> {
- return new NetworkStats.Entry(null /* IFACE_ALL */, NetworkStats.UID_ALL,
- entry.getSet(), NetworkStats.TAG_NONE,
- NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
- NetworkStats.DEFAULT_NETWORK_ALL,
- entry.getRxBytes(), entry.getRxPackets(),
- entry.getTxBytes(), entry.getTxPackets(), 0);
+ return new NetworkStats.Entry(null /* IFACE_ALL */, NetworkStats.UID_ALL,
+ entry.getSet(), NetworkStats.TAG_NONE,
+ NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
+ NetworkStats.DEFAULT_NETWORK_ALL,
+ entry.getRxBytes(), entry.getRxPackets(),
+ entry.getTxBytes(), entry.getTxPackets(), 0);
});
}
- @NonNull private NetworkStats sliceNetworkStatsByUidAndFgbg(@NonNull NetworkStats stats) {
+ @NonNull
+ private NetworkStats sliceNetworkStatsByUidAndFgbg(@NonNull NetworkStats stats) {
return sliceNetworkStats(stats,
(entry) -> {
- return new NetworkStats.Entry(null /* IFACE_ALL */, entry.getUid(),
- entry.getSet(), NetworkStats.TAG_NONE,
- NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
- NetworkStats.DEFAULT_NETWORK_ALL,
- entry.getRxBytes(), entry.getRxPackets(),
- entry.getTxBytes(), entry.getTxPackets(), 0);
+ return new NetworkStats.Entry(null /* IFACE_ALL */, entry.getUid(),
+ entry.getSet(), NetworkStats.TAG_NONE,
+ NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
+ NetworkStats.DEFAULT_NETWORK_ALL,
+ entry.getRxBytes(), entry.getRxPackets(),
+ entry.getTxBytes(), entry.getTxPackets(), 0);
});
}
- @NonNull private NetworkStats sliceNetworkStatsByUidTagAndMetered(@NonNull NetworkStats stats) {
+ @NonNull
+ private NetworkStats sliceNetworkStatsByUidTagAndMetered(@NonNull NetworkStats stats) {
return sliceNetworkStats(stats,
(entry) -> {
- return new NetworkStats.Entry(null /* IFACE_ALL */, entry.getUid(),
- NetworkStats.SET_ALL, entry.getTag(),
- entry.getMetered(), NetworkStats.ROAMING_ALL,
- NetworkStats.DEFAULT_NETWORK_ALL,
- entry.getRxBytes(), entry.getRxPackets(),
- entry.getTxBytes(), entry.getTxPackets(), 0);
+ return new NetworkStats.Entry(null /* IFACE_ALL */, entry.getUid(),
+ NetworkStats.SET_ALL, entry.getTag(),
+ entry.getMetered(), NetworkStats.ROAMING_ALL,
+ NetworkStats.DEFAULT_NETWORK_ALL,
+ entry.getRxBytes(), entry.getRxPackets(),
+ entry.getTxBytes(), entry.getTxPackets(), 0);
});
}
@@ -1472,17 +1489,18 @@
* get the state from entry to replace the default value.
* This is useful for slicing by particular dimensions. For example, if we wished
* to slice by uid and tag, we could write the following lambda:
- * (entry) -> {
- * return new NetworkStats.Entry(null, entry.getUid(),
- * NetworkStats.SET_ALL, entry.getTag(),
- * NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
- * NetworkStats.DEFAULT_NETWORK_ALL,
- * entry.getRxBytes(), entry.getRxPackets(),
- * entry.getTxBytes(), entry.getTxPackets(), 0);
- * }
+ * (entry) -> {
+ * return new NetworkStats.Entry(null, entry.getUid(),
+ * NetworkStats.SET_ALL, entry.getTag(),
+ * NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
+ * NetworkStats.DEFAULT_NETWORK_ALL,
+ * entry.getRxBytes(), entry.getRxPackets(),
+ * entry.getTxBytes(), entry.getTxPackets(), 0);
+ * }
* @return new NeworkStats object appropriately sliced
*/
- @NonNull private NetworkStats sliceNetworkStats(@NonNull NetworkStats stats,
+ @NonNull
+ private NetworkStats sliceNetworkStats(@NonNull NetworkStats stats,
@NonNull Function<NetworkStats.Entry, NetworkStats.Entry> slicer) {
NetworkStats ret = new NetworkStats(0, 1);
for (NetworkStats.Entry e : stats) {
@@ -1494,7 +1512,7 @@
private void registerWifiBytesTransferBackground() {
int tagId = FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {3, 4, 5, 6})
+ .setAdditiveFields(new int[]{3, 4, 5, 6})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1507,7 +1525,7 @@
private void registerMobileBytesTransfer() {
int tagId = FrameworkStatsLog.MOBILE_BYTES_TRANSFER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {2, 3, 4, 5})
+ .setAdditiveFields(new int[]{2, 3, 4, 5})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1520,7 +1538,7 @@
private void registerMobileBytesTransferBackground() {
int tagId = FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {3, 4, 5, 6})
+ .setAdditiveFields(new int[]{3, 4, 5, 6})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1533,7 +1551,7 @@
private void registerBytesTransferByTagAndMetered() {
int tagId = FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {4, 5, 6, 7})
+ .setAdditiveFields(new int[]{4, 5, 6, 7})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1546,7 +1564,7 @@
private void registerDataUsageBytesTransfer() {
int tagId = FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {2, 3, 4, 5})
+ .setAdditiveFields(new int[]{2, 3, 4, 5})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1559,7 +1577,7 @@
private void registerOemManagedBytesTransfer() {
int tagId = FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {5, 6, 7, 8})
+ .setAdditiveFields(new int[]{5, 6, 7, 8})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1572,7 +1590,7 @@
private void registerBluetoothBytesTransfer() {
int tagId = FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {2, 3})
+ .setAdditiveFields(new int[]{2, 3})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1661,7 +1679,7 @@
if (KernelCpuBpfTracking.isSupported()) {
int tagId = FrameworkStatsLog.CPU_TIME_PER_CLUSTER_FREQ;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {3})
+ .setAdditiveFields(new int[]{3})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1691,7 +1709,7 @@
private void registerCpuTimePerUid() {
int tagId = FrameworkStatsLog.CPU_TIME_PER_UID;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {2, 3})
+ .setAdditiveFields(new int[]{2, 3})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1716,7 +1734,7 @@
if (KernelCpuBpfTracking.isSupported() || KernelCpuBpfTracking.getClusters() > 0) {
int tagId = FrameworkStatsLog.CPU_CYCLES_PER_UID_CLUSTER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {3, 4, 5})
+ .setAdditiveFields(new int[]{3, 4, 5})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1801,7 +1819,7 @@
// frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
int tagId = FrameworkStatsLog.CPU_TIME_PER_UID_FREQ;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {3})
+ .setAdditiveFields(new int[]{3})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1855,7 +1873,7 @@
if (KernelCpuBpfTracking.isSupported()) {
int tagId = FrameworkStatsLog.CPU_CYCLES_PER_THREAD_GROUP_CLUSTER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {3, 4})
+ .setAdditiveFields(new int[]{3, 4})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1918,7 +1936,7 @@
// frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
int tagId = FrameworkStatsLog.CPU_ACTIVE_TIME;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {2})
+ .setAdditiveFields(new int[]{2})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -1940,7 +1958,7 @@
// frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
int tagId = FrameworkStatsLog.CPU_CLUSTER_TIME;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {3})
+ .setAdditiveFields(new int[]{3})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -2127,7 +2145,7 @@
private void registerProcessMemoryState() {
int tagId = FrameworkStatsLog.PROCESS_MEMORY_STATE;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {4, 5, 6, 7, 8})
+ .setAdditiveFields(new int[]{4, 5, 6, 7, 8})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -2485,7 +2503,7 @@
private void registerBinderCallsStats() {
int tagId = FrameworkStatsLog.BINDER_CALLS;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {4, 5, 6, 8, 12})
+ .setAdditiveFields(new int[]{4, 5, 6, 8, 12})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -2547,7 +2565,7 @@
private void registerLooperStats() {
int tagId = FrameworkStatsLog.LOOPER_STATS;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {5, 6, 7, 8, 9})
+ .setAdditiveFields(new int[]{5, 6, 7, 8, 9})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -2922,7 +2940,7 @@
private void registerDiskIO() {
int tagId = FrameworkStatsLog.DISK_IO;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {2, 3, 4, 5, 6, 7, 8, 9, 10, 11})
+ .setAdditiveFields(new int[]{2, 3, 4, 5, 6, 7, 8, 9, 10, 11})
.setCoolDownMillis(3 * MILLIS_PER_SEC)
.build();
mStatsManager.setPullAtomCallback(
@@ -2994,7 +3012,7 @@
private void registerCpuTimePerThreadFreq() {
int tagId = FrameworkStatsLog.CPU_TIME_PER_THREAD_FREQ;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {7, 9, 11, 13, 15, 17, 19, 21})
+ .setAdditiveFields(new int[]{7, 9, 11, 13, 15, 17, 19, 21})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -3092,7 +3110,7 @@
private void registerDebugElapsedClock() {
int tagId = FrameworkStatsLog.DEBUG_ELAPSED_CLOCK;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {1, 2, 3, 4})
+ .setAdditiveFields(new int[]{1, 2, 3, 4})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -3127,7 +3145,7 @@
private void registerDebugFailingElapsedClock() {
int tagId = FrameworkStatsLog.DEBUG_FAILING_ELAPSED_CLOCK;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setAdditiveFields(new int[] {1, 2, 3, 4})
+ .setAdditiveFields(new int[]{1, 2, 3, 4})
.build();
mStatsManager.setPullAtomCallback(
tagId,
@@ -3559,23 +3577,23 @@
int userId = users.get(userNum).getUserHandle().getIdentifier();
int unlockKeyguardEnabled = Settings.Secure.getIntForUser(
- mContext.getContentResolver(),
- Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED, 1, userId);
+ mContext.getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED, 1, userId);
int unlockDismissesKeyguard = Settings.Secure.getIntForUser(
- mContext.getContentResolver(),
- Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, 1, userId);
+ mContext.getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, 1, userId);
int unlockAttentionRequired = Settings.Secure.getIntForUser(
- mContext.getContentResolver(),
- Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED, 0, userId);
+ mContext.getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED, 0, userId);
int unlockAppEnabled = Settings.Secure.getIntForUser(
- mContext.getContentResolver(),
- Settings.Secure.FACE_UNLOCK_APP_ENABLED, 1, userId);
+ mContext.getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_APP_ENABLED, 1, userId);
int unlockAlwaysRequireConfirmation = Settings.Secure.getIntForUser(
- mContext.getContentResolver(),
- Settings.Secure.FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, 0, userId);
+ mContext.getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, 0, userId);
int unlockDiversityRequired = Settings.Secure.getIntForUser(
- mContext.getContentResolver(),
- Settings.Secure.FACE_UNLOCK_DIVERSITY_REQUIRED, 1, userId);
+ mContext.getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_DIVERSITY_REQUIRED, 1, userId);
pulledData.add(FrameworkStatsLog.buildStatsEvent(atomTag,
unlockKeyguardEnabled != 0, unlockDismissesKeyguard != 0,
@@ -4481,7 +4499,7 @@
opacity));
}
}
- } catch (RuntimeException e) {
+ } catch (RuntimeException e) {
Slog.e(TAG, "pulling accessibility floating menu stats failed at getUsers", e);
return StatsManager.PULL_SKIP;
} finally {
@@ -4505,7 +4523,7 @@
byte[] sinkSurroundEncodings = toBytes(audioManager.getReportedSurroundFormats());
List<Integer> disabledSurroundEncodingsList = new ArrayList<>();
List<Integer> enabledSurroundEncodingsList = new ArrayList<>();
- for (int surroundEncoding: surroundEncodingsMap.keySet()) {
+ for (int surroundEncoding : surroundEncodingsMap.keySet()) {
if (!surroundEncodingsMap.get(surroundEncoding)) {
disabledSurroundEncodingsList.add(surroundEncoding);
} else {
@@ -4574,6 +4592,46 @@
return StatsManager.PULL_SUCCESS;
}
+ private void registerPendingIntentsPerPackagePuller() {
+ int tagId = FrameworkStatsLog.PENDING_INTENTS_PER_PACKAGE;
+ mStatsManager.setPullAtomCallback(
+ tagId,
+ null, // use default PullAtomMetadata values
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl
+ );
+ }
+
+ private int pullPendingIntentsPerPackage(int atomTag, List<StatsEvent> pulledData) {
+ List<PendingIntentStats> pendingIntentStats =
+ LocalServices.getService(ActivityManagerInternal.class).getPendingIntentStats();
+ for (PendingIntentStats stats : pendingIntentStats) {
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(
+ atomTag, stats.uid, stats.count, stats.sizeKb));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ private void registerPinnerServiceStats() {
+ int tagId = FrameworkStatsLog.PINNED_FILE_SIZES_PER_PACKAGE;
+ mStatsManager.setPullAtomCallback(
+ tagId,
+ null, // use default PullAtomMetadata values
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl
+ );
+ }
+
+ int pullSystemServerPinnerStats(int atomTag, List<StatsEvent> pulledData) {
+ PinnerService pinnerService = LocalServices.getService(PinnerService.class);
+ List<PinnedFileStats> pinnedFileStats = pinnerService.dumpDataForStatsd();
+ for (PinnedFileStats pfstats : pinnedFileStats) {
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(atomTag,
+ pfstats.uid, pfstats.filename, pfstats.sizeKb));
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
private byte[] toBytes(List<Integer> audioEncodings) {
ProtoOutputStream protoOutputStream = new ProtoOutputStream();
for (int audioEncoding : audioEncodings) {
@@ -4655,8 +4713,8 @@
* string list.
*
* @param semicolonList colon-separated string, it should be
- * {@link Settings.Secure#ACCESSIBILITY_BUTTON_TARGETS} or
- * {@link Settings.Secure#ACCESSIBILITY_SHORTCUT_TARGET_SERVICE}.
+ * {@link Settings.Secure#ACCESSIBILITY_BUTTON_TARGETS} or
+ * {@link Settings.Secure#ACCESSIBILITY_SHORTCUT_TARGET_SERVICE}.
* @return The number of accessibility services
*/
private int countAccessibilityServices(String semicolonList) {
@@ -4778,5 +4836,4 @@
}
}
}
-
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 2049f3d..66904b1 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -53,6 +53,7 @@
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.hardware.fingerprint.IUdfpsHbmListener;
+import android.media.INearbyMediaDevicesProvider;
import android.media.MediaRoute2Info;
import android.net.Uri;
import android.os.Binder;
@@ -1432,6 +1433,22 @@
}
}
+ /**
+ * Allows the status bar to restart android (vs a full reboot).
+ */
+ @Override
+ public void restart() {
+ enforceStatusBarService();
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mHandler.post(() -> {
+ mActivityManagerInternal.restart();
+ });
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
@Override
public void onGlobalActionsShown() {
enforceStatusBarService();
@@ -2045,6 +2062,56 @@
}
}
+ /**
+ * Registers a provider that gives information about nearby devices that are able to play media.
+ * See {@link StatusBarmanager.registerNearbyMediaDevicesProvider}.
+ *
+ * Requires the caller to have the {@link android.Manifest.permission.MEDIA_CONTENT_CONTROL}
+ * permission.
+ *
+ * @param provider the nearby device information provider to register
+ *
+ * @hide
+ */
+ @Override
+ public void registerNearbyMediaDevicesProvider(
+ @NonNull INearbyMediaDevicesProvider provider
+ ) {
+ enforceMediaContentControl();
+ if (mBar != null) {
+ try {
+ mBar.registerNearbyMediaDevicesProvider(provider);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "registerNearbyMediaDevicesProvider", e);
+ }
+ }
+ }
+
+ /**
+ * Unregisters a provider that gives information about nearby devices that are able to play
+ * media. See {@link StatusBarmanager.unregisterNearbyMediaDevicesProvider}.
+ *
+ * Requires the caller to have the {@link android.Manifest.permission.MEDIA_CONTENT_CONTROL}
+ * permission.
+ *
+ * @param provider the nearby device information provider to unregister
+ *
+ * @hide
+ */
+ @Override
+ public void unregisterNearbyMediaDevicesProvider(
+ @NonNull INearbyMediaDevicesProvider provider
+ ) {
+ enforceMediaContentControl();
+ if (mBar != null) {
+ try {
+ mBar.unregisterNearbyMediaDevicesProvider(provider);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "unregisterNearbyMediaDevicesProvider", e);
+ }
+ }
+ }
+
/** @hide */
public void passThroughShellCommand(String[] args, FileDescriptor fd) {
enforceStatusBarOrShell();
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
index e751a7b..7466001 100644
--- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
@@ -70,7 +70,7 @@
* Telephony and network suggestions older than this value are considered too old to be used.
*/
@VisibleForTesting
- static final long MAX_UTC_TIME_AGE_MILLIS =
+ static final long MAX_SUGGESTION_TIME_AGE_MILLIS =
TELEPHONY_BUCKET_COUNT * TELEPHONY_BUCKET_SIZE_MILLIS;
/**
@@ -205,9 +205,9 @@
@Override
public synchronized void suggestExternalTime(@NonNull ExternalTimeSuggestion timeSuggestion) {
- final TimestampedValue<Long> newUtcTime = timeSuggestion.getUtcTime();
+ final TimestampedValue<Long> newUnixEpochTime = timeSuggestion.getUnixEpochTime();
- if (!validateAutoSuggestionTime(newUtcTime, timeSuggestion)) {
+ if (!validateAutoSuggestionTime(newUnixEpochTime, timeSuggestion)) {
return;
}
@@ -219,9 +219,9 @@
@Override
public synchronized void suggestGnssTime(@NonNull GnssTimeSuggestion timeSuggestion) {
- final TimestampedValue<Long> newUtcTime = timeSuggestion.getUtcTime();
+ final TimestampedValue<Long> newUnixEpochTime = timeSuggestion.getUnixEpochTime();
- if (!validateAutoSuggestionTime(newUtcTime, timeSuggestion)) {
+ if (!validateAutoSuggestionTime(newUnixEpochTime, timeSuggestion)) {
return;
}
@@ -233,19 +233,19 @@
@Override
public synchronized boolean suggestManualTime(@NonNull ManualTimeSuggestion suggestion) {
- final TimestampedValue<Long> newUtcTime = suggestion.getUtcTime();
+ final TimestampedValue<Long> newUnixEpochTime = suggestion.getUnixEpochTime();
- if (!validateSuggestionTime(newUtcTime, suggestion)) {
+ if (!validateSuggestionTime(newUnixEpochTime, suggestion)) {
return false;
}
String cause = "Manual time suggestion received: suggestion=" + suggestion;
- return setSystemClockIfRequired(ORIGIN_MANUAL, newUtcTime, cause);
+ return setSystemClockIfRequired(ORIGIN_MANUAL, newUnixEpochTime, cause);
}
@Override
public synchronized void suggestNetworkTime(@NonNull NetworkTimeSuggestion timeSuggestion) {
- if (!validateAutoSuggestionTime(timeSuggestion.getUtcTime(), timeSuggestion)) {
+ if (!validateAutoSuggestionTime(timeSuggestion.getUnixEpochTime(), timeSuggestion)) {
return;
}
@@ -275,11 +275,11 @@
// unlike time zone, where a user may lose connectivity when boarding a flight and where we
// do want to "forget" old signals. Suggestions that are too old are discarded later in the
// detection algorithm.
- if (timeSuggestion.getUtcTime() == null) {
+ if (timeSuggestion.getUnixEpochTime() == null) {
return;
}
- if (!validateAutoSuggestionTime(timeSuggestion.getUtcTime(), timeSuggestion)) {
+ if (!validateAutoSuggestionTime(timeSuggestion.getUnixEpochTime(), timeSuggestion)) {
return;
}
@@ -370,14 +370,14 @@
@GuardedBy("this")
private boolean storeTelephonySuggestion(
@NonNull TelephonyTimeSuggestion suggestion) {
- TimestampedValue<Long> newUtcTime = suggestion.getUtcTime();
+ TimestampedValue<Long> newUnixEpochTime = suggestion.getUnixEpochTime();
int slotIndex = suggestion.getSlotIndex();
TelephonyTimeSuggestion previousSuggestion = mSuggestionBySlotIndex.get(slotIndex);
if (previousSuggestion != null) {
// We can log / discard suggestions with obvious issues with the reference time clock.
- if (previousSuggestion.getUtcTime() == null
- || previousSuggestion.getUtcTime().getValue() == null) {
+ if (previousSuggestion.getUnixEpochTime() == null
+ || previousSuggestion.getUnixEpochTime().getValue() == null) {
// This should be impossible given we only store validated suggestions.
Slog.w(LOG_TAG, "Previous suggestion is null or has a null time."
+ " previousSuggestion=" + previousSuggestion
@@ -386,7 +386,7 @@
}
long referenceTimeDifference = TimestampedValue.referenceTimeDifference(
- newUtcTime, previousSuggestion.getUtcTime());
+ newUnixEpochTime, previousSuggestion.getUnixEpochTime());
if (referenceTimeDifference < 0) {
// The reference time is before the previously received suggestion. Ignore it.
Slog.w(LOG_TAG, "Out of order telephony suggestion received."
@@ -403,15 +403,15 @@
}
private boolean validateSuggestionTime(
- @NonNull TimestampedValue<Long> newUtcTime, @NonNull Object suggestion) {
- if (newUtcTime.getValue() == null) {
+ @NonNull TimestampedValue<Long> newUnixEpochTime, @NonNull Object suggestion) {
+ if (newUnixEpochTime.getValue() == null) {
Slog.w(LOG_TAG, "Suggested time value is null. suggestion=" + suggestion);
return false;
}
// We can validate the suggestion against the reference time clock.
long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis();
- if (elapsedRealtimeMillis < newUtcTime.getReferenceTimeMillis()) {
+ if (elapsedRealtimeMillis < newUnixEpochTime.getReferenceTimeMillis()) {
// elapsedRealtime clock went backwards?
Slog.w(LOG_TAG, "New reference time is in the future? Ignoring."
+ " elapsedRealtimeMillis=" + elapsedRealtimeMillis
@@ -422,17 +422,17 @@
}
private boolean validateAutoSuggestionTime(
- @NonNull TimestampedValue<Long> newUtcTime, @NonNull Object suggestion) {
- return validateSuggestionTime(newUtcTime, suggestion)
- && validateSuggestionAgainstLowerBound(newUtcTime, suggestion);
+ @NonNull TimestampedValue<Long> newUnixEpochTime, @NonNull Object suggestion) {
+ return validateSuggestionTime(newUnixEpochTime, suggestion)
+ && validateSuggestionAgainstLowerBound(newUnixEpochTime, suggestion);
}
private boolean validateSuggestionAgainstLowerBound(
- @NonNull TimestampedValue<Long> newUtcTime, @NonNull Object suggestion) {
+ @NonNull TimestampedValue<Long> newUnixEpochTime, @NonNull Object suggestion) {
Instant lowerBound = mEnvironment.autoTimeLowerBound();
// Suggestion is definitely wrong if it comes before lower time bound.
- if (lowerBound.isAfter(Instant.ofEpochMilli(newUtcTime.getValue()))) {
+ if (lowerBound.isAfter(Instant.ofEpochMilli(newUnixEpochTime.getValue()))) {
Slog.w(LOG_TAG, "Suggestion points to time before lower bound, skipping it. "
+ "suggestion=" + suggestion + ", lower bound=" + lowerBound);
return false;
@@ -451,12 +451,12 @@
// Try the different origins one at a time.
int[] originPriorities = mEnvironment.autoOriginPriorities();
for (int origin : originPriorities) {
- TimestampedValue<Long> newUtcTime = null;
+ TimestampedValue<Long> newUnixEpochTime = null;
String cause = null;
if (origin == ORIGIN_TELEPHONY) {
TelephonyTimeSuggestion bestTelephonySuggestion = findBestTelephonySuggestion();
if (bestTelephonySuggestion != null) {
- newUtcTime = bestTelephonySuggestion.getUtcTime();
+ newUnixEpochTime = bestTelephonySuggestion.getUnixEpochTime();
cause = "Found good telephony suggestion."
+ ", bestTelephonySuggestion=" + bestTelephonySuggestion
+ ", detectionReason=" + detectionReason;
@@ -464,7 +464,7 @@
} else if (origin == ORIGIN_NETWORK) {
NetworkTimeSuggestion networkSuggestion = findLatestValidNetworkSuggestion();
if (networkSuggestion != null) {
- newUtcTime = networkSuggestion.getUtcTime();
+ newUnixEpochTime = networkSuggestion.getUnixEpochTime();
cause = "Found good network suggestion."
+ ", networkSuggestion=" + networkSuggestion
+ ", detectionReason=" + detectionReason;
@@ -472,7 +472,7 @@
} else if (origin == ORIGIN_GNSS) {
GnssTimeSuggestion gnssTimeSuggestion = findLatestValidGnssSuggestion();
if (gnssTimeSuggestion != null) {
- newUtcTime = gnssTimeSuggestion.getUtcTime();
+ newUnixEpochTime = gnssTimeSuggestion.getUnixEpochTime();
cause = "Found good gnss suggestion."
+ ", gnssTimeSuggestion=" + gnssTimeSuggestion
+ ", detectionReason=" + detectionReason;
@@ -480,7 +480,7 @@
} else if (origin == ORIGIN_EXTERNAL) {
ExternalTimeSuggestion externalTimeSuggestion = findLatestValidExternalSuggestion();
if (externalTimeSuggestion != null) {
- newUtcTime = externalTimeSuggestion.getUtcTime();
+ newUnixEpochTime = externalTimeSuggestion.getUnixEpochTime();
cause = "Found good external suggestion."
+ ", externalTimeSuggestion=" + externalTimeSuggestion
+ ", detectionReason=" + detectionReason;
@@ -492,8 +492,8 @@
}
// Update the system clock if a good suggestion has been found.
- if (newUtcTime != null) {
- setSystemClockIfRequired(origin, newUtcTime, cause);
+ if (newUnixEpochTime != null) {
+ setSystemClockIfRequired(origin, newUnixEpochTime, cause);
return;
}
}
@@ -550,7 +550,7 @@
Slog.w(LOG_TAG, "Latest suggestion unexpectedly null for slotIndex."
+ " slotIndex=" + slotIndex);
continue;
- } else if (candidateSuggestion.getUtcTime() == null) {
+ } else if (candidateSuggestion.getUnixEpochTime() == null) {
// Unexpected - we do not store empty suggestions.
Slog.w(LOG_TAG, "Latest suggestion unexpectedly empty. "
+ " candidateSuggestion=" + candidateSuggestion);
@@ -584,8 +584,8 @@
long elapsedRealtimeMillis, @NonNull TelephonyTimeSuggestion timeSuggestion) {
// Validate first.
- TimestampedValue<Long> utcTime = timeSuggestion.getUtcTime();
- if (!validateSuggestionUtcTime(elapsedRealtimeMillis, utcTime)) {
+ TimestampedValue<Long> unixEpochTime = timeSuggestion.getUnixEpochTime();
+ if (!validateSuggestionUnixEpochTime(elapsedRealtimeMillis, unixEpochTime)) {
Slog.w(LOG_TAG, "Existing suggestion found to be invalid"
+ " elapsedRealtimeMillis=" + elapsedRealtimeMillis
+ ", timeSuggestion=" + timeSuggestion);
@@ -594,7 +594,7 @@
// The score is based on the age since receipt. Suggestions are bucketed so two
// suggestions in the same bucket from different slotIndexs are scored the same.
- long ageMillis = elapsedRealtimeMillis - utcTime.getReferenceTimeMillis();
+ long ageMillis = elapsedRealtimeMillis - unixEpochTime.getReferenceTimeMillis();
// Turn the age into a discrete value: 0 <= bucketIndex < TELEPHONY_BUCKET_COUNT.
int bucketIndex = (int) (ageMillis / TELEPHONY_BUCKET_SIZE_MILLIS);
@@ -616,9 +616,9 @@
return null;
}
- TimestampedValue<Long> utcTime = networkSuggestion.getUtcTime();
+ TimestampedValue<Long> unixEpochTime = networkSuggestion.getUnixEpochTime();
long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
- if (!validateSuggestionUtcTime(elapsedRealTimeMillis, utcTime)) {
+ if (!validateSuggestionUnixEpochTime(elapsedRealTimeMillis, unixEpochTime)) {
// The latest suggestion is not valid, usually due to its age.
return null;
}
@@ -636,9 +636,9 @@
return null;
}
- TimestampedValue<Long> utcTime = gnssTimeSuggestion.getUtcTime();
+ TimestampedValue<Long> unixEpochTime = gnssTimeSuggestion.getUnixEpochTime();
long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
- if (!validateSuggestionUtcTime(elapsedRealTimeMillis, utcTime)) {
+ if (!validateSuggestionUnixEpochTime(elapsedRealTimeMillis, unixEpochTime)) {
// The latest suggestion is not valid, usually due to its age.
return null;
}
@@ -656,9 +656,9 @@
return null;
}
- TimestampedValue<Long> utcTime = externalTimeSuggestion.getUtcTime();
+ TimestampedValue<Long> unixEpochTime = externalTimeSuggestion.getUnixEpochTime();
long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
- if (!validateSuggestionUtcTime(elapsedRealTimeMillis, utcTime)) {
+ if (!validateSuggestionUnixEpochTime(elapsedRealTimeMillis, unixEpochTime)) {
// The latest suggestion is not valid, usually due to its age.
return null;
}
@@ -849,9 +849,9 @@
return mLastExternalSuggestion.get();
}
- private static boolean validateSuggestionUtcTime(
- long elapsedRealtimeMillis, TimestampedValue<Long> utcTime) {
- long referenceTimeMillis = utcTime.getReferenceTimeMillis();
+ private static boolean validateSuggestionUnixEpochTime(
+ long elapsedRealtimeMillis, TimestampedValue<Long> unixEpochTime) {
+ long referenceTimeMillis = unixEpochTime.getReferenceTimeMillis();
if (referenceTimeMillis > elapsedRealtimeMillis) {
// Future reference times are ignored. They imply the reference time was wrong, or the
// elapsed realtime clock used to derive it has gone backwards, neither of which are
@@ -865,6 +865,6 @@
// made and never replaced, it could also mean that the time detection code remains
// opinionated using a bad invalid suggestion. This caps that edge case at MAX_AGE_MILLIS.
long ageMillis = elapsedRealtimeMillis - referenceTimeMillis;
- return ageMillis <= MAX_UTC_TIME_AGE_MILLIS;
+ return ageMillis <= MAX_SUGGESTION_TIME_AGE_MILLIS;
}
}
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index e02fabd..b95d372 100755
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -102,6 +102,8 @@
import com.android.server.IoThread;
import com.android.server.SystemService;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
@@ -2639,6 +2641,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
@SuppressWarnings("resource")
protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
diff --git a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
index a17e792..30e2617 100644
--- a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
+++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
@@ -146,7 +146,7 @@
filter.addAction(ACTION_CARRIER_CONFIG_CHANGED);
filter.addAction(ACTION_MULTI_SIM_CONFIG_CHANGED);
- mContext.registerReceiver(this, filter, null, mHandler);
+ mContext.registerReceiver(this, filter, null, mHandler, Context.RECEIVER_NOT_EXPORTED);
mSubscriptionManager.addOnSubscriptionsChangedListener(
executor, mSubscriptionChangedListener);
mTelephonyManager.registerTelephonyCallback(executor, mActiveDataSubIdListener);
diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
index 8b80b4a..597f7f2 100644
--- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
+++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
@@ -78,6 +78,7 @@
import android.os.Process;
import android.os.SystemClock;
import android.provider.Settings;
+import android.telephony.TelephonyManager;
import android.util.ArraySet;
import android.util.Slog;
@@ -163,6 +164,14 @@
public class VcnGatewayConnection extends StateMachine {
private static final String TAG = VcnGatewayConnection.class.getSimpleName();
+ // Matches DataConnection.NETWORK_TYPE private constant, and magic string from
+ // ConnectivityManager#getNetworkTypeName()
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ static final String NETWORK_INFO_NETWORK_TYPE_STRING = "MOBILE";
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ static final String NETWORK_INFO_EXTRA_INFO = "VCN";
+
@VisibleForTesting(visibility = Visibility.PRIVATE)
static final InetAddress DUMMY_ADDR = InetAddresses.parseNumericAddress("192.0.2.0");
@@ -1631,6 +1640,12 @@
final NetworkAgentConfig nac =
new NetworkAgentConfig.Builder()
.setLegacyType(ConnectivityManager.TYPE_MOBILE)
+ .setLegacyTypeName(NETWORK_INFO_NETWORK_TYPE_STRING)
+ .setLegacySubType(TelephonyManager.NETWORK_TYPE_UNKNOWN)
+ .setLegacySubTypeName(
+ TelephonyManager.getNetworkTypeName(
+ TelephonyManager.NETWORK_TYPE_UNKNOWN))
+ .setLegacyExtraInfo(NETWORK_INFO_EXTRA_INFO)
.build();
final VcnNetworkAgent agent =
diff --git a/services/core/java/com/android/server/vibrator/VibrationThread.java b/services/core/java/com/android/server/vibrator/VibrationThread.java
index fdd9913..1f1f40b 100644
--- a/services/core/java/com/android/server/vibrator/VibrationThread.java
+++ b/services/core/java/com/android/server/vibrator/VibrationThread.java
@@ -70,32 +70,42 @@
private static final List<Step> EMPTY_STEP_LIST = new ArrayList<>();
- /** Callbacks for playing a {@link Vibration}. */
- interface VibrationCallbacks {
+ /** Calls into VibratorManager functionality needed for playing a {@link Vibration}. */
+ interface VibratorManagerHooks {
/**
- * Callback triggered before starting a synchronized vibration step. This will be called
- * with {@code requiredCapabilities = 0} if no synchronization is required.
+ * Request the manager to prepare for triggering a synchronized vibration step.
*
* @param requiredCapabilities The required syncing capabilities for this preparation step.
- * Expects a combination of values from
+ * Expect CAP_SYNC and a combination of values from
* IVibratorManager.CAP_PREPARE_* and
* IVibratorManager.CAP_MIXED_TRIGGER_*.
* @param vibratorIds The id of the vibrators to be prepared.
*/
boolean prepareSyncedVibration(long requiredCapabilities, int[] vibratorIds);
- /** Callback triggered after synchronized vibrations were prepared. */
+ /**
+ * Request the manager to trigger a synchronized vibration. The vibration must already
+ * have been prepared with {@link #prepareSyncedVibration}.
+ */
boolean triggerSyncedVibration(long vibrationId);
- /** Callback triggered to cancel a prepared synced vibration. */
+ /** Tell the manager to cancel a synced vibration. */
void cancelSyncedVibration();
- /** Callback triggered when the vibration is complete. */
+ /**
+ * Tell the manager that the currently active vibration has completed its vibration, from
+ * the perspective of the Effect. However, the VibrationThread may still be continuing with
+ * cleanup tasks, and should not be given new work until {@link #onVibrationThreadReleased}
+ * is called.
+ */
void onVibrationCompleted(long vibrationId, Vibration.Status status);
- /** Callback triggered when the vibrators are released after the thread is complete. */
- void onVibratorsReleased();
+ /**
+ * Tells the manager that the VibrationThread is finished with the previous vibration and
+ * all of its cleanup tasks, and the vibrators can now be used for another vibration.
+ */
+ void onVibrationThreadReleased();
}
private final Object mLock = new Object();
@@ -105,7 +115,7 @@
private final VibrationSettings mVibrationSettings;
private final DeviceVibrationEffectAdapter mDeviceEffectAdapter;
private final Vibration mVibration;
- private final VibrationCallbacks mCallbacks;
+ private final VibratorManagerHooks mVibratorManagerHooks;
private final SparseArray<VibratorController> mVibrators = new SparseArray<>();
private final StepQueue mStepQueue = new StepQueue();
@@ -117,11 +127,11 @@
VibrationThread(Vibration vib, VibrationSettings vibrationSettings,
DeviceVibrationEffectAdapter effectAdapter,
SparseArray<VibratorController> availableVibrators, PowerManager.WakeLock wakeLock,
- IBatteryStats batteryStatsService, VibrationCallbacks callbacks) {
+ IBatteryStats batteryStatsService, VibratorManagerHooks vibratorManagerHooks) {
mVibration = vib;
mVibrationSettings = vibrationSettings;
mDeviceEffectAdapter = effectAdapter;
- mCallbacks = callbacks;
+ mVibratorManagerHooks = vibratorManagerHooks;
mWorkSource = new WorkSource(mVibration.uid);
mWakeLock = wakeLock;
mBatteryStatsService = batteryStatsService;
@@ -163,7 +173,7 @@
clientVibrationCompleteIfNotAlready(Vibration.Status.FINISHED_UNEXPECTED);
}
} finally {
- mCallbacks.onVibratorsReleased();
+ mVibratorManagerHooks.onVibrationThreadReleased();
}
}
@@ -263,7 +273,7 @@
private void clientVibrationCompleteIfNotAlready(Vibration.Status completedStatus) {
if (!mCalledVibrationCompleteCallback) {
mCalledVibrationCompleteCallback = true;
- mCallbacks.onVibrationCompleted(mVibration.id, completedStatus);
+ mVibratorManagerHooks.onVibrationCompleted(mVibration.id, completedStatus);
}
}
@@ -272,25 +282,29 @@
try {
CombinedVibration.Sequential sequentialEffect = toSequential(mVibration.getEffect());
final int sequentialEffectSize = sequentialEffect.getEffects().size();
- mStepQueue.offer(new StartVibrateStep(sequentialEffect));
+ mStepQueue.initializeForEffect(sequentialEffect);
- while (!mStepQueue.isEmpty()) {
- long waitTime;
+ while (!mStepQueue.isFinished()) {
+ long waitMillisBeforeNextStep;
synchronized (mLock) {
- waitTime = mStepQueue.calculateWaitTime();
- if (waitTime > 0) {
+ waitMillisBeforeNextStep = mStepQueue.getWaitMillisBeforeNextStep();
+ if (waitMillisBeforeNextStep > 0) {
try {
- mLock.wait(waitTime);
+ mLock.wait(waitMillisBeforeNextStep);
} catch (InterruptedException e) {
}
}
}
- // If we waited, the queue may have changed, so let the loop run again.
- if (waitTime <= 0) {
+ // Only run the next vibration step if we didn't have to wait in this loop.
+ // If we waited then the queue may have changed, so loop again to re-evaluate
+ // the scheduling of the queue top element.
+ if (waitMillisBeforeNextStep <= 0) {
if (DEBUG) {
Slog.d(TAG, "Play vibration consuming next step...");
}
- mStepQueue.consumeNext();
+ // Run the step without holding the main lock, to avoid HAL interactions from
+ // blocking the thread.
+ mStepQueue.runNextStep();
}
Vibration.Status status = mStop ? Vibration.Status.CANCELLED
: mStepQueue.calculateVibrationStatus(sequentialEffectSize);
@@ -350,7 +364,7 @@
}
if (segmentIndex < 0) {
// No more segments to play, last step is to complete the vibration on this vibrator.
- return new CompleteStep(startTime, /* cancelled= */ false, controller,
+ return new EffectCompleteStep(startTime, /* cancelled= */ false, controller,
vibratorOffTimeout);
}
@@ -385,7 +399,7 @@
@GuardedBy("mLock")
private final Queue<Step> mPendingOnVibratorCompleteSteps = new LinkedList<>();
@GuardedBy("mLock")
- private final Queue<Integer> mNotifiedVibrators = new LinkedList<>();
+ private final Queue<Integer> mCompletionNotifiedVibrators = new LinkedList<>();
@GuardedBy("mLock")
private int mPendingVibrateSteps;
@@ -394,18 +408,16 @@
@GuardedBy("mLock")
private int mSuccessfulVibratorOnSteps;
@GuardedBy("mLock")
- private boolean mWaitToProcessVibratorCallbacks;
+ private boolean mWaitToProcessVibratorCompleteCallbacks;
- public void offer(@NonNull Step step) {
+ public void initializeForEffect(@NonNull CombinedVibration.Sequential vibration) {
synchronized (mLock) {
- if (!step.isCleanUp()) {
- mPendingVibrateSteps++;
- }
- mNextSteps.offer(step);
+ mPendingVibrateSteps++;
+ mNextSteps.offer(new StartVibrateStep(vibration));
}
}
- public boolean isEmpty() {
+ public boolean isFinished() {
synchronized (mLock) {
return mPendingOnVibratorCompleteSteps.isEmpty() && mNextSteps.isEmpty();
}
@@ -429,11 +441,11 @@
}
}
- /** Returns the time in millis to wait before calling {@link #consumeNext()}. */
- @GuardedBy("mLock")
- public long calculateWaitTime() {
+ /** Returns the time in millis to wait before calling {@link #runNextStep()}. */
+ @GuardedBy("VibrationThread.this.mLock")
+ public long getWaitMillisBeforeNextStep() {
if (!mPendingOnVibratorCompleteSteps.isEmpty()) {
- // Steps anticipated by vibrator complete callback should be played right away.
+ // Steps resumed by vibrator complete callback should be played right away.
return 0;
}
Step nextStep = mNextSteps.peek();
@@ -444,7 +456,7 @@
* Play and remove the step at the top of this queue, and also adds the next steps generated
* to be played next.
*/
- public void consumeNext() {
+ public void runNextStep() {
// Vibrator callbacks should wait until the polled step is played and the next steps are
// added back to the queue, so they can handle the callback.
markWaitToProcessVibratorCallbacks();
@@ -472,7 +484,7 @@
}
} finally {
synchronized (mLock) {
- processVibratorCallbacks();
+ processVibratorCompleteCallbacks();
}
}
}
@@ -485,10 +497,10 @@
*/
@GuardedBy("mLock")
public void notifyVibratorComplete(int vibratorId) {
- mNotifiedVibrators.offer(vibratorId);
- if (!mWaitToProcessVibratorCallbacks) {
+ mCompletionNotifiedVibrators.offer(vibratorId);
+ if (!mWaitToProcessVibratorCompleteCallbacks) {
// No step is being played or cancelled now, process the callback right away.
- processVibratorCallbacks();
+ processVibratorCompleteCallbacks();
}
}
@@ -515,7 +527,7 @@
}
} finally {
synchronized (mLock) {
- processVibratorCallbacks();
+ processVibratorCompleteCallbacks();
}
}
}
@@ -540,7 +552,7 @@
}
} finally {
synchronized (mLock) {
- processVibratorCallbacks();
+ processVibratorCompleteCallbacks();
}
}
}
@@ -548,7 +560,7 @@
@Nullable
private Step pollNext() {
synchronized (mLock) {
- // Prioritize the steps anticipated by a vibrator complete callback.
+ // Prioritize the steps resumed by a vibrator complete callback.
if (!mPendingOnVibratorCompleteSteps.isEmpty()) {
return mPendingOnVibratorCompleteSteps.poll();
}
@@ -558,29 +570,29 @@
private void markWaitToProcessVibratorCallbacks() {
synchronized (mLock) {
- mWaitToProcessVibratorCallbacks = true;
+ mWaitToProcessVibratorCompleteCallbacks = true;
}
}
/**
- * Notify the step in this queue that should be anticipated by the vibrator completion
- * callback and keep it separate to be consumed by {@link #consumeNext()}.
+ * Notify the step in this queue that should be resumed by the vibrator completion
+ * callback and keep it separate to be consumed by {@link #runNextStep()}.
*
* <p>This is a lightweight method that do not trigger any operation from {@link
* VibratorController}, so it can be called directly from a native callback.
*
* <p>This assumes only one of the next steps is waiting on this given vibrator, so the
- * first step found will be anticipated by this method, in no particular order.
+ * first step found will be resumed by this method, in no particular order.
*/
@GuardedBy("mLock")
- private void processVibratorCallbacks() {
- mWaitToProcessVibratorCallbacks = false;
- while (!mNotifiedVibrators.isEmpty()) {
- int vibratorId = mNotifiedVibrators.poll();
+ private void processVibratorCompleteCallbacks() {
+ mWaitToProcessVibratorCompleteCallbacks = false;
+ while (!mCompletionNotifiedVibrators.isEmpty()) {
+ int vibratorId = mCompletionNotifiedVibrators.poll();
Iterator<Step> it = mNextSteps.iterator();
while (it.hasNext()) {
Step step = it.next();
- if (step.shouldPlayWhenVibratorComplete(vibratorId)) {
+ if (step.acceptVibratorCompleteCallback(vibratorId)) {
it.remove();
mPendingOnVibratorCompleteSteps.offer(step);
break;
@@ -637,10 +649,10 @@
}
/**
- * Return true to play this step right after a vibrator has notified vibration completed,
- * used to anticipate steps waiting on vibrator callbacks with a timeout.
+ * Return true to run this step right after a vibrator has notified vibration completed,
+ * used to resume steps waiting on vibrator callbacks with a timeout.
*/
- public boolean shouldPlayWhenVibratorComplete(int vibratorId) {
+ public boolean acceptVibratorCompleteCallback(int vibratorId) {
return false;
}
@@ -670,7 +682,7 @@
* add a {@link FinishVibrateStep} to the queue, to be played after all vibrators have finished
* all their individual steps.
*
- * <o>If this step does not start any vibrator, it will add a {@link StartVibrateStep} if the
+ * <p>If this step does not start any vibrator, it will add a {@link StartVibrateStep} if the
* sequential effect isn't finished yet.
*/
private final class StartVibrateStep extends Step {
@@ -805,7 +817,7 @@
boolean hasTriggered = false;
long maxDuration = 0;
try {
- hasPrepared = mCallbacks.prepareSyncedVibration(
+ hasPrepared = mVibratorManagerHooks.prepareSyncedVibration(
effectMapping.getRequiredSyncCapabilities(),
effectMapping.getVibratorIds());
@@ -821,13 +833,13 @@
// Check if sync was prepared and if any step was accepted by a vibrator,
// otherwise there is nothing to trigger here.
if (hasPrepared && maxDuration > 0) {
- hasTriggered = mCallbacks.triggerSyncedVibration(mVibration.id);
+ hasTriggered = mVibratorManagerHooks.triggerSyncedVibration(mVibration.id);
}
return maxDuration;
} finally {
if (hasPrepared && !hasTriggered) {
// Trigger has failed or all steps were ignored by the vibrators.
- mCallbacks.cancelSyncedVibration();
+ mVibratorManagerHooks.cancelSyncedVibration();
nextSteps.clear();
} else if (maxDuration < 0) {
// Some vibrator failed without being prepared so other vibrators might be
@@ -910,7 +922,7 @@
public final long vibratorOffTimeout;
long mVibratorOnResult;
- boolean mVibratorCallbackReceived;
+ boolean mVibratorCompleteCallbackReceived;
/**
* @param startTime The time to schedule this step in the {@link StepQueue}.
@@ -919,7 +931,7 @@
* @param index The index of the next segment to be played by this step
* @param vibratorOffTimeout The time the vibrator is expected to complete any previous
* vibration and turn off. This is used to allow this step to be
- * anticipated when the completion callback is triggered, and can
+ * triggered when the completion callback is received, and can
* be used play effects back-to-back.
*/
SingleVibratorStep(long startTime, VibratorController controller,
@@ -937,17 +949,17 @@
}
@Override
- public boolean shouldPlayWhenVibratorComplete(int vibratorId) {
+ public boolean acceptVibratorCompleteCallback(int vibratorId) {
boolean isSameVibrator = controller.getVibratorInfo().getId() == vibratorId;
- mVibratorCallbackReceived |= isSameVibrator;
- // Only anticipate this step if a timeout was set to wait for the vibration to complete,
+ mVibratorCompleteCallbackReceived |= isSameVibrator;
+ // Only activate this step if a timeout was set to wait for the vibration to complete,
// otherwise we are waiting for the correct time to play the next step.
return isSameVibrator && (vibratorOffTimeout > SystemClock.uptimeMillis());
}
@Override
public List<Step> cancel() {
- return Arrays.asList(new CompleteStep(SystemClock.uptimeMillis(),
+ return Arrays.asList(new EffectCompleteStep(SystemClock.uptimeMillis(),
/* cancelled= */ true, controller, vibratorOffTimeout));
}
@@ -1205,10 +1217,10 @@
* <p>This runs right at the time the vibration is considered to end and will update the pending
* vibrators count. This can turn off the vibrator or slowly ramp it down to zero amplitude.
*/
- private final class CompleteStep extends SingleVibratorStep {
+ private final class EffectCompleteStep extends SingleVibratorStep {
private final boolean mCancelled;
- CompleteStep(long startTime, boolean cancelled, VibratorController controller,
+ EffectCompleteStep(long startTime, boolean cancelled, VibratorController controller,
long vibratorOffTimeout) {
super(startTime, controller, /* effect= */ null, /* index= */ -1, vibratorOffTimeout);
mCancelled = cancelled;
@@ -1232,13 +1244,13 @@
@Override
public List<Step> play() {
- Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "CompleteStep");
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "EffectCompleteStep");
try {
if (DEBUG) {
Slog.d(TAG, "Running " + (mCancelled ? "cancel" : "complete") + " vibration"
+ " step on vibrator " + controller.getVibratorInfo().getId());
}
- if (mVibratorCallbackReceived) {
+ if (mVibratorCompleteCallbackReceived) {
// Vibration completion callback was received by this step, just turn if off
// and skip any clean-up.
stopVibrating();
@@ -1310,7 +1322,7 @@
Slog.d(TAG, "Ramp down the vibrator amplitude, step with "
+ latency + "ms latency.");
}
- if (mVibratorCallbackReceived) {
+ if (mVibratorCompleteCallbackReceived) {
// Vibration completion callback was received by this step, just turn if off
// and skip the rest of the steps to ramp down the vibrator amplitude.
stopVibrating();
@@ -1337,7 +1349,7 @@
* Represents a step to turn the vibrator off.
*
* <p>This runs after a timeout on the expected time the vibrator should have finished playing,
- * and can anticipated by vibrator complete callbacks.
+ * and can be brought forward by vibrator complete callbacks.
*/
private final class OffStep extends SingleVibratorStep {
@@ -1389,13 +1401,14 @@
}
@Override
- public boolean shouldPlayWhenVibratorComplete(int vibratorId) {
+ public boolean acceptVibratorCompleteCallback(int vibratorId) {
if (controller.getVibratorInfo().getId() == vibratorId) {
- mVibratorCallbackReceived = true;
+ mVibratorCompleteCallbackReceived = true;
mNextOffTime = SystemClock.uptimeMillis();
}
- // Timings are tightly controlled here, so only anticipate if the vibrator was supposed
- // to be ON but has completed prematurely, to turn it back on as soon as possible.
+ // Timings are tightly controlled here, so only trigger this step if the vibrator was
+ // supposed to be ON but has completed prematurely, to turn it back on as soon as
+ // possible.
return mNextOffTime < startTime && controller.getCurrentAmplitude() > 0;
}
@@ -1409,8 +1422,8 @@
Slog.d(TAG, "Running amplitude step with " + latency + "ms latency.");
}
- if (mVibratorCallbackReceived && latency < 0) {
- // This step was anticipated because the vibrator turned off prematurely.
+ if (mVibratorCompleteCallbackReceived && latency < 0) {
+ // This step was run early because the vibrator turned off prematurely.
// Turn it back on and return this same step to run at the exact right time.
mNextOffTime = turnVibratorBackOn(/* remainingDuration= */ -latency);
return Arrays.asList(new AmplitudeStep(startTime, controller, effect,
diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
index b2e34da..63f3af3 100644
--- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
@@ -125,7 +125,8 @@
private final long mCapabilities;
private final int[] mVibratorIds;
private final SparseArray<VibratorController> mVibrators;
- private final VibrationCallbacks mVibrationCallbacks = new VibrationCallbacks();
+ private final VibrationThreadCallbacks mVibrationThreadCallbacks =
+ new VibrationThreadCallbacks();
@GuardedBy("mLock")
private final SparseArray<AlwaysOnVibration> mAlwaysOnEffects = new SparseArray<>();
@GuardedBy("mLock")
@@ -634,7 +635,7 @@
VibrationThread vibThread = new VibrationThread(vib, mVibrationSettings,
mDeviceVibrationEffectAdapter, mVibrators, mWakeLock, mBatteryStatsService,
- mVibrationCallbacks);
+ mVibrationThreadCallbacks);
if (mCurrentVibration == null) {
return startVibrationThreadLocked(vibThread);
@@ -1115,10 +1116,10 @@
}
/**
- * Implementation of {@link VibrationThread.VibrationCallbacks} that controls synced vibrations
- * and reports them when finished.
+ * Implementation of {@link VibrationThread.VibratorManagerHooks} that controls synced
+ * vibrations and reports them when finished.
*/
- private final class VibrationCallbacks implements VibrationThread.VibrationCallbacks {
+ private final class VibrationThreadCallbacks implements VibrationThread.VibratorManagerHooks {
@Override
public boolean prepareSyncedVibration(long requiredCapabilities, int[] vibratorIds) {
@@ -1153,7 +1154,7 @@
}
@Override
- public void onVibratorsReleased() {
+ public void onVibrationThreadReleased() {
if (DEBUG) {
Slog.d(TAG, "Vibrators released after finished vibration");
}
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index d526845..a4a200d 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -746,8 +746,8 @@
// if it is not already expanding to fullscreen. Otherwise, the arguments will
// be used the next time the activity enters PiP.
final Task rootTask = r.getRootTask();
- rootTask.setPictureInPictureAspectRatio(
- r.pictureInPictureArgs.getAspectRatio());
+ rootTask.setPictureInPictureAspectRatio(r.pictureInPictureArgs.getAspectRatio(),
+ r.pictureInPictureArgs.getExpandedAspectRatio());
rootTask.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
}
}
@@ -756,6 +756,19 @@
}
}
+ @Override
+ public void setPreferDockBigOverlays(IBinder token, boolean preferDockBigOverlays) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ r.setPreferDockBigOverlays(preferDockBigOverlays);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
/**
* Splash screen view is attached to activity.
*/
@@ -808,18 +821,28 @@
+ ": Current activity does not support picture-in-picture.");
}
+ final float minAspectRatio = mContext.getResources().getFloat(
+ com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
+ final float maxAspectRatio = mContext.getResources().getFloat(
+ com.android.internal.R.dimen.config_pictureInPictureMaxAspectRatio);
+
if (params.hasSetAspectRatio()
&& !mService.mWindowManager.isValidPictureInPictureAspectRatio(
r.mDisplayContent, params.getAspectRatio())) {
- final float minAspectRatio = mContext.getResources().getFloat(
- com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
- final float maxAspectRatio = mContext.getResources().getFloat(
- com.android.internal.R.dimen.config_pictureInPictureMaxAspectRatio);
throw new IllegalArgumentException(String.format(caller
+ ": Aspect ratio is too extreme (must be between %f and %f).",
minAspectRatio, maxAspectRatio));
}
+ if (mService.mSupportsExpandedPictureInPicture && params.hasSetExpandedAspectRatio()
+ && !mService.mWindowManager.isValidExpandedPictureInPictureAspectRatio(
+ r.mDisplayContent, params.getExpandedAspectRatio())) {
+ throw new IllegalArgumentException(String.format(caller
+ + ": Expanded aspect ratio is not extreme enough (must not be between"
+ + " %f and %f).",
+ minAspectRatio, maxAspectRatio));
+ }
+
// Truncate the number of actions if necessary.
params.truncateActions(ActivityTaskManager.getMaxNumPictureInPictureActions(mContext));
return r;
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 6ef6c7a..b0efa5b 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -293,9 +293,7 @@
import android.os.UserHandle;
import android.service.contentcapture.ActivityEvent;
import android.service.dreams.DreamActivity;
-import android.service.dreams.DreamManagerInternal;
import android.service.voice.IVoiceInteractionSession;
-import android.text.TextUtils;
import android.util.ArraySet;
import android.util.EventLog;
import android.util.Log;
@@ -350,6 +348,8 @@
import com.android.server.wm.WindowManagerService.H;
import com.android.server.wm.utils.InsetUtils;
+import dalvik.annotation.optimization.NeverCompile;
+
import com.google.android.collect.Sets;
import org.xmlpull.v1.XmlPullParserException;
@@ -532,6 +532,7 @@
// activity can enter picture in picture while pausing (only when switching to another task)
PictureInPictureParams pictureInPictureArgs = new PictureInPictureParams.Builder().build();
// The PiP params used when deferring the entering of picture-in-picture.
+ boolean preferDockBigOverlays;
int launchCount; // count of launches since last state
long lastLaunchTime; // time of last launch of this activity
ComponentName requestedVrComponent; // the requested component for handling VR mode.
@@ -627,6 +628,10 @@
// it references to gets removed. This should also be cleared when we move out of pip.
private Task mLastParentBeforePip;
+ // Only set if this instance is a launch-into-pip Activity, points to the
+ // host Activity the launch-into-pip Activity is originated from.
+ private ActivityRecord mLaunchIntoPipHostActivity;
+
boolean firstWindowDrawn;
/** Whether the visible window(s) of this activity is drawn. */
private boolean mReportedDrawn;
@@ -944,6 +949,7 @@
}
};
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
void dump(PrintWriter pw, String prefix, boolean dumpAll) {
final long now = SystemClock.uptimeMillis();
@@ -1223,6 +1229,9 @@
if (mLastParentBeforePip != null) {
pw.println(prefix + "lastParentTaskIdBeforePip=" + mLastParentBeforePip.mTaskId);
}
+ if (mLaunchIntoPipHostActivity != null) {
+ pw.println(prefix + "launchIntoPipHostActivity=" + mLaunchIntoPipHostActivity);
+ }
mLetterboxUiController.dump(pw, prefix);
@@ -1557,10 +1566,16 @@
/**
* Sets {@link #mLastParentBeforePip} to the current parent Task, it's caller's job to ensure
* {@link #getTask()} is set before this is called.
+ *
+ * @param launchIntoPipHostActivity {@link ActivityRecord} as the host Activity for the
+ * launch-int-pip Activity see also {@link #mLaunchIntoPipHostActivity}.
*/
- void setLastParentBeforePip() {
- mLastParentBeforePip = getTask();
+ void setLastParentBeforePip(@Nullable ActivityRecord launchIntoPipHostActivity) {
+ mLastParentBeforePip = (launchIntoPipHostActivity == null)
+ ? getTask()
+ : launchIntoPipHostActivity.getTask();
mLastParentBeforePip.mChildPipActivity = this;
+ mLaunchIntoPipHostActivity = launchIntoPipHostActivity;
}
private void clearLastParentBeforePip() {
@@ -1568,12 +1583,17 @@
mLastParentBeforePip.mChildPipActivity = null;
mLastParentBeforePip = null;
}
+ mLaunchIntoPipHostActivity = null;
}
@Nullable Task getLastParentBeforePip() {
return mLastParentBeforePip;
}
+ @Nullable ActivityRecord getLaunchIntoPipHostActivity() {
+ return mLaunchIntoPipHostActivity;
+ }
+
private void updateColorTransform() {
if (mSurfaceControl != null && mLastAppSaturationInfo != null) {
getPendingTransaction().setColorTransform(mSurfaceControl,
@@ -1854,6 +1874,10 @@
mRotationAnimationHint = rotationAnimation;
}
+ if (options.getLaunchIntoPipParams() != null) {
+ pictureInPictureArgs = options.getLaunchIntoPipParams();
+ }
+
mOverrideTaskTransition = options.getOverrideTaskTransition();
}
@@ -1958,6 +1982,8 @@
mLetterboxUiController = new LetterboxUiController(mWmService, this);
mCameraCompatControlEnabled = mWmService.mContext.getResources()
.getBoolean(R.bool.config_isCameraCompatControlForStretchedIssuesEnabled);
+ preferDockBigOverlays = mWmService.mContext.getResources()
+ .getBoolean(R.bool.config_dockBigOverlayWindows);
if (_createTime > 0) {
createTime = _createTime;
@@ -2511,7 +2537,6 @@
}
removeStartingWindowAnimation(true /* prepareAnimation */);
- // TODO(b/215316431): Add tests
final Task task = getTask();
if (prevEligibleForLetterboxEducation != isEligibleForLetterboxEducation()
&& task != null) {
@@ -2642,31 +2667,6 @@
return false;
}
- static boolean canLaunchDreamActivity(String packageName) {
- if (packageName == null) {
- return false;
- }
-
- if (!LocalServices.getService(ActivityTaskManagerInternal.class).isDreaming()) {
- return false;
- }
-
- final DreamManagerInternal dreamManager =
- LocalServices.getService(DreamManagerInternal.class);
-
- // Verify that the package is the current active dream or doze component. The
- // getActiveDreamComponent() call path does not acquire the DreamManager lock and thus
- // is safe to use.
- final ComponentName activeDream = dreamManager.getActiveDreamComponent(false /* doze */);
- final ComponentName activeDoze = dreamManager.getActiveDreamComponent(true /* doze */);
- return TextUtils.equals(packageName, getPackageName(activeDream))
- || TextUtils.equals(packageName, getPackageName(activeDoze));
- }
-
- private static String getPackageName(ComponentName componentName) {
- return componentName != null ? componentName.getPackageName() : null;
- }
-
private void setActivityType(boolean componentSpecified, int launchedFromUid, Intent intent,
ActivityOptions options, ActivityRecord sourceRecord) {
int activityType = ACTIVITY_TYPE_UNDEFINED;
@@ -2687,7 +2687,7 @@
&& canLaunchAssistActivity(launchedFromPackage)) {
activityType = ACTIVITY_TYPE_ASSISTANT;
} else if (options != null && options.getLaunchActivityType() == ACTIVITY_TYPE_DREAM
- && canLaunchDreamActivity(launchedFromPackage)
+ && mAtmService.canLaunchDreamActivity(launchedFromPackage)
&& DreamActivity.class.getName() == info.name) {
activityType = ACTIVITY_TYPE_DREAM;
}
@@ -4563,7 +4563,7 @@
pendingOptions.getStartX(), pendingOptions.getStartY(),
pendingOptions.getAnimationStartedListener(),
scaleUp);
- options = AnimationOptions.makeThumnbnailAnimOptions(buffer,
+ options = AnimationOptions.makeThumbnailAnimOptions(buffer,
pendingOptions.getStartX(), pendingOptions.getStartY(), scaleUp);
startCallback = pendingOptions.getAnimationStartedListener();
if (intent.getSourceBounds() == null && buffer != null) {
@@ -7716,7 +7716,6 @@
* once the starting window is removed in {@link #removeStartingWindow}).
* </ul>
*/
- // TODO(b/215316431): Add tests
boolean isEligibleForLetterboxEducation() {
return mWmService.mLetterboxConfiguration.getIsEducationEnabled()
&& mIsEligibleForFixedOrientationLetterbox
@@ -9457,6 +9456,11 @@
getTask().getRootTask().onPictureInPictureParamsChanged();
}
+ void setPreferDockBigOverlays(boolean preferDockBigOverlays) {
+ this.preferDockBigOverlays = preferDockBigOverlays;
+ getTask().getRootTask().onPreferDockBigOverlaysChanged();
+ }
+
@Override
boolean isSyncFinished() {
if (!super.isSyncFinished()) return false;
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index fb3d17a..ef0ee12 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1820,7 +1820,7 @@
if (!mAvoidMoveToFront && mDoResume) {
mTargetRootTask.getRootTask().moveToFront("reuseOrNewTask", targetTask);
- if (!mTargetRootTask.isTopRootTaskInDisplayArea() && mService.mInternal.isDreaming()
+ if (!mTargetRootTask.isTopRootTaskInDisplayArea() && mService.isDreaming()
&& !dreamStopping) {
// Launching underneath dream activity (fullscreen, always-on-top). Run the launch-
// -behind transition so the Activity gets created and starts in visible state.
@@ -1896,6 +1896,14 @@
mSupervisor.handleNonResizableTaskIfNeeded(startedTask,
mPreferredWindowingMode, mPreferredTaskDisplayArea, mTargetRootTask);
+ // If Activity's launching into PiP, move the mStartActivity immediately to pinned mode.
+ // Note that mStartActivity and source should be in the same Task at this point.
+ if (mOptions != null && mOptions.isLaunchIntoPip()
+ && sourceRecord != null && sourceRecord.getTask() == mStartActivity.getTask()) {
+ mRootWindowContainer.moveActivityToPinnedRootTask(mStartActivity,
+ sourceRecord, "launch-into-pip");
+ }
+
return START_SUCCESS;
}
@@ -2099,7 +2107,7 @@
// At this point we are certain we want the task moved to the front. If we need to dismiss
// any other always-on-top root tasks, now is the time to do it.
- if (targetTaskTop.canTurnScreenOn() && mService.mInternal.isDreaming()) {
+ if (targetTaskTop.canTurnScreenOn() && mService.isDreaming()) {
targetTaskTop.mTaskSupervisor.wakeUp("recycleTask#turnScreenOnFlag");
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index 23508d9..25c4d20 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -316,7 +316,6 @@
public abstract void clearHeavyWeightProcessIfEquals(WindowProcessController proc);
public abstract void finishHeavyWeightApp();
- public abstract boolean isDreaming();
public abstract boolean isSleeping();
public abstract boolean isShuttingDown();
public abstract boolean shuttingDown(boolean booted, int timeout);
@@ -456,15 +455,6 @@
/** Writes current activity states to the proto stream. */
public abstract void writeActivitiesToProto(ProtoOutputStream proto);
- /**
- * Saves the current activity manager state and includes the saved state in the next dump of
- * activity manager.
- */
- public abstract void saveANRState(String reason);
-
- /** Clears the previously saved activity manager ANR state. */
- public abstract void clearSavedANRState();
-
/** Dump the current state based on the command. */
public abstract void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args,
int opti, boolean dumpAll, boolean dumpClient, String dumpPackage);
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 9f8d097..0497477 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -44,6 +44,7 @@
import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED;
import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
import static android.content.pm.PackageManager.FEATURE_CANT_SAVE_STATE;
+import static android.content.pm.PackageManager.FEATURE_EXPANDED_PICTURE_IN_PICTURE;
import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
@@ -208,6 +209,7 @@
import android.os.storage.StorageManager;
import android.provider.Settings;
import android.service.dreams.DreamActivity;
+import android.service.dreams.DreamManagerInternal;
import android.service.voice.IVoiceInteractionSession;
import android.service.voice.VoiceInteractionManagerInternal;
import android.sysprop.DisplayProperties;
@@ -590,6 +592,7 @@
boolean mSupportsSplitScreenMultiWindow;
boolean mSupportsFreeformWindowManagement;
boolean mSupportsPictureInPicture;
+ boolean mSupportsExpandedPictureInPicture;
boolean mSupportsMultiDisplay;
boolean mForceResizableActivities;
@@ -671,7 +674,7 @@
* start/stop the dream. It is set to true shortly before the {@link DreamService} is started.
* It is set to false after the {@link DreamService} is stopped.
*/
- private boolean mDreaming = false;
+ private volatile boolean mDreaming;
/**
* The process state used for processes that are running the top activities.
@@ -883,6 +886,9 @@
final boolean supportsMultiWindow = ActivityTaskManager.supportsMultiWindow(mContext);
final boolean supportsPictureInPicture = supportsMultiWindow &&
mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
+ final boolean supportsExpandedPictureInPicture =
+ supportsPictureInPicture && mContext.getPackageManager().hasSystemFeature(
+ FEATURE_EXPANDED_PICTURE_IN_PICTURE);
final boolean supportsSplitScreenMultiWindow =
ActivityTaskManager.supportsSplitScreenMultiWindow(mContext);
final boolean supportsMultiDisplay = mContext.getPackageManager()
@@ -930,12 +936,14 @@
mSupportsFreeformWindowManagement = freeformWindowManagement;
mSupportsSplitScreenMultiWindow = supportsSplitScreenMultiWindow;
mSupportsPictureInPicture = supportsPictureInPicture;
+ mSupportsExpandedPictureInPicture = supportsExpandedPictureInPicture;
mSupportsMultiDisplay = supportsMultiDisplay;
} else {
mSupportsMultiWindow = false;
mSupportsFreeformWindowManagement = false;
mSupportsSplitScreenMultiWindow = false;
mSupportsPictureInPicture = false;
+ mSupportsExpandedPictureInPicture = false;
mSupportsMultiDisplay = false;
}
mWindowManager.mRoot.onSettingsRetrieved();
@@ -1399,10 +1407,34 @@
}
}
+ boolean isDreaming() {
+ return mDreaming;
+ }
+
+ boolean canLaunchDreamActivity(String packageName) {
+ if (!mDreaming || packageName == null) {
+ return false;
+ }
+ final DreamManagerInternal dreamManager =
+ LocalServices.getService(DreamManagerInternal.class);
+ // Verify that the package is the current active dream or doze component. The
+ // getActiveDreamComponent() call path does not acquire the DreamManager lock and thus
+ // is safe to use.
+ final ComponentName activeDream = dreamManager.getActiveDreamComponent(false /* doze */);
+ if (activeDream != null && packageName.equals(activeDream.getPackageName())) {
+ return true;
+ }
+ final ComponentName activeDoze = dreamManager.getActiveDreamComponent(true /* doze */);
+ if (activeDoze != null && packageName.equals(activeDoze.getPackageName())) {
+ return true;
+ }
+ return false;
+ }
+
private void enforceCallerIsDream(String callerPackageName) {
final long origId = Binder.clearCallingIdentity();
try {
- if (!ActivityRecord.canLaunchDreamActivity(callerPackageName)) {
+ if (!canLaunchDreamActivity(callerPackageName)) {
throw new SecurityException("The dream activity can be started only when the device"
+ " is dreaming and only by the active dream package.");
}
@@ -1436,7 +1468,7 @@
a.packageName = process.mInfo.packageName;
a.applicationInfo = process.mInfo;
- a.processName = process.mInfo.processName;
+ a.processName = process.mName;
a.uiOptions = process.mInfo.uiOptions;
a.taskAffinity = "android:" + a.packageName + "/dream";
@@ -3049,7 +3081,7 @@
* SecurityException} or returns false with a logcat message depending on whether the app
* targets SDK level {@link android.os.Build.VERSION_CODES#S} or not.
*/
- private boolean checkCanCloseSystemDialogs(int pid, int uid, @Nullable String packageName) {
+ boolean checkCanCloseSystemDialogs(int pid, int uid, @Nullable String packageName) {
final WindowProcessController process;
synchronized (mGlobalLock) {
process = mProcessMap.getProcess(pid);
@@ -3177,8 +3209,12 @@
permission, pid, uid, owningUid, exported);
}
+ boolean isCallerRecents(int callingUid) {
+ return mRecentTasks.isCallerRecents(callingUid);
+ }
+
boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
- if (getRecentTasks().isCallerRecents(callingUid)) {
+ if (isCallerRecents(callingUid)) {
// Always allow the recents component to get tasks
return true;
}
@@ -3500,11 +3536,12 @@
// Only update the saved args from the args that are set
r.setPictureInPictureParams(params);
final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
+ final float expandedAspectRatio = r.pictureInPictureArgs.getExpandedAspectRatio();
final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
- mRootWindowContainer.moveActivityToPinnedRootTask(
- r, "enterPictureInPictureMode");
+ mRootWindowContainer.moveActivityToPinnedRootTask(r,
+ null /* launchIntoPipHostActivity */, "enterPictureInPictureMode");
final Task task = r.getTask();
- task.setPictureInPictureAspectRatio(aspectRatio);
+ task.setPictureInPictureAspectRatio(aspectRatio, expandedAspectRatio);
task.setPictureInPictureActions(actions);
// Continue the pausing process after entering pip.
@@ -3885,11 +3922,11 @@
@Override
public void onPictureInPictureStateChanged(PictureInPictureUiState pipState) {
enforceTaskPermission("onPictureInPictureStateChanged");
- final Task rootPinnedStask = mRootWindowContainer.getDefaultTaskDisplayArea()
+ final Task rootPinnedTask = mRootWindowContainer.getDefaultTaskDisplayArea()
.getRootPinnedTask();
- if (rootPinnedStask != null && rootPinnedStask.getTopMostActivity() != null) {
+ if (rootPinnedTask != null && rootPinnedTask.getTopMostActivity() != null) {
mWindowManager.mAtmService.mActivityClientController.onPictureInPictureStateChanged(
- rootPinnedStask.getTopMostActivity(), pipState);
+ rootPinnedTask.getTopMostActivity(), pipState);
}
}
@@ -5127,11 +5164,28 @@
}
/**
- * @return allowlist tag for a uid from mPendingTempAllowlist, null if not currently on
- * the allowlist
+ * Saves the current activity manager state and includes the saved state in the next dump of
+ * activity manager.
*/
- String getPendingTempAllowlistTagForUidLocked(int uid) {
- return mPendingTempAllowlist.get(uid);
+ void saveANRState(String reason) {
+ final StringWriter sw = new StringWriter();
+ final PrintWriter pw = new FastPrintWriter(sw, false, 1024);
+ pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date()));
+ if (reason != null) {
+ pw.println(" Reason: " + reason);
+ }
+ pw.println();
+ getActivityStartController().dump(pw, " ", null);
+ pw.println();
+ pw.println("-------------------------------------------------------------------"
+ + "------------");
+ dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
+ true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */,
+ "" /* header */);
+ pw.println();
+ pw.close();
+
+ mLastANRState = sw.toString();
}
void logAppTooSlow(WindowProcessController app, long startTime, String msg) {
@@ -5514,7 +5568,7 @@
@Override
public boolean isCallerRecents(int callingUid) {
- return getRecentTasks().isCallerRecents(callingUid);
+ return ActivityTaskManagerService.this.isCallerRecents(callingUid);
}
@Override
@@ -5642,13 +5696,6 @@
}
}
- @Override
- public boolean isDreaming() {
- synchronized (mGlobalLock) {
- return mDreaming;
- }
- }
-
@HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public boolean isSleeping() {
@@ -6052,7 +6099,8 @@
public boolean onForceStopPackage(String packageName, boolean doit, boolean evenPersistent,
int userId) {
synchronized (mGlobalLock) {
-
+ // In case if setWindowManager hasn't been called yet when booting.
+ if (mRootWindowContainer == null) return false;
return mRootWindowContainer.finishDisabledPackageActivities(packageName,
null /* filterByClasses */, doit, evenPersistent, userId,
// Only remove the activities without process because the activities with
@@ -6149,37 +6197,6 @@
}
@Override
- public void saveANRState(String reason) {
- synchronized (mGlobalLock) {
- final StringWriter sw = new StringWriter();
- final PrintWriter pw = new FastPrintWriter(sw, false, 1024);
- pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date()));
- if (reason != null) {
- pw.println(" Reason: " + reason);
- }
- pw.println();
- getActivityStartController().dump(pw, " ", null);
- pw.println();
- pw.println("-------------------------------------------------------------------"
- + "------------");
- dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
- true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */,
- "" /* header */);
- pw.println();
- pw.close();
-
- mLastANRState = sw.toString();
- }
- }
-
- @Override
- public void clearSavedANRState() {
- synchronized (mGlobalLock) {
- mLastANRState = null;
- }
- }
-
- @Override
public void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args, int opti,
boolean dumpAll, boolean dumpClient, String dumpPackage) {
synchronized (mGlobalLock) {
diff --git a/services/core/java/com/android/server/wm/AnrController.java b/services/core/java/com/android/server/wm/AnrController.java
index 98cd40a..3d54b27 100644
--- a/services/core/java/com/android/server/wm/AnrController.java
+++ b/services/core/java/com/android/server/wm/AnrController.java
@@ -225,7 +225,7 @@
private void dumpAnrStateLocked(ActivityRecord activity, WindowState windowState,
String reason) {
mService.saveANRStateLocked(activity, windowState, reason);
- mService.mAtmInternal.saveANRState(reason);
+ mService.mAtmService.saveANRState(reason);
}
private boolean isWindowAboveSystem(WindowState windowState) {
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 475a9fb..457ea13 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -249,7 +249,7 @@
overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes);
}
- final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mOpeningApps)
+ final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mClosingApps)
|| containsVoiceInteraction(mDisplayContent.mOpeningApps);
final int layoutRedo;
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index 45a6cb9..9893f68 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -22,11 +22,14 @@
import android.annotation.Nullable;
import android.app.WindowConfiguration;
import android.content.ComponentName;
+import android.graphics.Point;
+import android.graphics.Rect;
import android.hardware.HardwareBuffer;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.util.Slog;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.window.BackNavigationInfo;
import android.window.IOnBackInvokedCallback;
@@ -50,7 +53,11 @@
* Returns true if the back predictability feature is enabled
*/
static boolean isEnabled() {
- return SystemProperties.getInt(BACK_PREDICTABILITY_PROP, 0) > 0;
+ return SystemProperties.getInt(BACK_PREDICTABILITY_PROP, 1) > 0;
+ }
+
+ static boolean isScreenshotEnabled() {
+ return false;
}
/**
@@ -88,34 +95,40 @@
ActivityRecord activityRecord;
SurfaceControl animationLeashParent;
WindowConfiguration taskWindowConfiguration;
- SurfaceControl animLeash;
HardwareBuffer screenshotBuffer = null;
int prevTaskId;
int prevUserId;
- IOnBackInvokedCallback callback;
+ IOnBackInvokedCallback applicationCallback = null;
+ IOnBackInvokedCallback systemCallback = null;
+ RemoteAnimationTarget topAppTarget;
+ SurfaceControl animLeash;
synchronized (task.mWmService.mGlobalLock) {
activityRecord = task.topRunningActivity();
+
removedWindowContainer = activityRecord;
taskWindowConfiguration = task.getTaskInfo().configuration.windowConfiguration;
-
- WindowState topChild = activityRecord.getTopChild();
- callback = topChild.getOnBackInvokedCallback();
+ WindowState window = task.getWindow(WindowState::isFocused);
+ if (window != null) {
+ applicationCallback = window.getApplicationOnBackInvokedCallback();
+ systemCallback = window.getSystemOnBackInvokedCallback();
+ }
ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "startBackNavigation task=%s, "
- + "topRunningActivity=%s, topWindow=%s backCallback=%s",
- task, activityRecord, topChild,
- callback != null ? callback.getClass().getSimpleName() : null);
+ + "topRunningActivity=%s, applicationBackCallback=%s, "
+ + "systemBackCallback=%s",
+ task, activityRecord, applicationCallback, systemCallback);
// For IME and Home, either a callback is registered, or we do nothing. In both cases,
// we don't need to pass the leashes below.
if (task.getDisplayContent().getImeContainer().isVisible()
|| activityRecord.isActivityTypeHome()) {
- if (callback != null) {
+ if (applicationCallback != null) {
return new BackNavigationInfo(BackNavigationInfo.TYPE_CALLBACK,
null /* topWindowLeash */, null /* screenshotSurface */,
null /* screenshotBuffer */, null /* taskWindowConfiguration */,
- null /* onBackNavigationDone */, callback /* onBackInvokedCallback */);
+ null /* onBackNavigationDone */,
+ applicationCallback /* onBackInvokedCallback */);
} else {
return null;
}
@@ -124,8 +137,12 @@
prev = task.getActivity(
(r) -> !r.finishing && r.getTask() == task && !r.isTopRunningActivity());
- if (callback != null) {
- backType = BackNavigationInfo.TYPE_CALLBACK;
+ if (applicationCallback != null) {
+ return new BackNavigationInfo(BackNavigationInfo.TYPE_CALLBACK,
+ null /* topWindowLeash */, null /* screenshotSurface */,
+ null /* screenshotBuffer */, null /* taskWindowConfiguration */,
+ null /* onBackNavigationDone */,
+ applicationCallback /* onBackInvokedCallback */);
} else if (prev != null) {
backType = BackNavigationInfo.TYPE_CROSS_ACTIVITY;
} else if (task.returnsToHomeRootTask()) {
@@ -159,6 +176,11 @@
screenshotBuffer = getActivitySnapshot(task, prev.mActivityComponent);
}
+ // Only create a new leash if no leash has been created.
+ // Otherwise return null for animation target to avoid conflict.
+ if (removedWindowContainer.hasCommittedReparentToAnimationLeash()) {
+ return null;
+ }
// Prepare a leash to animate the current top window
animLeash = removedWindowContainer.makeAnimationLeash()
.setName("BackPreview Leash for " + removedWindowContainer)
@@ -166,8 +188,25 @@
.setBLASTLayer()
.build();
removedWindowContainer.reparentSurfaceControl(tx, animLeash);
-
animationLeashParent = removedWindowContainer.getAnimationLeashParent();
+ topAppTarget = new RemoteAnimationTarget(
+ task.mTaskId,
+ RemoteAnimationTarget.MODE_CLOSING,
+ animLeash,
+ false /* isTransluscent */,
+ new Rect() /* clipRect */,
+ new Rect() /* contentInsets */,
+ activityRecord.getPrefixOrderIndex(),
+ new Point(0, 0) /* position */,
+ new Rect() /* localBounds */,
+ new Rect() /* screenSpaceBounds */,
+ removedWindowContainer.getWindowConfiguration(),
+ true /* isNotInRecent */,
+ null,
+ null,
+ task.getTaskInfo(),
+ false,
+ activityRecord.windowType);
}
SurfaceControl.Builder builder = new SurfaceControl.Builder()
@@ -187,7 +226,7 @@
// The Animation leash needs to be above the screenshot surface, but the animation leash
// needs to be added before to be in the synchronized block.
- tx.setLayer(animLeash, 1);
+ tx.setLayer(topAppTarget.leash, 1);
tx.apply();
WindowContainer<?> finalRemovedWindowContainer = removedWindowContainer;
@@ -200,11 +239,13 @@
return null;
}
+ final IOnBackInvokedCallback callback =
+ applicationCallback != null ? applicationCallback : systemCallback;
RemoteCallback onBackNavigationDone = new RemoteCallback(
result -> resetSurfaces(finalRemovedWindowContainer
));
return new BackNavigationInfo(backType,
- animLeash,
+ topAppTarget,
screenshotSurface,
screenshotBuffer,
taskWindowConfiguration,
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index 132396b..0868111 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -652,7 +652,9 @@
void prepareSurfaces() {
mDimmer.resetDimStates();
super.prepareSurfaces();
+ // Bounds need to be relative, as the dim layer is a child.
getBounds(mTmpDimBoundsRect);
+ mTmpDimBoundsRect.offsetTo(0 /* newLeft */, 0 /* newTop */);
// If SystemUI is dragging for recents, we want to reset the dim state so any dim layer
// on the display level fades out.
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index e845034..ddfdddc 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -457,8 +457,6 @@
*/
private boolean mLastWallpaperVisible = false;
- private Rect mBaseDisplayRect = new Rect();
-
// Accessed directly by all users.
private boolean mLayoutNeeded;
int pendingLayoutChanges;
@@ -488,9 +486,6 @@
private final Rect mTmpRect2 = new Rect();
private final Region mTmpRegion = new Region();
- /** Used for handing back size of display */
- private final Rect mTmpBounds = new Rect();
-
private final Configuration mTmpConfiguration = new Configuration();
/** Remove this display when animation on it has completed. */
@@ -1362,8 +1357,8 @@
return mDisplayRotation;
}
- void setInsetProvider(@InternalInsetsType int type, WindowState win,
- @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider){
+ void setInsetProvider(@InternalInsetsType int type, WindowContainer win,
+ @Nullable TriConsumer<DisplayFrames, WindowContainer, Rect> frameProvider) {
setInsetProvider(type, win, frameProvider, null /* imeFrameProvider */);
}
@@ -1377,10 +1372,10 @@
* @param imeFrameProvider Function to compute the frame when dispatching insets to the IME, or
* {@code null} if the normal frame should be taken.
*/
- void setInsetProvider(@InternalInsetsType int type, WindowState win,
- @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider,
- @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) {
- mInsetsStateController.getSourceProvider(type).setWindow(win, frameProvider,
+ void setInsetProvider(@InternalInsetsType int type, WindowContainer win,
+ @Nullable TriConsumer<DisplayFrames, WindowContainer, Rect> frameProvider,
+ @Nullable TriConsumer<DisplayFrames, WindowContainer, Rect> imeFrameProvider) {
+ mInsetsStateController.getSourceProvider(type).setWindowContainer(win, frameProvider,
imeFrameProvider);
}
@@ -2080,8 +2075,6 @@
mWmService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(mDisplayId,
mDisplayInfo);
- mBaseDisplayRect.set(0, 0, dw, dh);
-
if (isDefaultDisplay) {
mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(mDisplayMetrics,
mCompatDisplayMetrics);
@@ -2213,14 +2206,14 @@
*/
void computeScreenConfiguration(Configuration config) {
final DisplayInfo displayInfo = updateDisplayAndOrientation(config.uiMode, config);
- calculateBounds(displayInfo, mTmpBounds);
- config.windowConfiguration.setBounds(mTmpBounds);
- config.windowConfiguration.setMaxBounds(mTmpBounds);
+ final int dw = displayInfo.logicalWidth;
+ final int dh = displayInfo.logicalHeight;
+ mTmpRect.set(0, 0, dw, dh);
+ config.windowConfiguration.setBounds(mTmpRect);
+ config.windowConfiguration.setMaxBounds(mTmpRect);
config.windowConfiguration.setWindowingMode(getWindowingMode());
config.windowConfiguration.setDisplayWindowingMode(getWindowingMode());
- final int dw = displayInfo.logicalWidth;
- final int dh = displayInfo.logicalHeight;
computeScreenAppConfiguration(config, dw, dh, displayInfo.rotation, config.uiMode,
displayInfo.displayCutout);
@@ -2844,10 +2837,6 @@
/** Update base (override) display metrics. */
void updateBaseDisplayMetrics(int baseWidth, int baseHeight, int baseDensity) {
- final int originalWidth = mBaseDisplayWidth;
- final int originalHeight = mBaseDisplayHeight;
- final int originalDensity = mBaseDisplayDensity;
-
mBaseDisplayWidth = baseWidth;
mBaseDisplayHeight = baseHeight;
mBaseDisplayDensity = baseDensity;
@@ -2867,12 +2856,6 @@
+ mBaseDisplayHeight + " on display:" + getDisplayId());
}
}
-
- if (mBaseDisplayWidth != originalWidth || mBaseDisplayHeight != originalHeight
- || mBaseDisplayDensity != originalDensity) {
- mBaseDisplayRect.set(0, 0, mBaseDisplayWidth, mBaseDisplayHeight);
- updateBounds();
- }
}
/**
@@ -3021,7 +3004,7 @@
if (focusedTask == null) {
mTouchExcludeRegion.setEmpty();
} else {
- mTouchExcludeRegion.set(mBaseDisplayRect);
+ mTouchExcludeRegion.set(0, 0, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
final int delta = dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, mDisplayMetrics);
mTmpRect.setEmpty();
mTmpRect2.setEmpty();
@@ -3822,7 +3805,7 @@
final int imePid = mInputMethodWindow.mSession.mPid;
mAtmService.onImeWindowSetOnDisplayArea(imePid, mImeWindowsContainer);
}
- mInsetsStateController.getSourceProvider(ITYPE_IME).setWindow(win,
+ mInsetsStateController.getSourceProvider(ITYPE_IME).setWindowContainer(win,
mDisplayPolicy.getImeSourceFrameProvider(), null /* imeFrameProvider */);
computeImeTarget(true /* updateImeTarget */);
updateImeControlTarget();
@@ -4587,25 +4570,6 @@
}
}
- private void updateBounds() {
- calculateBounds(mDisplayInfo, mTmpBounds);
- setBounds(mTmpBounds);
- }
-
- // Determines the current display bounds based on the current state
- private void calculateBounds(DisplayInfo displayInfo, Rect out) {
- // Uses same calculation as in LogicalDisplay#configureDisplayInTransactionLocked.
- final int rotation = displayInfo.rotation;
- boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270);
- final int physWidth = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
- final int physHeight = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
- int width = displayInfo.logicalWidth;
- int left = (physWidth - width) / 2;
- int height = displayInfo.logicalHeight;
- int top = (physHeight - height) / 2;
- out.set(left, top, left + width, top + height);
- }
-
private void getBounds(Rect out, @Rotation int rotation) {
getBounds(out);
@@ -5561,8 +5525,6 @@
}
void onDisplayChanged() {
- mDisplay.getRealSize(mTmpDisplaySize);
- setBounds(0, 0, mTmpDisplaySize.x, mTmpDisplaySize.y);
final int lastDisplayState = mDisplayInfo.state;
updateDisplayInfo();
@@ -6441,6 +6403,8 @@
@Override
public void onAppTransitionCancelledLocked(boolean keyguardGoingAway) {
+ // It is only needed when freezing display in legacy transition.
+ if (mTransitionController.isShellTransitionsEnabled()) return;
continueUpdateOrientationForDiffOrienLaunchingApp();
}
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 1513d8b..4148d8b 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -1037,7 +1037,7 @@
break;
case TYPE_NAVIGATION_BAR_PANEL:
// Check for permission if the caller is not the recents component.
- if (!mService.mAtmInternal.isCallerRecents(callingUid)) {
+ if (!mService.mAtmService.isCallerRecents(callingUid)) {
mContext.enforcePermission(
android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid,
"DisplayPolicy");
@@ -1056,7 +1056,7 @@
if (attrs.providesInsetsTypes != null) {
// Recents component is allowed to add inset types.
- if (!mService.mAtmInternal.isCallerRecents(callingUid)) {
+ if (!mService.mAtmService.isCallerRecents(callingUid)) {
mContext.enforcePermission(
android.Manifest.permission.STATUS_BAR_SERVICE, callingPid, callingUid,
"DisplayPolicy");
@@ -1106,8 +1106,8 @@
break;
case TYPE_STATUS_BAR:
mStatusBar = win;
- final TriConsumer<DisplayFrames, WindowState, Rect> gestureFrameProvider =
- (displayFrames, windowState, rect) -> {
+ final TriConsumer<DisplayFrames, WindowContainer, Rect> gestureFrameProvider =
+ (displayFrames, windowContainer, rect) -> {
rect.bottom = rect.top + getStatusBarHeight(displayFrames);
final DisplayCutout cutout =
displayFrames.mInsetsState.getDisplayCutout();
@@ -1128,24 +1128,25 @@
case TYPE_NAVIGATION_BAR:
mNavigationBar = win;
mDisplayContent.setInsetProvider(ITYPE_NAVIGATION_BAR, win,
- (displayFrames, windowState, inOutFrame) -> {
+ (displayFrames, windowContainer, inOutFrame) -> {
if (!mNavButtonForcedVisible) {
- inOutFrame.inset(windowState.getLayoutingAttrs(
+ inOutFrame.inset(win.getLayoutingAttrs(
displayFrames.mRotation).providedInternalInsets);
inOutFrame.inset(win.mGivenContentInsets);
}
},
// For IME we use regular frame.
- (displayFrames, windowState, inOutFrame) ->
- inOutFrame.set(windowState.getFrame()));
+ (displayFrames, windowContainer, inOutFrame) -> {
+ inOutFrame.set(win.getFrame());
+ });
mDisplayContent.setInsetProvider(ITYPE_BOTTOM_MANDATORY_GESTURES, win,
- (displayFrames, windowState, inOutFrame) -> {
+ (displayFrames, windowContainer, inOutFrame) -> {
inOutFrame.top -= mBottomGestureAdditionalInset;
});
mDisplayContent.setInsetProvider(ITYPE_LEFT_GESTURES, win,
- (displayFrames, windowState, inOutFrame) -> {
+ (displayFrames, windowContainer, inOutFrame) -> {
final int leftSafeInset =
Math.max(displayFrames.mDisplayCutoutSafe.left, 0);
inOutFrame.left = 0;
@@ -1154,7 +1155,7 @@
inOutFrame.right = leftSafeInset + mLeftGestureInset;
});
mDisplayContent.setInsetProvider(ITYPE_RIGHT_GESTURES, win,
- (displayFrames, windowState, inOutFrame) -> {
+ (displayFrames, windowContainer, inOutFrame) -> {
final int rightSafeInset =
Math.min(displayFrames.mDisplayCutoutSafe.right,
displayFrames.mUnrestricted.right);
@@ -1164,8 +1165,8 @@
inOutFrame.right = displayFrames.mDisplayWidth;
});
mDisplayContent.setInsetProvider(ITYPE_BOTTOM_TAPPABLE_ELEMENT, win,
- (displayFrames, windowState, inOutFrame) -> {
- if ((windowState.getAttrs().flags & FLAG_NOT_TOUCHABLE) != 0
+ (displayFrames, windowContainer, inOutFrame) -> {
+ if ((win.getAttrs().flags & FLAG_NOT_TOUCHABLE) != 0
|| mNavigationBarLetsThroughTaps) {
inOutFrame.setEmpty();
}
@@ -1176,11 +1177,13 @@
default:
if (attrs.providesInsetsTypes != null) {
for (@InternalInsetsType int insetsType : attrs.providesInsetsTypes) {
- final TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider =
+ final TriConsumer<DisplayFrames, WindowContainer, Rect> imeFrameProvider =
!attrs.providedInternalImeInsets.equals(Insets.NONE)
- ? (displayFrames, windowState, inOutFrame) ->
- inOutFrame.inset(windowState.getLayoutingAttrs(
- displayFrames.mRotation).providedInternalImeInsets)
+ ? (displayFrames, windowContainer, inOutFrame) -> {
+ inOutFrame.inset(win.getLayoutingAttrs(
+ displayFrames.mRotation)
+ .providedInternalImeInsets);
+ }
: null;
switch (insetsType) {
case ITYPE_STATUS_BAR:
@@ -1201,10 +1204,9 @@
break;
}
mDisplayContent.setInsetProvider(insetsType, win, (displayFrames,
- windowState, inOutFrame) -> {
- inOutFrame.inset(
- windowState.getLayoutingAttrs(displayFrames.mRotation)
- .providedInternalInsets);
+ windowContainer, inOutFrame) -> {
+ inOutFrame.inset(win.getLayoutingAttrs(
+ displayFrames.mRotation).providedInternalInsets);
inOutFrame.inset(win.mGivenContentInsets);
}, imeFrameProvider);
mInsetsSourceWindowsExceptIme.add(win);
@@ -1230,8 +1232,13 @@
}
}
- TriConsumer<DisplayFrames, WindowState, Rect> getImeSourceFrameProvider() {
- return (displayFrames, windowState, inOutFrame) -> {
+ TriConsumer<DisplayFrames, WindowContainer, Rect> getImeSourceFrameProvider() {
+ return (displayFrames, windowContainer, inOutFrame) -> {
+ WindowState windowState = windowContainer.asWindowState();
+ if (windowState == null) {
+ throw new IllegalArgumentException("IME insets must be provided by a window.");
+ }
+
if (mNavigationBar != null && navigationBarPosition(displayFrames.mRotation)
== NAV_BAR_BOTTOM) {
// In gesture navigation, nav bar frame is larger than frame to calculate insets.
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index cbefe7f..8f97220 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -113,8 +113,8 @@
private void reportImeDrawnForOrganizer(InsetsControlTarget caller) {
if (caller.getWindow() != null && caller.getWindow().getTask() != null) {
if (caller.getWindow().getTask().isOrganized()) {
- mWin.mWmService.mAtmService.mTaskOrganizerController.reportImeDrawnOnTask(
- caller.getWindow().getTask());
+ mWindowContainer.mWmService.mAtmService.mTaskOrganizerController
+ .reportImeDrawnOnTask(caller.getWindow().getTask());
}
}
}
@@ -173,12 +173,18 @@
}
void checkShowImePostLayout() {
+ if (mWindowContainer == null) {
+ return;
+ }
+ WindowState windowState = mWindowContainer.asWindowState();
+ if (windowState == null) {
+ throw new IllegalArgumentException("IME insets must be provided by a window.");
+ }
// check if IME is drawn
if (mIsImeLayoutDrawn
|| (isReadyToShowIme()
- && mWin != null
- && mWin.isDrawn()
- && !mWin.mGivenInsetsPending)) {
+ && windowState.isDrawn()
+ && !windowState.mGivenInsetsPending)) {
mIsImeLayoutDrawn = true;
// show IME if InputMethodService requested it to be shown.
if (mShowImeRunner != null) {
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index d28dfd5..433f1071 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -19,24 +19,36 @@
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.view.InsetsController.ANIMATION_TYPE_HIDE;
import static android.view.InsetsController.ANIMATION_TYPE_SHOW;
import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_HIDDEN;
import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_SHOWN;
+import static android.view.InsetsState.ITYPE_CAPTION_BAR;
+import static android.view.InsetsState.ITYPE_CLIMATE_BAR;
+import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_IME;
+import static android.view.InsetsState.ITYPE_INVALID;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.SyncRtSurfaceTransactionApplier.applyParams;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
+import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
+import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityTaskManager;
import android.app.StatusBarManager;
+import android.app.WindowConfiguration;
import android.graphics.Insets;
import android.graphics.Rect;
+import android.util.ArrayMap;
import android.util.IntArray;
import android.util.SparseArray;
import android.view.InsetsAnimationControlCallbacks;
@@ -164,8 +176,9 @@
}
boolean isHidden(@InternalInsetsType int type) {
- final InsetsSourceProvider provider = mStateController.peekSourceProvider(type);
- return provider != null && provider.hasWindow() && !provider.getSource().isVisible();
+ final InsetsSourceProvider provider = mStateController.peekSourceProvider(type);
+ return provider != null && provider.hasWindowContainer()
+ && !provider.getSource().isVisible();
}
void showTransient(@InternalInsetsType int[] types, boolean isGestureOnSystemBar) {
@@ -235,10 +248,11 @@
}
/**
- * @see InsetsStateController#getInsetsForWindow
+ * Adjusts the sources in {@code originalState} to account for things like transient bars, IME
+ * & rounded corners.
*/
- InsetsState getInsetsForWindow(WindowState target, boolean includesTransient) {
- final InsetsState originalState = mStateController.getInsetsForWindow(target);
+ InsetsState adjustInsetsForWindow(WindowState target, InsetsState originalState,
+ boolean includesTransient) {
InsetsState state;
if (!includesTransient) {
state = adjustVisibilityForTransientTypes(originalState);
@@ -249,17 +263,131 @@
return adjustInsetsForRoundedCorners(target, state, state == originalState);
}
- InsetsState getInsetsForWindow(WindowState target) {
- return getInsetsForWindow(target, false);
+ InsetsState adjustInsetsForWindow(WindowState target, InsetsState originalState) {
+ return adjustInsetsForWindow(target, originalState, false);
+ }
+
+ /**
+ * @see WindowState#getInsetsState()
+ */
+ InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) {
+ final @InternalInsetsType int type = getInsetsTypeForLayoutParams(attrs);
+ final WindowToken token = mDisplayContent.getWindowToken(attrs.token);
+ if (token != null) {
+ final InsetsState rotatedState = token.getFixedRotationTransformInsetsState();
+ if (rotatedState != null) {
+ return rotatedState;
+ }
+ }
+ final boolean alwaysOnTop = token != null && token.isAlwaysOnTop();
+ // Always use windowing mode fullscreen when get insets for window metrics to make sure it
+ // contains all insets types.
+ final InsetsState originalState = mDisplayContent.getInsetsPolicy()
+ .enforceInsetsPolicyForTarget(type, WINDOWING_MODE_FULLSCREEN, alwaysOnTop,
+ mStateController.getRawInsetsState());
+ return adjustVisibilityForTransientTypes(originalState);
+ }
+
+ private static @InternalInsetsType int getInsetsTypeForLayoutParams(
+ WindowManager.LayoutParams attrs) {
+ @WindowManager.LayoutParams.WindowType int type = attrs.type;
+ switch (type) {
+ case TYPE_STATUS_BAR:
+ return ITYPE_STATUS_BAR;
+ case TYPE_NAVIGATION_BAR:
+ return ITYPE_NAVIGATION_BAR;
+ case TYPE_INPUT_METHOD:
+ return ITYPE_IME;
+ }
+
+ // If not one of the types above, check whether an internal inset mapping is specified.
+ if (attrs.providesInsetsTypes != null) {
+ for (@InternalInsetsType int insetsType : attrs.providesInsetsTypes) {
+ switch (insetsType) {
+ case ITYPE_STATUS_BAR:
+ case ITYPE_NAVIGATION_BAR:
+ case ITYPE_CLIMATE_BAR:
+ case ITYPE_EXTRA_NAVIGATION_BAR:
+ return insetsType;
+ }
+ }
+ }
+
+ return ITYPE_INVALID;
}
/**
- * @see InsetsStateController#getInsetsForWindowMetrics
+ * Modifies the given {@code state} according to the {@code type} (Inset type) provided by
+ * the target.
+ * When performing layout of the target or dispatching insets to the target, we need to exclude
+ * sources which should not be visible to the target. e.g., the source which represents the
+ * target window itself, and the IME source when the target is above IME. We also need to
+ * exclude certain types of insets source for client within specific windowing modes.
+ *
+ * @param type the inset type provided by the target
+ * @param windowingMode the windowing mode of the target
+ * @param isAlwaysOnTop is the target always on top
+ * @param state the input inset state containing all the sources
+ * @return The state stripped of the necessary information.
*/
- InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) {
- final InsetsState originalState = mStateController.getInsetsForWindowMetrics(attrs);
- return adjustVisibilityForTransientTypes(originalState);
+ InsetsState enforceInsetsPolicyForTarget(@InternalInsetsType int type,
+ @WindowConfiguration.WindowingMode int windowingMode, boolean isAlwaysOnTop,
+ InsetsState state) {
+ boolean stateCopied = false;
+
+ if (type != ITYPE_INVALID) {
+ state = new InsetsState(state);
+ stateCopied = true;
+ state.removeSource(type);
+
+ // Navigation bar doesn't get influenced by anything else
+ if (type == ITYPE_NAVIGATION_BAR || type == ITYPE_EXTRA_NAVIGATION_BAR) {
+ state.removeSource(ITYPE_IME);
+ state.removeSource(ITYPE_STATUS_BAR);
+ state.removeSource(ITYPE_CLIMATE_BAR);
+ state.removeSource(ITYPE_CAPTION_BAR);
+ state.removeSource(ITYPE_NAVIGATION_BAR);
+ state.removeSource(ITYPE_EXTRA_NAVIGATION_BAR);
+ }
+
+ // Status bar doesn't get influenced by caption bar
+ if (type == ITYPE_STATUS_BAR || type == ITYPE_CLIMATE_BAR) {
+ state.removeSource(ITYPE_CAPTION_BAR);
+ }
+
+ // IME needs different frames for certain cases (e.g. navigation bar in gesture nav).
+ if (type == ITYPE_IME) {
+ ArrayMap<Integer, InsetsSourceProvider> providers = mStateController
+ .getSourceProviders();
+ for (int i = providers.size() - 1; i >= 0; i--) {
+ InsetsSourceProvider otherProvider = providers.valueAt(i);
+ if (otherProvider.overridesImeFrame()) {
+ InsetsSource override =
+ new InsetsSource(
+ state.getSource(otherProvider.getSource().getType()));
+ override.setFrame(otherProvider.getImeOverrideFrame());
+ state.addSource(override);
+ }
+ }
+ }
+ }
+
+ if (WindowConfiguration.isFloating(windowingMode)
+ || (windowingMode == WINDOWING_MODE_MULTI_WINDOW && isAlwaysOnTop)) {
+ if (!stateCopied) {
+ state = new InsetsState(state);
+ stateCopied = true;
+ }
+ state.removeSource(ITYPE_STATUS_BAR);
+ state.removeSource(ITYPE_NAVIGATION_BAR);
+ state.removeSource(ITYPE_EXTRA_NAVIGATION_BAR);
+ if (windowingMode == WINDOWING_MODE_PINNED) {
+ state.removeSource(ITYPE_IME);
+ }
+ }
+
+ return state;
}
private InsetsState adjustVisibilityForTransientTypes(InsetsState originalState) {
@@ -644,7 +772,7 @@
}
mAnimatingShown = show;
- final InsetsState state = getInsetsForWindow(mFocusedWin);
+ final InsetsState state = mFocusedWin.getInsetsState();
// We are about to playing the default animation. Passing a null frame indicates
// the controlled types should be animated regardless of the frame.
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 21eea94..4c7a297 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -69,7 +69,7 @@
protected final DisplayContent mDisplayContent;
protected final @NonNull InsetsSource mSource;
- protected WindowState mWin;
+ protected WindowContainer mWindowContainer;
private final Rect mTmpRect = new Rect();
private final InsetsStateController mStateController;
@@ -80,8 +80,8 @@
private @Nullable InsetsControlTarget mFakeControlTarget;
private @Nullable ControlAdapter mAdapter;
- private TriConsumer<DisplayFrames, WindowState, Rect> mFrameProvider;
- private TriConsumer<DisplayFrames, WindowState, Rect> mImeFrameProvider;
+ private TriConsumer<DisplayFrames, WindowContainer, Rect> mFrameProvider;
+ private TriConsumer<DisplayFrames, WindowContainer, Rect> mImeFrameProvider;
private final Rect mImeOverrideFrame = new Rect();
private boolean mIsLeashReadyForDispatching;
private final Rect mLastSourceFrame = new Rect();
@@ -100,7 +100,8 @@
private boolean mClientVisible;
/**
- * Whether the window is available and considered visible as in {@link WindowState#isVisible}.
+ * Whether the window container is available and considered visible as in
+ * {@link WindowContainer#isVisible}.
*/
private boolean mServerVisible;
@@ -109,8 +110,8 @@
private final boolean mControllable;
/**
- * Whether to forced the dimensions of the source window to the inset frame and crop out any
- * overflow.
+ * Whether to forced the dimensions of the source window container to the inset frame and crop
+ * out any overflow.
* Used to crop the taskbar inset source when a task animation is occurring to hide the taskbar
* rounded corners overlays.
*
@@ -152,42 +153,42 @@
}
/**
- * Updates the window that currently backs this source.
+ * Updates the window container that currently backs this source.
*
- * @param win The window that links to this source.
+ * @param windowContainer The window container that links to this source.
* @param frameProvider Based on display frame state and the window, calculates the resulting
* frame that should be reported to clients.
* @param imeFrameProvider Based on display frame state and the window, calculates the resulting
* frame that should be reported to IME.
*/
- void setWindow(@Nullable WindowState win,
- @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider,
- @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) {
- if (mWin != null) {
+ void setWindowContainer(@Nullable WindowContainer windowContainer,
+ @Nullable TriConsumer<DisplayFrames, WindowContainer, Rect> frameProvider,
+ @Nullable TriConsumer<DisplayFrames, WindowContainer, Rect> imeFrameProvider) {
+ if (mWindowContainer != null) {
if (mControllable) {
- mWin.setControllableInsetProvider(null);
+ mWindowContainer.setControllableInsetProvider(null);
}
- // The window may be animating such that we can hand out the leash to the control
- // target. Revoke the leash by cancelling the animation to correct the state.
+ // The window container may be animating such that we can hand out the leash to the
+ // control target. Revoke the leash by cancelling the animation to correct the state.
// TODO: Ideally, we should wait for the animation to finish so previous window can
// animate-out as new one animates-in.
- mWin.cancelAnimation();
- mWin.mProvidedInsetsSources.remove(mSource.getType());
+ mWindowContainer.cancelAnimation();
+ mWindowContainer.getProvidedInsetsSources().remove(mSource.getType());
mSeamlessRotating = false;
}
- ProtoLog.d(WM_DEBUG_WINDOW_INSETS, "InsetsSource setWin %s for type %s", win,
- InsetsState.typeToString(mSource.getType()));
- mWin = win;
+ ProtoLog.d(WM_DEBUG_WINDOW_INSETS, "InsetsSource setWin %s for type %s",
+ windowContainer, InsetsState.typeToString(mSource.getType()));
+ mWindowContainer = windowContainer;
mFrameProvider = frameProvider;
mImeFrameProvider = imeFrameProvider;
- if (win == null) {
+ if (windowContainer == null) {
setServerVisible(false);
mSource.setFrame(new Rect());
mSource.setVisibleFrame(null);
} else {
- mWin.mProvidedInsetsSources.put(mSource.getType(), mSource);
+ mWindowContainer.getProvidedInsetsSources().put(mSource.getType(), mSource);
if (mControllable) {
- mWin.setControllableInsetProvider(this);
+ mWindowContainer.setControllableInsetProvider(this);
if (mPendingControlTarget != null) {
updateControlForTarget(mPendingControlTarget, true /* force */);
mPendingControlTarget = null;
@@ -197,18 +198,39 @@
}
/**
- * @return Whether there is a window which backs this source.
+ * @return Whether there is a window container which backs this source.
*/
- boolean hasWindow() {
- return mWin != null;
+ boolean hasWindowContainer() {
+ return mWindowContainer != null;
}
/**
* The source frame can affect the layout of other windows, so this should be called once the
- * window gets laid out.
+ * window container gets laid out.
*/
void updateSourceFrame() {
- if (mWin == null || mWin.mGivenInsetsPending) {
+ if (mWindowContainer == null) {
+ return;
+ }
+ WindowState win = mWindowContainer.asWindowState();
+
+ if (win == null) {
+ // For all the non window WindowContainers.
+ if (mServerVisible) {
+ mTmpRect.set(mWindowContainer.getBounds());
+ if (mFrameProvider != null) {
+ mFrameProvider.accept(mWindowContainer.getDisplayContent().mDisplayFrames,
+ mWindowContainer, mTmpRect);
+ }
+ } else {
+ mTmpRect.setEmpty();
+ }
+ mSource.setFrame(mTmpRect);
+ mSource.setVisibleFrame(null);
+ return;
+ }
+
+ if (win.mGivenInsetsPending) {
// If the given insets are pending, they are not reliable for now. The source frame
// should be updated after the new given insets are sent to window manager.
return;
@@ -218,11 +240,12 @@
// frame may not yet determined that server side doesn't think the window is ready to
// visible. (i.e. No surface, pending insets that were given during layout, etc..)
if (mServerVisible) {
- mTmpRect.set(mWin.getFrame());
+ mTmpRect.set(win.getFrame());
if (mFrameProvider != null) {
- mFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin, mTmpRect);
+ mFrameProvider.accept(mWindowContainer.getDisplayContent().mDisplayFrames,
+ mWindowContainer, mTmpRect);
} else {
- mTmpRect.inset(mWin.mGivenContentInsets);
+ mTmpRect.inset(win.mGivenContentInsets);
}
} else {
mTmpRect.setEmpty();
@@ -230,15 +253,17 @@
mSource.setFrame(mTmpRect);
if (mImeFrameProvider != null) {
- mImeOverrideFrame.set(mWin.getFrame());
- mImeFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin,
+ mImeOverrideFrame.set(win.getFrame());
+ mImeFrameProvider.accept(mWindowContainer.getDisplayContent().mDisplayFrames,
+ mWindowContainer,
mImeOverrideFrame);
}
- if (mWin.mGivenVisibleInsets.left != 0 || mWin.mGivenVisibleInsets.top != 0
- || mWin.mGivenVisibleInsets.right != 0 || mWin.mGivenVisibleInsets.bottom != 0) {
- mTmpRect.set(mWin.getFrame());
- mTmpRect.inset(mWin.mGivenVisibleInsets);
+ if (win.mGivenVisibleInsets.left != 0 || win.mGivenVisibleInsets.top != 0
+ || win.mGivenVisibleInsets.right != 0
+ || win.mGivenVisibleInsets.bottom != 0) {
+ mTmpRect.set(win.getFrame());
+ mTmpRect.inset(win.mGivenVisibleInsets);
mSource.setVisibleFrame(mTmpRect);
} else {
mSource.setVisibleFrame(null);
@@ -253,7 +278,7 @@
source.setVisible(mSource.isVisible());
mTmpRect.set(winFrame);
if (mFrameProvider != null) {
- mFrameProvider.accept(displayFrames, mWin, mTmpRect);
+ mFrameProvider.accept(displayFrames, mWindowContainer, mTmpRect);
}
source.setFrame(mTmpRect);
return source;
@@ -263,27 +288,30 @@
* Called when a layout pass has occurred.
*/
void onPostLayout() {
- if (mWin == null) {
+ if (mWindowContainer == null) {
return;
}
-
- setServerVisible(mWin.wouldBeVisibleIfPolicyIgnored() && mWin.isVisibleByPolicy());
+ WindowState windowState = mWindowContainer.asWindowState();
+ boolean isServerVisible = windowState != null
+ ? windowState.wouldBeVisibleIfPolicyIgnored() && windowState.isVisibleByPolicy()
+ : mWindowContainer.isVisibleRequested();
+ setServerVisible(isServerVisible);
updateSourceFrame();
if (mControl != null) {
boolean changed = false;
final Point position = getWindowFrameSurfacePosition();
if (mControl.setSurfacePosition(position.x, position.y) && mControlTarget != null) {
changed = true;
- if (mWin.getWindowFrames().didFrameSizeChange() && mWin.mWinAnimator.getShown()
- && mWin.okToDisplay()) {
- mWin.applyWithNextDraw(mSetLeashPositionConsumer);
+ if (windowState != null && windowState.getWindowFrames().didFrameSizeChange()
+ && windowState.mWinAnimator.getShown() && mWindowContainer.okToDisplay()) {
+ windowState.applyWithNextDraw(mSetLeashPositionConsumer);
} else {
- mSetLeashPositionConsumer.accept(mWin.getSyncTransaction());
+ mSetLeashPositionConsumer.accept(mWindowContainer.getSyncTransaction());
}
}
if (mServerVisible && !mLastSourceFrame.equals(mSource.getFrame())) {
final Insets insetsHint = mSource.calculateInsets(
- mWin.getBounds(), true /* ignoreVisibility */);
+ mWindowContainer.getBounds(), true /* ignoreVisibility */);
if (!insetsHint.equals(mControl.getInsetsHint())) {
changed = true;
mControl.setInsetsHint(insetsHint);
@@ -297,17 +325,19 @@
}
private Point getWindowFrameSurfacePosition() {
+ WindowState win = mWindowContainer.asWindowState();
if (mControl != null) {
final AsyncRotationController controller =
- mWin.mDisplayContent.getAsyncRotationController();
- if (controller != null && controller.shouldFreezeInsetsPosition(mWin)) {
+ win.mDisplayContent.getAsyncRotationController();
+ if (controller != null && controller.shouldFreezeInsetsPosition(win)) {
// Use previous position because the fade-out animation runs in old rotation.
return mControl.getSurfacePosition();
}
}
- final Rect frame = mWin.getFrame();
+ final Rect frame = mWindowContainer.asWindowState() != null
+ ? mWindowContainer.asWindowState().getFrame() : mWindowContainer.getBounds();
final Point position = new Point();
- mWin.transformFrameToSurfacePosition(frame.left, frame.top, position);
+ mWindowContainer.transformFrameToSurfacePosition(frame.left, frame.top, position);
return position;
}
@@ -322,8 +352,8 @@
}
/**
- * Ensures that the inset source window is cropped so that anything that doesn't fit within the
- * inset frame is cropped out until removeCropToProvidingInsetsBounds is called.
+ * Ensures that the inset source window container is cropped so that anything that doesn't fit
+ * within the inset frame is cropped out until removeCropToProvidingInsetsBounds is called.
*
* The inset source surface will get cropped to the be of the size of the insets it's providing.
*
@@ -342,9 +372,10 @@
void setCropToProvidingInsetsBounds(Transaction t) {
mCropToProvidingInsets = true;
- if (mWin != null && mWin.mSurfaceAnimator.hasLeash()) {
+ if (mWindowContainer != null && mWindowContainer.mSurfaceAnimator.hasLeash()) {
// apply to existing leash
- t.setWindowCrop(mWin.mSurfaceAnimator.mLeash, getProvidingInsetsBoundsCropRect());
+ t.setWindowCrop(mWindowContainer.mSurfaceAnimator.mLeash,
+ getProvidingInsetsBoundsCropRect());
}
}
@@ -359,13 +390,15 @@
mCropToProvidingInsets = false;
// apply to existing leash
- if (mWin != null && mWin.mSurfaceAnimator.hasLeash()) {
- t.setWindowCrop(mWin.mSurfaceAnimator.mLeash, null);
+ if (mWindowContainer != null && mWindowContainer.mSurfaceAnimator.hasLeash()) {
+ t.setWindowCrop(mWindowContainer.mSurfaceAnimator.mLeash, null);
}
}
private Rect getProvidingInsetsBoundsCropRect() {
- Rect sourceWindowFrame = mWin.getFrame();
+ Rect sourceWindowFrame = mWindowContainer.asWindowState() != null
+ ? mWindowContainer.asWindowState().getFrame()
+ : mWindowContainer.getBounds();
Rect insetFrame = getSource().getFrame();
// The rectangle in buffer space we want to crop to
@@ -384,11 +417,11 @@
return;
}
- if (mWin != null && mWin.getSurfaceControl() == null) {
+ if (mWindowContainer != null && mWindowContainer.getSurfaceControl() == null) {
// if window doesn't have a surface, set it null and return.
- setWindow(null, null, null);
+ setWindowContainer(null, null, null);
}
- if (mWin == null) {
+ if (mWindowContainer == null) {
mPendingControlTarget = target;
return;
}
@@ -397,7 +430,7 @@
}
if (target == null) {
// Cancelling the animation will invoke onAnimationCancelled, resetting all the fields.
- mWin.cancelAnimation();
+ mWindowContainer.cancelAnimation();
setClientVisible(InsetsState.getDefaultVisibility(mSource.getType()));
return;
}
@@ -407,7 +440,7 @@
setClientVisible(target.getRequestedVisibility(mSource.getType()));
}
final Transaction t = mDisplayContent.getSyncTransaction();
- mWin.startAnimation(t, mAdapter, !mClientVisible /* hidden */,
+ mWindowContainer.startAnimation(t, mAdapter, !mClientVisible /* hidden */,
ANIMATION_TYPE_INSETS_CONTROL);
// The leash was just created. We cannot dispatch it until its surface transaction is
@@ -418,16 +451,16 @@
mControlTarget = target;
updateVisibility();
mControl = new InsetsSourceControl(mSource.getType(), leash, surfacePosition,
- mSource.calculateInsets(mWin.getBounds(), true /* ignoreVisibility */));
+ mSource.calculateInsets(mWindowContainer.getBounds(), true /* ignoreVisibility */));
ProtoLog.d(WM_DEBUG_WINDOW_INSETS,
"InsetsSource Control %s for target %s", mControl, mControlTarget);
}
void startSeamlessRotation() {
- if (!mSeamlessRotating) {
- mSeamlessRotating = true;
- mWin.cancelAnimation();
- }
+ if (!mSeamlessRotating) {
+ mSeamlessRotating = true;
+ mWindowContainer.cancelAnimation();
+ }
}
void finishSeamlessRotation() {
@@ -475,10 +508,13 @@
}
private boolean isMirroredSource() {
- if (mWin == null) {
+ if (mWindowContainer == null) {
return false;
}
- final int[] provides = mWin.mAttrs.providesInsetsTypes;
+ if (mWindowContainer.asWindowState() == null) {
+ return false;
+ }
+ final int[] provides = ((WindowState) mWindowContainer).mAttrs.providesInsetsTypes;
if (provides == null) {
return false;
}
@@ -542,9 +578,9 @@
pw.print("mIsLeashReadyForDispatching="); pw.print(mIsLeashReadyForDispatching);
pw.print(" mImeOverrideFrame="); pw.print(mImeOverrideFrame.toShortString());
pw.println();
- if (mWin != null) {
- pw.print(prefix + "mWin=");
- pw.println(mWin);
+ if (mWindowContainer != null) {
+ pw.print(prefix + "mWindowContainer=");
+ pw.println(mWindowContainer);
}
if (mAdapter != null) {
pw.print(prefix + "mAdapter=");
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index a1468cc..32e70d9 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -16,30 +16,20 @@
package com.android.server.wm;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
-import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
-import static android.view.InsetsState.ITYPE_CAPTION_BAR;
import static android.view.InsetsState.ITYPE_CLIMATE_BAR;
import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_IME;
-import static android.view.InsetsState.ITYPE_INVALID;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.WindowInsets.Type.displayCutout;
import static android.view.WindowInsets.Type.mandatorySystemGestures;
import static android.view.WindowInsets.Type.systemGestures;
-import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
-import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
-import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.WindowConfiguration;
-import android.app.WindowConfiguration.WindowingMode;
import android.graphics.Rect;
import android.os.Trace;
import android.util.ArrayMap;
@@ -49,8 +39,6 @@
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.InsetsState.InternalInsetsType;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams.WindowType;
import com.android.internal.protolog.common.ProtoLog;
import com.android.server.inputmethod.InputMethodManagerInternal;
@@ -103,134 +91,6 @@
mDisplayContent = displayContent;
}
- /**
- * Gets the insets state from the perspective of the target. When performing layout of the
- * target or dispatching insets to the target, we need to exclude sources which should not be
- * visible to the target. e.g., the source which represents the target window itself, and the
- * IME source when the target is above IME. We also need to exclude certain types of insets
- * source for client within specific windowing modes.
- * This is to get the insets for a window layout on the screen. If the window is not there, use
- * the {@link #getInsetsForWindowMetrics} to get insets instead.
- *
- * @param target The window associate with the perspective.
- * @return The state stripped of the necessary information.
- */
- InsetsState getInsetsForWindow(@NonNull WindowState target) {
- final InsetsState rotatedState = target.mToken.getFixedRotationTransformInsetsState();
- if (rotatedState != null) {
- return rotatedState;
- }
- final InsetsSourceProvider provider = target.getControllableInsetProvider();
- final @InternalInsetsType int type = provider != null
- ? provider.getSource().getType() : ITYPE_INVALID;
- return getInsetsForTarget(type, target.getWindowingMode(), target.isAlwaysOnTop(),
- target.getFrozenInsetsState() != null ? target.getFrozenInsetsState() :
- (target.mAttrs.receiveInsetsIgnoringZOrder ? mState :
- target.mAboveInsetsState));
- }
-
- InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) {
- final @InternalInsetsType int type = getInsetsTypeForLayoutParams(attrs);
- final WindowToken token = mDisplayContent.getWindowToken(attrs.token);
- if (token != null) {
- final InsetsState rotatedState = token.getFixedRotationTransformInsetsState();
- if (rotatedState != null) {
- return rotatedState;
- }
- }
- final boolean alwaysOnTop = token != null && token.isAlwaysOnTop();
- // Always use windowing mode fullscreen when get insets for window metrics to make sure it
- // contains all insets types.
- return getInsetsForTarget(type, WINDOWING_MODE_FULLSCREEN, alwaysOnTop, mState);
- }
-
- private static @InternalInsetsType
- int getInsetsTypeForLayoutParams(WindowManager.LayoutParams attrs) {
- @WindowType int type = attrs.type;
- switch (type) {
- case TYPE_STATUS_BAR:
- return ITYPE_STATUS_BAR;
- case TYPE_NAVIGATION_BAR:
- return ITYPE_NAVIGATION_BAR;
- case TYPE_INPUT_METHOD:
- return ITYPE_IME;
- }
-
- // If not one of the types above, check whether an internal inset mapping is specified.
- if (attrs.providesInsetsTypes != null) {
- for (@InternalInsetsType int insetsType : attrs.providesInsetsTypes) {
- switch (insetsType) {
- case ITYPE_STATUS_BAR:
- case ITYPE_NAVIGATION_BAR:
- case ITYPE_CLIMATE_BAR:
- case ITYPE_EXTRA_NAVIGATION_BAR:
- return insetsType;
- }
- }
- }
-
- return ITYPE_INVALID;
- }
-
- /**
- * @see #getInsetsForWindow
- * @see #getInsetsForWindowMetrics
- */
- private InsetsState getInsetsForTarget(@InternalInsetsType int type,
- @WindowingMode int windowingMode, boolean isAlwaysOnTop, InsetsState state) {
- boolean stateCopied = false;
-
- if (type != ITYPE_INVALID) {
- state = new InsetsState(state);
- stateCopied = true;
- state.removeSource(type);
-
- // Navigation bar doesn't get influenced by anything else
- if (type == ITYPE_NAVIGATION_BAR || type == ITYPE_EXTRA_NAVIGATION_BAR) {
- state.removeSource(ITYPE_STATUS_BAR);
- state.removeSource(ITYPE_CLIMATE_BAR);
- state.removeSource(ITYPE_CAPTION_BAR);
- state.removeSource(ITYPE_NAVIGATION_BAR);
- state.removeSource(ITYPE_EXTRA_NAVIGATION_BAR);
- }
-
- // Status bar doesn't get influenced by caption bar
- if (type == ITYPE_STATUS_BAR || type == ITYPE_CLIMATE_BAR) {
- state.removeSource(ITYPE_CAPTION_BAR);
- }
-
- // IME needs different frames for certain cases (e.g. navigation bar in gesture nav).
- if (type == ITYPE_IME) {
- for (int i = mProviders.size() - 1; i >= 0; i--) {
- InsetsSourceProvider otherProvider = mProviders.valueAt(i);
- if (otherProvider.overridesImeFrame()) {
- InsetsSource override =
- new InsetsSource(
- state.getSource(otherProvider.getSource().getType()));
- override.setFrame(otherProvider.getImeOverrideFrame());
- state.addSource(override);
- }
- }
- }
- }
-
- if (WindowConfiguration.isFloating(windowingMode)
- || (windowingMode == WINDOWING_MODE_MULTI_WINDOW && isAlwaysOnTop)) {
- if (!stateCopied) {
- state = new InsetsState(state);
- stateCopied = true;
- }
- state.removeSource(ITYPE_STATUS_BAR);
- state.removeSource(ITYPE_NAVIGATION_BAR);
- state.removeSource(ITYPE_EXTRA_NAVIGATION_BAR);
- if (windowingMode == WINDOWING_MODE_PINNED) {
- state.removeSource(ITYPE_IME);
- }
- }
-
- return state;
- }
-
InsetsState getRawInsetsState() {
return mState;
}
@@ -248,6 +108,10 @@
return result;
}
+ ArrayMap<Integer, InsetsSourceProvider> getSourceProviders() {
+ return mProviders;
+ }
+
/**
* @return The provider of a specific type.
*/
@@ -303,7 +167,7 @@
final InsetsState aboveInsetsState = new InsetsState();
aboveInsetsState.set(mState,
displayCutout() | systemGestures() | mandatorySystemGestures());
- final SparseArray<InsetsSource> winProvidedSources = win.mProvidedInsetsSources;
+ final SparseArray<InsetsSource> winProvidedSources = win.getProvidedInsetsSources();
final ArrayList<WindowState> insetsChangedWindows = new ArrayList<>();
mDisplayContent.forAllWindows(w -> {
if (aboveWin[0]) {
@@ -315,7 +179,7 @@
}
return winProvidedSources.size() == 0;
} else {
- final SparseArray<InsetsSource> providedSources = w.mProvidedInsetsSources;
+ final SparseArray<InsetsSource> providedSources = w.getProvidedInsetsSources();
for (int i = providedSources.size() - 1; i >= 0; i--) {
aboveInsetsState.addSource(providedSources.valueAt(i));
}
@@ -382,7 +246,7 @@
final InsetsState state = displayFrames.mInsetsState;
for (int i = mProviders.size() - 1; i >= 0; i--) {
final InsetsSourceProvider provider = mProviders.valueAt(i);
- if (provider.mWin == win) {
+ if (provider.mWindowContainer == win) {
state.addSource(provider.createSimulatedSource(displayFrames, winFrame));
}
}
diff --git a/services/core/java/com/android/server/wm/PinnedTaskController.java b/services/core/java/com/android/server/wm/PinnedTaskController.java
index 1da0fe7..06e3a73 100644
--- a/services/core/java/com/android/server/wm/PinnedTaskController.java
+++ b/services/core/java/com/android/server/wm/PinnedTaskController.java
@@ -93,6 +93,7 @@
// The set of actions and aspect-ratio for the that are currently allowed on the PiP activity
private ArrayList<RemoteAction> mActions = new ArrayList<>();
private float mAspectRatio = -1f;
+ private float mExpandedAspectRatio = 0f;
// The aspect ratio bounds of the PIP.
private float mMinAspectRatio;
@@ -160,7 +161,7 @@
}
/**
- * @return whether the given {@param aspectRatio} is valid.
+ * @return whether the given {@param aspectRatio} is valid, i.e. min <= ratio <= max.
*/
public boolean isValidPictureInPictureAspectRatio(float aspectRatio) {
return Float.compare(mMinAspectRatio, aspectRatio) <= 0
@@ -168,6 +169,14 @@
}
/**
+ * @return whether the given {@param aspectRatio} is valid, i.e. ratio < min or ratio > max.
+ */
+ public boolean isValidExpandedPictureInPictureAspectRatio(float aspectRatio) {
+ return Float.compare(mMinAspectRatio, aspectRatio) > 0
+ || Float.compare(aspectRatio, mMaxAspectRatio) > 0;
+ }
+
+ /**
* Called when a fullscreen task is entering PiP with display orientation change. This is used
* to avoid flickering when running PiP animation across different orientations.
*/
@@ -378,6 +387,25 @@
}
/**
+ * Sets the current aspect ratio.
+ */
+ void setExpandedAspectRatio(float aspectRatio) {
+ if (Float.compare(mExpandedAspectRatio, aspectRatio) != 0) {
+ mExpandedAspectRatio = aspectRatio;
+ notifyExpandedAspectRatioChanged(aspectRatio);
+ notifyMovementBoundsChanged(false /* fromImeAdjustment */);
+ }
+ }
+
+ /**
+ * @return the current aspect ratio.
+ */
+ float getExpandedAspectRatio() {
+ return mExpandedAspectRatio;
+ }
+
+
+ /**
* Sets the current set of actions.
*/
void setActions(List<RemoteAction> actions) {
@@ -410,6 +438,15 @@
}
}
+ private void notifyExpandedAspectRatioChanged(float aspectRatio) {
+ if (mPinnedTaskListener == null) return;
+ try {
+ mPinnedTaskListener.onExpandedAspectRatioChanged(aspectRatio);
+ } catch (RemoteException e) {
+ Slog.e(TAG_WM, "Error delivering aspect ratio changed event.", e);
+ }
+ }
+
/**
* Notifies listeners that the PIP actions have changed.
*/
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index d535018..8ab2ee0 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -1979,7 +1979,8 @@
onTop);
}
- void moveActivityToPinnedRootTask(ActivityRecord r, String reason) {
+ void moveActivityToPinnedRootTask(@NonNull ActivityRecord r,
+ @Nullable ActivityRecord launchIntoPipHostActivity, String reason) {
mService.deferWindowLayout();
final TaskDisplayArea taskDisplayArea = r.getDisplayArea();
@@ -2030,7 +2031,7 @@
.setHasBeenVisible(true)
.build();
// Establish bi-directional link between the original and pinned task.
- r.setLastParentBeforePip();
+ r.setLastParentBeforePip(launchIntoPipHostActivity);
// It's possible the task entering PIP is in freeform, so save the last
// non-fullscreen bounds. Then when this new PIP task exits PIP, it can restore
// to its previous freeform bounds.
@@ -2091,6 +2092,10 @@
r.setWindowingMode(intermediateWindowingMode);
r.mWaitForEnteringPinnedMode = true;
rootTask.setWindowingMode(WINDOWING_MODE_PINNED);
+ // Set the launch bounds for launch-into-pip Activity on the root task.
+ if (r.getOptions() != null && r.getOptions().isLaunchIntoPip()) {
+ rootTask.setBounds(r.getOptions().getLaunchBounds());
+ }
rootTask.setDeferTaskAppear(false);
// Reset the state that indicates it can enter PiP while pausing after we've moved it
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index d1460f4..6bb63d9 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -108,15 +108,12 @@
*/
private SurfaceControl mBackColorSurface;
private BlackFrame mEnteringBlackFrame;
- private int mWidth, mHeight;
private final int mOriginalRotation;
private final int mOriginalWidth;
private final int mOriginalHeight;
private int mCurRotation;
- private Rect mOriginalDisplayRect = new Rect();
- private Rect mCurrentDisplayRect = new Rect();
// The current active animation to move from the old to the new rotated
// state. Which animation is run here will depend on the old and new
// rotations.
@@ -127,7 +124,6 @@
private boolean mAnimRunning;
private boolean mFinishAnimReady;
private long mFinishAnimStartTime;
- private boolean mForceDefaultOrientation;
private SurfaceRotationAnimationController mSurfaceRotationAnimationController;
/** Intensity of light/whiteness of the layout before rotation occurs. */
private float mStartLuma;
@@ -138,25 +134,13 @@
mService = displayContent.mWmService;
mContext = mService.mContext;
mDisplayContent = displayContent;
- displayContent.getBounds(mOriginalDisplayRect);
+ final Rect currentBounds = displayContent.getBounds();
+ final int width = currentBounds.width();
+ final int height = currentBounds.height();
// Screenshot does NOT include rotation!
final DisplayInfo displayInfo = displayContent.getDisplayInfo();
final int realOriginalRotation = displayInfo.rotation;
- final int originalWidth;
- final int originalHeight;
- if (displayContent.getDisplayRotation().isFixedToUserRotation()) {
- // Emulated orientation.
- mForceDefaultOrientation = true;
- originalWidth = displayContent.mBaseDisplayWidth;
- originalHeight = displayContent.mBaseDisplayHeight;
- } else {
- // Normal situation
- originalWidth = displayInfo.logicalWidth;
- originalHeight = displayInfo.logicalHeight;
- }
- mWidth = originalWidth;
- mHeight = originalHeight;
mOriginalRotation = originalRotation;
// If the delta is not zero, the rotation of display may not change, but we still want to
@@ -165,8 +149,8 @@
// when restoring the rotated app to the same rotation as current display.
final int delta = deltaRotation(originalRotation, realOriginalRotation);
final boolean flipped = delta == Surface.ROTATION_90 || delta == Surface.ROTATION_270;
- mOriginalWidth = flipped ? originalHeight : originalWidth;
- mOriginalHeight = flipped ? originalWidth : originalHeight;
+ mOriginalWidth = flipped ? height : width;
+ mOriginalHeight = flipped ? width : height;
mSurfaceRotationAnimationController = new SurfaceRotationAnimationController();
// Check whether the current screen contains any secure content.
@@ -179,7 +163,7 @@
new SurfaceControl.LayerCaptureArgs.Builder(displayContent.getSurfaceControl())
.setCaptureSecureLayers(true)
.setAllowProtected(true)
- .setSourceCrop(new Rect(0, 0, mWidth, mHeight))
+ .setSourceCrop(new Rect(0, 0, width, height))
.build();
SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer =
SurfaceControl.captureLayers(args);
@@ -244,6 +228,19 @@
Slog.w(TAG, "Unable to allocate freeze surface", e);
}
+ // If display size is changed with the same orientation, map the bounds of screenshot to
+ // the new logical display size. Currently pending transaction and RWC#mDisplayTransaction
+ // are merged to global transaction, so it can be synced with display change when calling
+ // DisplayManagerInternal#performTraversal(transaction).
+ final int logicalWidth = displayInfo.logicalWidth;
+ final int logicalHeight = displayInfo.logicalHeight;
+ if (logicalWidth > mOriginalWidth == logicalHeight > mOriginalHeight
+ && (logicalWidth != mOriginalWidth || logicalHeight != mOriginalHeight)) {
+ displayContent.getPendingTransaction().setGeometry(mScreenshotLayer,
+ new Rect(0, 0, mOriginalWidth, mOriginalHeight),
+ new Rect(0, 0, logicalWidth, logicalHeight), Surface.ROTATION_0);
+ }
+
ProtoLog.i(WM_SHOW_SURFACE_ALLOC,
" FREEZE %s: CREATE", mScreenshotLayer);
if (originalRotation == realOriginalRotation) {
@@ -277,11 +274,6 @@
matrix.getValues(mTmpFloats);
float x = mTmpFloats[Matrix.MTRANS_X];
float y = mTmpFloats[Matrix.MTRANS_Y];
- if (mForceDefaultOrientation) {
- mDisplayContent.getBounds(mCurrentDisplayRect);
- x -= mCurrentDisplayRect.left;
- y -= mCurrentDisplayRect.top;
- }
t.setPosition(mScreenshotLayer, x, y);
t.setMatrix(mScreenshotLayer,
mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
@@ -293,8 +285,6 @@
public void printTo(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("mSurface="); pw.print(mScreenshotLayer);
- pw.print(" mWidth="); pw.print(mWidth);
- pw.print(" mHeight="); pw.println(mHeight);
pw.print(prefix);
pw.print("mEnteringBlackFrame=");
pw.println(mEnteringBlackFrame);
@@ -315,11 +305,6 @@
pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
mSnapshotInitialMatrix.dump(pw); pw.println();
- pw.print(prefix); pw.print("mForceDefaultOrientation="); pw.print(mForceDefaultOrientation);
- if (mForceDefaultOrientation) {
- pw.print(" mOriginalDisplayRect="); pw.print(mOriginalDisplayRect.toShortString());
- pw.print(" mCurrentDisplayRect="); pw.println(mCurrentDisplayRect.toShortString());
- }
}
public void setRotation(SurfaceControl.Transaction t, int rotation) {
@@ -329,7 +314,8 @@
// to the snapshot to make it stay in the same original position
// with the current screen rotation.
int delta = deltaRotation(rotation, mOriginalRotation);
- RotationAnimationUtils.createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix);
+ RotationAnimationUtils.createRotationMatrix(delta, mOriginalWidth, mOriginalHeight,
+ mSnapshotInitialMatrix);
setRotationTransform(t, mSnapshotInitialMatrix);
}
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index de8ea8c..cd8ddf4 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -69,6 +69,7 @@
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.InsetsVisibilities;
+import android.view.OnBackInvokedDispatcher;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.View;
@@ -905,15 +906,17 @@
}
@Override
- public void setOnBackInvokedCallback(IWindow window,
- IOnBackInvokedCallback onBackInvokedCallback) throws RemoteException {
+ public void setOnBackInvokedCallback(
+ IWindow window,
+ IOnBackInvokedCallback onBackInvokedCallback,
+ @OnBackInvokedDispatcher.Priority int priority) throws RemoteException {
synchronized (mService.mGlobalLock) {
WindowState windowState = mService.windowForClientLocked(this, window, false);
if (windowState == null) {
Slog.e(TAG_WM,
"setOnBackInvokedCallback(): Can't find window state for window:" + window);
} else {
- windowState.setOnBackInvokedCallback(onBackInvokedCallback);
+ windowState.setOnBackInvokedCallback(onBackInvokedCallback, priority);
}
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 6df54cd..358a615 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -3397,6 +3397,13 @@
info.positionInParent = getRelativePosition();
info.pictureInPictureParams = getPictureInPictureParams(top);
+ info.preferDockBigOverlays = getPreferDockBigOverlays();
+ if (info.pictureInPictureParams != null
+ && info.pictureInPictureParams.isLaunchIntoPip()
+ && top.getTopMostActivity().getLastParentBeforePip() != null) {
+ info.launchIntoPipHostTaskId =
+ top.getTopMostActivity().getLastParentBeforePip().mTaskId;
+ }
info.displayCutoutInsets = top != null ? top.getDisplayCutoutInsets() : null;
info.topActivityInfo = mReuseActivitiesReport.top != null
? mReuseActivitiesReport.top.info
@@ -3443,6 +3450,11 @@
? null : new PictureInPictureParams(topMostActivity.pictureInPictureArgs);
}
+ private boolean getPreferDockBigOverlays() {
+ final ActivityRecord topMostActivity = getTopMostActivity();
+ return topMostActivity != null && topMostActivity.preferDockBigOverlays;
+ }
+
Rect getDisplayCutoutInsets() {
if (mDisplayContent == null || getDisplayInfo().displayCutout == null) return null;
final WindowState w = getTopVisibleAppMainWindow();
@@ -4336,6 +4348,10 @@
}
}
+ void onPreferDockBigOverlaysChanged() {
+ dispatchTaskInfoChangedIfNeeded(true /* force */);
+ }
+
/** Called when the top activity in the Root Task enters or exits size compat mode. */
void onSizeCompatActivityChanged() {
// Trigger TaskInfoChanged to update the size compat restart button.
@@ -6013,9 +6029,9 @@
}
/**
- * Sets the current picture-in-picture aspect ratio.
+ * Sets the current picture-in-picture aspect ratios.
*/
- void setPictureInPictureAspectRatio(float aspectRatio) {
+ void setPictureInPictureAspectRatio(float aspectRatio, float expandedAspectRatio) {
if (!mWmService.mAtmService.mSupportsPictureInPicture) {
return;
}
@@ -6032,16 +6048,21 @@
final PinnedTaskController pinnedTaskController =
getDisplayContent().getPinnedTaskController();
- if (Float.compare(aspectRatio, pinnedTaskController.getAspectRatio()) == 0) {
- return;
- }
-
// Notify the pinned stack controller about aspect ratio change.
// This would result a callback delivered from SystemUI to WM to start animation,
// if the bounds are ought to be altered due to aspect ratio change.
- pinnedTaskController.setAspectRatio(
- pinnedTaskController.isValidPictureInPictureAspectRatio(aspectRatio)
- ? aspectRatio : -1f);
+ if (Float.compare(aspectRatio, pinnedTaskController.getAspectRatio()) != 0) {
+ pinnedTaskController.setAspectRatio(
+ pinnedTaskController.isValidPictureInPictureAspectRatio(aspectRatio)
+ ? aspectRatio : -1f);
+ }
+
+ if (mWmService.mAtmService.mSupportsExpandedPictureInPicture && Float.compare(
+ expandedAspectRatio, pinnedTaskController.getExpandedAspectRatio()) != 0) {
+ pinnedTaskController.setExpandedAspectRatio(pinnedTaskController
+ .isValidExpandedPictureInPictureAspectRatio(expandedAspectRatio)
+ ? expandedAspectRatio : 0f);
+ }
}
/**
@@ -6561,8 +6582,7 @@
return;
}
if (mOverlayHost != null) {
- final InsetsState s = getDisplayContent().getInsetsPolicy()
- .getInsetsForWindow(originalChange, true);
+ final InsetsState s = originalChange.getInsetsState(true);
getBounds(mTmpRect);
mOverlayHost.dispatchInsetsChanged(s, mTmpRect);
}
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 1bba103..f0cca18 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -18,7 +18,6 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
@@ -111,9 +110,6 @@
private Task mRootHomeTask;
private Task mRootPinnedTask;
- // TODO(b/159029784): Remove when getStack() behavior is cleaned-up
- private Task mRootRecentsTask;
-
private final ArrayList<WindowContainer> mTmpAlwaysOnTopChildren = new ArrayList<>();
private final ArrayList<WindowContainer> mTmpNormalChildren = new ArrayList<>();
private final ArrayList<WindowContainer> mTmpHomeChildren = new ArrayList<>();
@@ -222,8 +218,6 @@
Task getRootTask(int windowingMode, int activityType) {
if (activityType == ACTIVITY_TYPE_HOME) {
return mRootHomeTask;
- } else if (activityType == ACTIVITY_TYPE_RECENTS) {
- return mRootRecentsTask;
}
if (windowingMode == WINDOWING_MODE_PINNED) {
return mRootPinnedTask;
@@ -249,11 +243,6 @@
return mRootHomeTask;
}
- @Nullable
- Task getRootRecentsTask() {
- return mRootRecentsTask;
- }
-
Task getRootPinnedTask() {
return mRootPinnedTask;
}
@@ -288,16 +277,6 @@
} else {
mRootHomeTask = rootTask;
}
- } else if (rootTask.isActivityTypeRecents()) {
- if (mRootRecentsTask != null) {
- if (!rootTask.isDescendantOf(mRootRecentsTask)) {
- throw new IllegalArgumentException("addRootTaskReferenceIfNeeded: root recents"
- + " task=" + mRootRecentsTask + " already exist on display=" + this
- + " rootTask=" + rootTask);
- }
- } else {
- mRootRecentsTask = rootTask;
- }
}
if (!rootTask.isRootTask()) {
@@ -317,8 +296,6 @@
void removeRootTaskReferenceIfNeeded(Task rootTask) {
if (rootTask == mRootHomeTask) {
mRootHomeTask = null;
- } else if (rootTask == mRootRecentsTask) {
- mRootRecentsTask = null;
} else if (rootTask == mRootPinnedTask) {
mRootPinnedTask = null;
}
diff --git a/services/core/java/com/android/server/wm/TaskFpsCallbackController.java b/services/core/java/com/android/server/wm/TaskFpsCallbackController.java
index d9dc9aa..c099628 100644
--- a/services/core/java/com/android/server/wm/TaskFpsCallbackController.java
+++ b/services/core/java/com/android/server/wm/TaskFpsCallbackController.java
@@ -19,51 +19,51 @@
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
-import android.window.IOnFpsCallbackListener;
+import android.window.ITaskFpsCallback;
import java.util.HashMap;
final class TaskFpsCallbackController {
private final Context mContext;
- private final HashMap<IOnFpsCallbackListener, Long> mTaskFpsCallbackListeners;
- private final HashMap<IOnFpsCallbackListener, IBinder.DeathRecipient> mDeathRecipients;
+ private final HashMap<ITaskFpsCallback, Long> mTaskFpsCallbacks;
+ private final HashMap<ITaskFpsCallback, IBinder.DeathRecipient> mDeathRecipients;
TaskFpsCallbackController(Context context) {
mContext = context;
- mTaskFpsCallbackListeners = new HashMap<>();
+ mTaskFpsCallbacks = new HashMap<>();
mDeathRecipients = new HashMap<>();
}
- void registerCallback(int taskId, IOnFpsCallbackListener listener) {
- if (mTaskFpsCallbackListeners.containsKey(listener)) {
+ void registerListener(int taskId, ITaskFpsCallback callback) {
+ if (mTaskFpsCallbacks.containsKey(callback)) {
return;
}
- final long nativeListener = nativeRegister(listener, taskId);
- mTaskFpsCallbackListeners.put(listener, nativeListener);
+ final long nativeListener = nativeRegister(callback, taskId);
+ mTaskFpsCallbacks.put(callback, nativeListener);
- final IBinder.DeathRecipient deathRecipient = () -> unregisterCallback(listener);
+ final IBinder.DeathRecipient deathRecipient = () -> unregisterListener(callback);
try {
- listener.asBinder().linkToDeath(deathRecipient, 0);
- mDeathRecipients.put(listener, deathRecipient);
+ callback.asBinder().linkToDeath(deathRecipient, 0);
+ mDeathRecipients.put(callback, deathRecipient);
} catch (RemoteException e) {
// ignore
}
}
- void unregisterCallback(IOnFpsCallbackListener listener) {
- if (!mTaskFpsCallbackListeners.containsKey(listener)) {
+ void unregisterListener(ITaskFpsCallback callback) {
+ if (!mTaskFpsCallbacks.containsKey(callback)) {
return;
}
- listener.asBinder().unlinkToDeath(mDeathRecipients.get(listener), 0);
- mDeathRecipients.remove(listener);
+ callback.asBinder().unlinkToDeath(mDeathRecipients.get(callback), 0);
+ mDeathRecipients.remove(callback);
- nativeUnregister(mTaskFpsCallbackListeners.get(listener));
- mTaskFpsCallbackListeners.remove(listener);
+ nativeUnregister(mTaskFpsCallbacks.get(callback));
+ mTaskFpsCallbacks.remove(callback);
}
- private static native long nativeRegister(IOnFpsCallbackListener listener, int taskId);
+ private static native long nativeRegister(ITaskFpsCallback callback, int taskId);
private static native void nativeUnregister(long ptr);
}
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index c880aba..7fab94c 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -31,6 +31,7 @@
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
import static android.os.Process.INVALID_UID;
+import static android.os.Process.SYSTEM_UID;
import static android.os.UserHandle.USER_NULL;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.TRANSIT_CLOSE;
@@ -82,6 +83,7 @@
import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.util.DisplayMetrics;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
@@ -530,6 +532,11 @@
* certificate.</li>
*/
private boolean isAllowedToEmbedActivityInTrustedMode(@NonNull ActivityRecord a) {
+ if (UserHandle.getAppId(mTaskFragmentOrganizerUid) == SYSTEM_UID) {
+ // The system is trusted to embed other apps securely and for all users.
+ return true;
+ }
+
if (mTaskFragmentOrganizerUid == a.getUid()) {
// Activities from the same UID can be embedded freely by the host.
return true;
@@ -876,11 +883,17 @@
if (!adjacentTaskFragments.isEmpty() && !gotTranslucentAdjacent) {
// The z-order of this TaskFragment is in middle of two adjacent TaskFragments
// and it cannot be visible if the TaskFragment on top is not translucent and
- // is fully occluding this one.
+ // is occluding this one.
+ mTmpRect.set(getBounds());
for (int j = adjacentTaskFragments.size() - 1; j >= 0; --j) {
final TaskFragment taskFragment = adjacentTaskFragments.get(j);
- if (!taskFragment.isTranslucent(starting)
- && taskFragment.getBounds().contains(this.getBounds())) {
+ final TaskFragment adjacentTaskFragment =
+ taskFragment.mAdjacentTaskFragment;
+ if (adjacentTaskFragment == this) {
+ continue;
+ }
+ if (mTmpRect.intersect(taskFragment.getBounds())
+ || mTmpRect.intersect(adjacentTaskFragment.getBounds())) {
return TASK_FRAGMENT_VISIBILITY_INVISIBLE;
}
}
@@ -1695,7 +1708,7 @@
if (isAddingActivity && task != null) {
// TODO(b/207481538): temporary per-activity screenshoting
- if (r != null && BackNavigationController.isEnabled()) {
+ if (r != null && BackNavigationController.isScreenshotEnabled()) {
ProtoLog.v(WM_DEBUG_BACK_PREVIEW, "Screenshotting Activity %s",
r.mActivityComponent.flattenToString());
Rect outBounds = r.getBounds();
@@ -2298,7 +2311,7 @@
void removeChild(WindowContainer child, boolean removeSelfIfPossible) {
super.removeChild(child);
- if (BackNavigationController.isEnabled()) {
+ if (BackNavigationController.isScreenshotEnabled()) {
//TODO(b/207481538) Remove once the infrastructure to support per-activity screenshot is
// implemented
ActivityRecord r = child.asActivityRecord();
diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java
index 4d3219d..8f24f26 100644
--- a/services/core/java/com/android/server/wm/TaskPositioningController.java
+++ b/services/core/java/com/android/server/wm/TaskPositioningController.java
@@ -20,33 +20,22 @@
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.annotation.Nullable;
-import android.app.IActivityTaskManager;
import android.graphics.Point;
import android.graphics.Rect;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.RemoteException;
import android.util.Slog;
import android.view.Display;
import android.view.IWindow;
import android.view.InputWindowHandle;
import android.view.SurfaceControl;
-import com.android.internal.annotations.GuardedBy;
-import com.android.server.input.InputManagerService;
-
/**
* Controller for task positioning by drag.
*/
class TaskPositioningController {
private final WindowManagerService mService;
- private final InputManagerService mInputManager;
- private final IActivityTaskManager mActivityManager;
- private final Handler mHandler;
private SurfaceControl mInputSurface;
private DisplayContent mPositioningDisplay;
- @GuardedBy("WindowManagerSerivce.mWindowMap")
private @Nullable TaskPositioner mTaskPositioner;
private final Rect mTmpClipRect = new Rect();
@@ -61,12 +50,8 @@
return mTaskPositioner != null ? mTaskPositioner.mDragWindowHandle : null;
}
- TaskPositioningController(WindowManagerService service, InputManagerService inputManager,
- IActivityTaskManager activityManager, Looper looper) {
+ TaskPositioningController(WindowManagerService service) {
mService = service;
- mInputManager = inputManager;
- mActivityManager = activityManager;
- mHandler = new Handler(looper);
mTransaction = service.mTransactionFactory.get();
}
@@ -121,15 +106,13 @@
win, false /*resize*/, false /*preserveOrientation*/, startX, startY)) {
return false;
}
+ mService.mAtmService.setFocusedTask(win.getTask().mTaskId);
}
- try {
- mActivityManager.setFocusedTask(win.getTask().mTaskId);
- } catch(RemoteException e) {}
return true;
}
void handleTapOutsideTask(DisplayContent displayContent, int x, int y) {
- mHandler.post(() -> {
+ mService.mH.post(() -> {
synchronized (mService.mGlobalLock) {
final Task task = displayContent.findTaskForResizePoint(x, y);
if (task != null) {
@@ -142,10 +125,7 @@
task.preserveOrientationOnResize(), x, y)) {
return;
}
- try {
- mActivityManager.setFocusedTask(task.mTaskId);
- } catch (RemoteException e) {
- }
+ mService.mAtmService.setFocusedTask(task.mTaskId);
}
}
});
@@ -187,7 +167,7 @@
&& displayContent.mCurrentFocus.mActivityRecord == win.mActivityRecord) {
transferFocusFromWin = displayContent.mCurrentFocus;
}
- if (!mInputManager.transferTouchFocus(
+ if (!mService.mInputManager.transferTouchFocus(
transferFocusFromWin.mInputChannel, mTaskPositioner.mClientChannel,
false /* isDragDrop */)) {
Slog.e(TAG_WM, "startPositioningLocked: Unable to transfer touch focus");
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 9f2188b..0b965c3 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -550,10 +550,10 @@
throw new IllegalStateException("Too late to abort.");
}
ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Aborting Transition: %d", mSyncId);
- mController.dispatchLegacyAppTransitionCancelled();
mState = STATE_ABORT;
// Syncengine abort will call through to onTransactionReady()
mSyncEngine.abort(mSyncId);
+ mController.dispatchLegacyAppTransitionCancelled();
}
void setRemoteTransition(RemoteTransition remoteTransition) {
@@ -1251,6 +1251,17 @@
final ActivityRecord topMostActivity = task.getTopMostActivity();
change.setAllowEnterPip(topMostActivity != null
&& topMostActivity.checkEnterPictureInPictureAppOpsState());
+ final ActivityRecord topRunningActivity = task.topRunningActivity();
+ if (topRunningActivity != null && task.mDisplayContent != null) {
+ // If Activity is in fixed rotation, its will be applied with the next rotation,
+ // when the Task is still in the previous rotation.
+ final int taskRotation = task.getWindowConfiguration().getDisplayRotation();
+ final int activityRotation = topRunningActivity.getWindowConfiguration()
+ .getDisplayRotation();
+ if (taskRotation != activityRotation) {
+ change.setEndFixedRotation(activityRotation);
+ }
+ }
} else if ((info.mFlags & ChangeInfo.FLAG_SEAMLESS_ROTATION) != 0) {
change.setRotationAnimation(ROTATION_ANIMATION_SEAMLESS);
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index e1746cc..45fdc04 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -81,8 +81,10 @@
import android.util.Pools;
import android.util.RotationUtils;
import android.util.Slog;
+import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import android.view.DisplayInfo;
+import android.view.InsetsSource;
import android.view.MagnificationSpec;
import android.view.RemoteAnimationDefinition;
import android.view.RemoteAnimationTarget;
@@ -127,7 +129,8 @@
* changes are made to this class.
*/
class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E>
- implements Comparable<WindowContainer>, Animatable, SurfaceFreezer.Freezable {
+ implements Comparable<WindowContainer>, Animatable, SurfaceFreezer.Freezable,
+ InsetsControlTarget {
private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowContainer" : TAG_WM;
@@ -145,6 +148,13 @@
// onParentChanged() notification.
boolean mReparenting;
+ protected @Nullable InsetsSourceProvider mControllableInsetProvider;
+
+ /**
+ * The insets sources provided by this windowContainer.
+ */
+ private SparseArray<InsetsSource> mProvidedInsetsSources = null;
+
// List of children for this window container. List is in z-order as the children appear on
// screen with the top-most window container at the tail of the list.
protected final WindowList<E> mChildren = new WindowList<E>();
@@ -329,6 +339,25 @@
mSurfaceFreezer = new SurfaceFreezer(this, wms);
}
+ /**
+ * Set's an {@link InsetsSourceProvider} to be associated with this window, but only if the
+ * provider itself is controllable, as one window can be the provider of more than one inset
+ * type (i.e. gesture insets). If this window is controllable, all its animations must be
+ * controlled by its control target, and the visibility of this window should be taken account
+ * into the state of the control target.
+ *
+ * @param insetProvider the provider which should not be visible to the client.
+ * @see #getInsetsState()
+ */
+ void setControllableInsetProvider(InsetsSourceProvider insetProvider) {
+ mControllableInsetProvider = insetProvider;
+ }
+
+ InsetsSourceProvider getControllableInsetProvider() {
+ return mControllableInsetProvider;
+ }
+
+
@Override
final protected WindowContainer getParent() {
return mParent;
@@ -858,6 +887,13 @@
}
}
+ public SparseArray<InsetsSource> getProvidedInsetsSources() {
+ if (mProvidedInsetsSources == null) {
+ mProvidedInsetsSources = new SparseArray<>();
+ }
+ return mProvidedInsetsSources;
+ }
+
DisplayContent getDisplayContent() {
return mDisplayContent;
}
@@ -2962,6 +2998,16 @@
scheduleAnimation();
}
+ void transformFrameToSurfacePosition(int left, int top, Point outPoint) {
+ outPoint.set(left, top);
+ final WindowContainer parentWindowContainer = getParent();
+ if (parentWindowContainer == null) {
+ return;
+ }
+ final Rect parentBounds = parentWindowContainer.getBounds();
+ outPoint.offset(-parentBounds.left, -parentBounds.top);
+ }
+
void reassignLayer(Transaction t) {
final WindowContainer parent = getParent();
if (parent != null) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 4d1bc22..4ff2b6a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -152,11 +152,9 @@
import android.annotation.RequiresPermission;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
-import android.app.ActivityTaskManager;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.IActivityManager;
-import android.app.IActivityTaskManager;
import android.app.IAssistDataReceiver;
import android.app.WindowConfiguration;
import android.content.BroadcastReceiver;
@@ -283,7 +281,7 @@
import android.view.displayhash.DisplayHash;
import android.view.displayhash.VerifiedDisplayHash;
import android.window.ClientWindowFrames;
-import android.window.IOnFpsCallbackListener;
+import android.window.ITaskFpsCallback;
import android.window.TaskSnapshot;
import com.android.internal.R;
@@ -312,6 +310,8 @@
import com.android.server.power.ShutdownThread;
import com.android.server.utils.PriorityDump;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
@@ -421,7 +421,7 @@
"persist.wm.enable_remote_keyguard_animation";
private static final int sEnableRemoteKeyguardAnimation =
- SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 2);
+ SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
/**
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
@@ -541,10 +541,7 @@
WindowManagerPolicy mPolicy;
final IActivityManager mActivityManager;
- // TODO: Probably not needed once activities are fully in WM.
- final IActivityTaskManager mActivityTaskManager;
final ActivityManagerInternal mAmInternal;
- final ActivityTaskManagerInternal mAtmInternal;
final AppOpsManager mAppOps;
final PackageManagerInternal mPmInternal;
@@ -1257,9 +1254,7 @@
mTaskSystemBarsListenerController = new TaskSystemBarsListenerController();
mActivityManager = ActivityManager.getService();
- mActivityTaskManager = ActivityTaskManager.getService();
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
- mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
AppOpsManager.OnOpChangedInternalListener opListener =
new AppOpsManager.OnOpChangedInternalListener() {
@@ -1328,8 +1323,7 @@
mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean(
com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout);
- mTaskPositioningController = new TaskPositioningController(
- this, mInputManager, mActivityTaskManager, mH.getLooper());
+ mTaskPositioningController = new TaskPositioningController(this);
mDragDropController = new DragDropController(this, mH.getLooper());
mHighRefreshRateDenylist = HighRefreshRateDenylist.create(context.getResources());
@@ -3007,6 +3001,12 @@
aspectRatio);
}
+ boolean isValidExpandedPictureInPictureAspectRatio(DisplayContent displayContent,
+ float aspectRatio) {
+ return displayContent.getPinnedTaskController().isValidExpandedPictureInPictureAspectRatio(
+ aspectRatio);
+ }
+
@Override
public void notifyKeyguardTrustedChanged() {
synchronized (mGlobalLock) {
@@ -3210,7 +3210,7 @@
if (!checkCallingPermission(permission.CONTROL_KEYGUARD, "dismissKeyguard")) {
throw new SecurityException("Requires CONTROL_KEYGUARD permission");
}
- if (mAtmInternal.isDreaming()) {
+ if (mAtmService.isDreaming()) {
mAtmService.mTaskSupervisor.wakeUp("dismissKeyguard");
}
synchronized (mGlobalLock) {
@@ -3244,7 +3244,7 @@
public void closeSystemDialogs(String reason) {
int callingPid = Binder.getCallingPid();
int callingUid = Binder.getCallingUid();
- if (!mAtmInternal.checkCanCloseSystemDialogs(callingPid, callingUid, null)) {
+ if (!mAtmService.checkCanCloseSystemDialogs(callingPid, callingUid, null)) {
return;
}
synchronized (mGlobalLock) {
@@ -4929,10 +4929,7 @@
PackageManager.FEATURE_FAKETOUCH);
}
- try {
- mActivityTaskManager.updateConfiguration(null);
- } catch (RemoteException e) {
- }
+ mAtmService.updateConfiguration(null /* request to compute config */);
}
public void systemReady() {
@@ -5310,8 +5307,8 @@
case RESET_ANR_MESSAGE: {
synchronized (mGlobalLock) {
mLastANRState = null;
+ mAtmService.mLastANRState = null;
}
- mAtmInternal.clearSavedANRState();
break;
}
case WALLPAPER_DRAW_PENDING_TIMEOUT: {
@@ -6176,7 +6173,7 @@
@Override
public void createInputConsumer(IBinder token, String name, int displayId,
InputChannel inputChannel) {
- if (!mAtmInternal.isCallerRecents(Binder.getCallingUid())
+ if (!mAtmService.isCallerRecents(Binder.getCallingUid())
&& mContext.checkCallingOrSelfPermission(INPUT_CONSUMER) != PERMISSION_GRANTED) {
throw new SecurityException("createInputConsumer requires INPUT_CONSUMER permission");
}
@@ -6192,7 +6189,7 @@
@Override
public boolean destroyInputConsumer(String name, int displayId) {
- if (!mAtmInternal.isCallerRecents(Binder.getCallingUid())
+ if (!mAtmService.isCallerRecents(Binder.getCallingUid())
&& mContext.checkCallingOrSelfPermission(INPUT_CONSUMER) != PERMISSION_GRANTED) {
throw new SecurityException("destroyInputConsumer requires INPUT_CONSUMER permission");
}
@@ -6622,6 +6619,7 @@
PriorityDump.dump(mPriorityDumper, fd, pw, args);
}
+ @NeverCompile // Avoid size overhead of debugging code.
private void doDump(FileDescriptor fd, PrintWriter pw, String[] args, boolean useProto) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
boolean dumpAll = false;
@@ -8875,7 +8873,7 @@
@Override
@RequiresPermission(Manifest.permission.ACCESS_FPS_COUNTER)
public void registerTaskFpsCallback(@IntRange(from = 0) int taskId,
- IOnFpsCallbackListener listener) {
+ ITaskFpsCallback callback) {
if (mContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_FPS_COUNTER)
!= PackageManager.PERMISSION_GRANTED) {
final int pid = Binder.getCallingPid();
@@ -8887,12 +8885,12 @@
throw new IllegalArgumentException("no task with taskId: " + taskId);
}
- mTaskFpsCallbackController.registerCallback(taskId, listener);
+ mTaskFpsCallbackController.registerListener(taskId, callback);
}
@Override
@RequiresPermission(Manifest.permission.ACCESS_FPS_COUNTER)
- public void unregisterTaskFpsCallback(IOnFpsCallbackListener listener) {
+ public void unregisterTaskFpsCallback(ITaskFpsCallback callback) {
if (mContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_FPS_COUNTER)
!= PackageManager.PERMISSION_GRANTED) {
final int pid = Binder.getCallingPid();
@@ -8900,7 +8898,7 @@
+ ", must have permission " + Manifest.permission.ACCESS_FPS_COUNTER);
}
- mTaskFpsCallbackController.unregisterCallback(listener);
+ mTaskFpsCallbackController.unregisterListener(callback);
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 498eaab..1ab8cbf 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -30,6 +30,7 @@
import static android.os.PowerManager.DRAW_WAKE_LOCK;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.InsetsState.ITYPE_IME;
+import static android.view.InsetsState.ITYPE_INVALID;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.SurfaceControl.Transaction;
import static android.view.SurfaceControl.getGlobalTransaction;
@@ -216,7 +217,6 @@
import android.util.DisplayMetrics;
import android.util.MergedConfiguration;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
@@ -257,6 +257,8 @@
import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
import com.android.server.wm.SurfaceAnimator.AnimationType;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -678,11 +680,6 @@
final InsetsState mAboveInsetsState = new InsetsState();
/**
- * The insets sources provided by this window.
- */
- final SparseArray<InsetsSource> mProvidedInsetsSources = new SparseArray<>();
-
- /**
* Surface insets from the previous call to relayout(), used to track
* if we are changing the Surface insets.
*/
@@ -736,7 +733,6 @@
*/
private boolean mIsDimming = false;
- private @Nullable InsetsSourceProvider mControllableInsetProvider;
private final InsetsVisibilities mRequestedVisibilities = new InsetsVisibilities();
/**
@@ -850,7 +846,8 @@
/**
* @see #setOnBackInvokedCallback(IOnBackInvokedCallback)
*/
- private IOnBackInvokedCallback mOnBackInvokedCallback;
+ private IOnBackInvokedCallback mApplicationOnBackInvokedCallback;
+ private IOnBackInvokedCallback mSystemOnBackInvokedCallback;
@Override
WindowState asWindowState() {
@@ -1073,15 +1070,25 @@
* called when a back navigation action is initiated.
* @see BackNavigationController
*/
- void setOnBackInvokedCallback(@Nullable IOnBackInvokedCallback onBackInvokedCallback) {
+ void setOnBackInvokedCallback(
+ @Nullable IOnBackInvokedCallback onBackInvokedCallback, int priority) {
ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "%s: Setting back callback %s",
this, onBackInvokedCallback);
- mOnBackInvokedCallback = onBackInvokedCallback;
+ if (priority >= 0) {
+ mApplicationOnBackInvokedCallback = onBackInvokedCallback;
+ } else {
+ mSystemOnBackInvokedCallback = onBackInvokedCallback;
+ }
}
@Nullable
- IOnBackInvokedCallback getOnBackInvokedCallback() {
- return mOnBackInvokedCallback;
+ IOnBackInvokedCallback getApplicationOnBackInvokedCallback() {
+ return mApplicationOnBackInvokedCallback;
+ }
+
+ @Nullable
+ IOnBackInvokedCallback getSystemOnBackInvokedCallback() {
+ return mSystemOnBackInvokedCallback;
}
interface PowerManagerWrapper {
@@ -1634,11 +1641,39 @@
}
/**
- * Returns the insets state for the window. Its sources may be the copies with visibility
- * modification according to the state of transient bars.
+ * See {@link WindowState#getInsetsState(boolean)}
*/
InsetsState getInsetsState() {
- return getDisplayContent().getInsetsPolicy().getInsetsForWindow(this);
+ return getInsetsState(false);
+ }
+
+ /**
+ * Returns the insets state for the window. Its sources may be the copies with visibility
+ * modification according to the state of transient bars.
+ * This is to get the insets for a window layout on the screen. If the window is not there, use
+ * the {@link InsetsPolicy#getInsetsForWindowMetrics} to get insets instead.
+ * @param includeTransient whether or not the transient types should be included in the
+ * insets state.
+ */
+ InsetsState getInsetsState(boolean includeTransient) {
+ final InsetsState rotatedState = mToken.getFixedRotationTransformInsetsState();
+ final InsetsPolicy insetsPolicy = getDisplayContent().getInsetsPolicy();
+ if (rotatedState != null) {
+ return insetsPolicy.adjustInsetsForWindow(this, rotatedState);
+ }
+ final InsetsSourceProvider provider = getControllableInsetProvider();
+ final InsetsStateController insetsStateController = getDisplayContent()
+ .getInsetsStateController();
+ final @InternalInsetsType int insetTypeProvidedByWindow = provider != null
+ ? provider.getSource().getType() : ITYPE_INVALID;
+ final InsetsState rawInsetsState = getFrozenInsetsState() != null
+ ? getFrozenInsetsState() : (mAttrs.receiveInsetsIgnoringZOrder
+ ? insetsStateController.getRawInsetsState() : mAboveInsetsState);
+ final InsetsState insetsStateForWindow = insetsPolicy
+ .enforceInsetsPolicyForTarget(insetTypeProvidedByWindow,
+ getWindowingMode(), isAlwaysOnTop(), rawInsetsState);
+ return insetsPolicy.adjustInsetsForWindow(this, insetsStateForWindow,
+ includeTransient);
}
/**
@@ -2385,7 +2420,8 @@
dc.getDisplayPolicy().removeWindowLw(this);
disposeInputChannel();
- mOnBackInvokedCallback = null;
+ mSystemOnBackInvokedCallback = null;
+ mApplicationOnBackInvokedCallback = null;
mSession.windowRemovedLocked();
try {
@@ -2439,7 +2475,8 @@
try {
disposeInputChannel();
- mOnBackInvokedCallback = null;
+ mSystemOnBackInvokedCallback = null;
+ mApplicationOnBackInvokedCallback = null;
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"Remove %s: mSurfaceController=%s mAnimatingExit=%b mRemoveOnExit=%b "
@@ -2931,7 +2968,7 @@
boolean canTurnScreenOn = mActivityRecord == null || mActivityRecord.currentLaunchCanTurnScreenOn();
if (allowTheaterMode && canTurnScreenOn
- && (mWmService.mAtmInternal.isDreaming()
+ && (mWmService.mAtmService.isDreaming()
|| !mPowerManagerWrapper.isInteractive())) {
if (DEBUG_VISIBILITY || DEBUG_POWER) {
Slog.v(TAG, "Relayout window turning screen on: " + this);
@@ -4165,6 +4202,7 @@
proto.end(token);
}
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
void dump(PrintWriter pw, String prefix, boolean dumpAll) {
pw.print(prefix + "mDisplayId=" + getDisplayId());
@@ -5642,24 +5680,6 @@
mWindowFrames.setContentChanged(false);
}
- /**
- * Set's an {@link InsetsSourceProvider} to be associated with this window, but only if the
- * provider itself is controllable, as one window can be the provider of more than one inset
- * type (i.e. gesture insets). If this window is controllable, all its animations must be
- * controlled by its control target, and the visibility of this window should be taken account
- * into the state of the control target.
- *
- * @param insetProvider the provider which should not be visible to the client.
- * @see InsetsStateController#getInsetsForWindow(WindowState)
- */
- void setControllableInsetProvider(InsetsSourceProvider insetProvider) {
- mControllableInsetProvider = insetProvider;
- }
-
- InsetsSourceProvider getControllableInsetProvider() {
- return mControllableInsetProvider;
- }
-
private final class MoveAnimationSpec implements AnimationSpec {
private final long mDuration;
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index f398034..ccaa03a 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
@@ -615,6 +616,12 @@
getResolvedOverrideConfiguration().updateFrom(
mFixedRotationTransformState.mRotatedOverrideConfiguration);
}
+ if (getTaskDisplayArea() == null) {
+ // We only defined behaviors of system windows in fullscreen mode, i.e. windows not
+ // contained in a task display area.
+ getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode(
+ WINDOWING_MODE_FULLSCREEN);
+ }
}
@Override
diff --git a/services/core/jni/BroadcastRadio/types.h b/services/core/jni/BroadcastRadio/types.h
index 910bb7c..4d286bf 100644
--- a/services/core/jni/BroadcastRadio/types.h
+++ b/services/core/jni/BroadcastRadio/types.h
@@ -30,13 +30,13 @@
// Keep in sync with STATUS_* constants from RadioManager.java.
enum class Status : jint {
OK = 0,
- ERROR = -0x80000000ll, // Integer.MIN_VALUE
+ ERROR = -0x80000000LL, // Integer.MIN_VALUE
PERMISSION_DENIED = -1, // -EPERM
- NO_INIT = -19, // -ENODEV
- BAD_VALUE = -22, // -EINVAL
- DEAD_OBJECT = -32, // -EPIPE
- INVALID_OPERATION = -38, // -ENOSYS
- TIMED_OUT = -110, // -ETIMEDOUT
+ NO_INIT = -19, // -ENODEV
+ BAD_VALUE = -22, // -EINVAL
+ DEAD_OBJECT = -32, // -EPIPE
+ INVALID_OPERATION = -38, // -ENOSYS
+ TIMED_OUT = -110, // -ETIMEDOUT
};
// Keep in sync with REGION_* constants from RadioManager.java.
diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
index 94bc22a..636ca41 100644
--- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
+++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
@@ -57,6 +57,19 @@
#define ASYNC_RECEIVED_WHILE_FROZEN (2)
#define TXNS_PENDING_WHILE_FROZEN (4)
+#define MAX_RW_COUNT (INT_MAX & PAGE_MASK)
+
+// Defines the maximum amount of VMAs we can send per process_madvise syscall.
+// Currently this is set to UIO_MAXIOV which is the maximum segments allowed by
+// iovec implementation used by process_madvise syscall
+#define MAX_VMAS_PER_COMPACTION UIO_MAXIOV
+
+// Maximum bytes that we can send per process_madvise syscall once this limit
+// is reached we split the remaining VMAs into another syscall. The MAX_RW_COUNT
+// limit is imposed by iovec implementation. However, if you want to use a smaller
+// limit, it has to be a page aligned value, otherwise, compaction would fail.
+#define MAX_BYTES_PER_COMPACTION MAX_RW_COUNT
+
namespace android {
static bool cancelRunningCompaction;
@@ -70,12 +83,12 @@
}
// Compacts a set of VMAs for pid using an madviseType accepted by process_madvise syscall
-// On success returns the total bytes that where compacted. On failure it returns
-// a negative error code from the standard linux error codes.
+// Returns the total bytes that where madvised.
+//
+// If any VMA fails compaction due to -EINVAL it will be skipped and continue.
+// However, if it fails for any other reason, it will bail out and forward the error
static int64_t compactMemory(const std::vector<Vma>& vmas, int pid, int madviseType) {
- // UIO_MAXIOV is currently a small value and we might have more addresses
- // we do multiple syscalls if we exceed its maximum
- static struct iovec vmasToKernel[UIO_MAXIOV];
+ static struct iovec vmasToKernel[MAX_VMAS_PER_COMPACTION];
if (vmas.empty()) {
return 0;
@@ -89,33 +102,72 @@
compactionInProgress = true;
cancelRunningCompaction = false;
- int64_t totalBytesCompacted = 0;
- for (int iBase = 0; iBase < vmas.size(); iBase += UIO_MAXIOV) {
- if (CC_UNLIKELY(cancelRunningCompaction)) {
- // There could be a significant delay betweenwhen a compaction
- // is requested and when it is handled during this time
- // our OOM adjust could have improved.
+ int64_t totalBytesProcessed = 0;
+
+ int64_t vmaOffset = 0;
+ for (int iVma = 0; iVma < vmas.size();) {
+ uint64_t bytesSentToCompact = 0;
+ int iVec = 0;
+ while (iVec < MAX_VMAS_PER_COMPACTION && iVma < vmas.size()) {
+ if (CC_UNLIKELY(cancelRunningCompaction)) {
+ // There could be a significant delay between when a compaction
+ // is requested and when it is handled during this time our
+ // OOM adjust could have improved.
+ LOG(DEBUG) << "Cancelled running compaction for " << pid;
+ break;
+ }
+
+ uint64_t vmaStart = vmas[iVma].start + vmaOffset;
+ uint64_t vmaSize = vmas[iVma].end - vmaStart;
+ if (vmaSize == 0) {
+ goto next_vma;
+ }
+ vmasToKernel[iVec].iov_base = (void*)vmaStart;
+ if (vmaSize > MAX_BYTES_PER_COMPACTION - bytesSentToCompact) {
+ // Exceeded the max bytes that could be sent, so clamp
+ // the end to avoid exceeding limit and issue compaction
+ vmaSize = MAX_BYTES_PER_COMPACTION - bytesSentToCompact;
+ }
+
+ vmasToKernel[iVec].iov_len = vmaSize;
+ bytesSentToCompact += vmaSize;
+ ++iVec;
+ if (bytesSentToCompact >= MAX_BYTES_PER_COMPACTION) {
+ // Ran out of bytes within iovec, dispatch compaction.
+ vmaOffset += vmaSize;
+ break;
+ }
+
+ next_vma:
+ // Finished current VMA, and have more bytes remaining
+ vmaOffset = 0;
+ ++iVma;
+ }
+
+ if (cancelRunningCompaction) {
cancelRunningCompaction = false;
break;
}
- int totalVmasToKernel = std::min(UIO_MAXIOV, (int)(vmas.size() - iBase));
- for (int iVec = 0, iVma = iBase; iVec < totalVmasToKernel; ++iVec, ++iVma) {
- vmasToKernel[iVec].iov_base = (void*)vmas[iVma].start;
- vmasToKernel[iVec].iov_len = vmas[iVma].end - vmas[iVma].start;
+
+ auto bytesProcessed = process_madvise(pidfd, vmasToKernel, iVec, madviseType, 0);
+
+ if (CC_UNLIKELY(bytesProcessed == -1)) {
+ if (errno == EINVAL) {
+ // This error is somewhat common due to an unevictable VMA if this is
+ // the case silently skip the bad VMA and continue compacting the rest.
+ continue;
+ } else {
+ // Forward irrecoverable errors and bail out compaction
+ compactionInProgress = false;
+ return -errno;
+ }
}
- auto bytesCompacted =
- process_madvise(pidfd, vmasToKernel, totalVmasToKernel, madviseType, 0);
- if (CC_UNLIKELY(bytesCompacted == -1)) {
- compactionInProgress = false;
- return -errno;
- }
-
- totalBytesCompacted += bytesCompacted;
+ totalBytesProcessed += bytesProcessed;
}
compactionInProgress = false;
- return totalBytesCompacted;
+ return totalBytesProcessed;
}
static int getFilePageAdvice(const Vma& vma) {
@@ -138,7 +190,12 @@
}
// Perform a full process compaction using process_madvise syscall
-// reading all filtering VMAs and filtering pages as specified by pageFilter
+// using the madvise behavior defined by vmaToAdviseFunc per VMA.
+//
+// Currently supported behaviors are MADV_COLD and MADV_PAGEOUT.
+//
+// Returns the total number of bytes compacted or forwards an
+// process_madvise error.
static int64_t compactProcess(int pid, VmaToAdviseFunc vmaToAdviseFunc) {
ProcMemInfo meminfo(pid);
std::vector<Vma> pageoutVmas, coldVmas;
diff --git a/services/core/jni/com_android_server_wm_TaskFpsCallbackController.cpp b/services/core/jni/com_android_server_wm_TaskFpsCallbackController.cpp
index 0202306..0a60e0d 100644
--- a/services/core/jni/com_android_server_wm_TaskFpsCallbackController.cpp
+++ b/services/core/jni/com_android_server_wm_TaskFpsCallbackController.cpp
@@ -99,7 +99,7 @@
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
- {"nativeRegister", "(Landroid/window/IOnFpsCallbackListener;I)J", (void*)nativeRegister},
+ {"nativeRegister", "(Landroid/window/ITaskFpsCallback;I)J", (void*)nativeRegister},
{"nativeUnregister", "(J)V", (void*)nativeUnregister}};
} // namespace
@@ -113,7 +113,7 @@
gCallbackClassInfo.mClass = MakeGlobalRefOrDie(env, clazz);
gCallbackClassInfo.mDispatchOnFpsReported =
env->GetStaticMethodID(clazz, "dispatchOnFpsReported",
- "(Landroid/window/IOnFpsCallbackListener;F)V");
+ "(Landroid/window/ITaskFpsCallback;F)V");
return 0;
}
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index be0ddc1..5b4febd 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -170,14 +170,6 @@
</xs:restriction>
</xs:simpleType>
- <!-- Maps to DisplayDeviceConfig.INTERPOLATION_* values. -->
- <xs:simpleType name="interpolation">
- <xs:restriction base="xs:string">
- <xs:enumeration value="default"/>
- <xs:enumeration value="linear"/>
- </xs:restriction>
- </xs:simpleType>
-
<xs:complexType name="thermalThrottling">
<xs:complexType>
<xs:element type="brightnessThrottlingMap" name="brightnessThrottlingMap">
@@ -216,7 +208,8 @@
<xs:annotation name="final"/>
</xs:element>
</xs:sequence>
- <xs:attribute name="interpolation" type="interpolation" use="optional"/>
+ <!-- valid value of interpolation if specified: linear -->
+ <xs:attribute name="interpolation" type="xs:string" use="optional"/>
</xs:complexType>
<xs:complexType name="point">
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index 2890d68..ba83c9f 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -108,17 +108,11 @@
method public final void setTransitionPoint_all(@NonNull java.math.BigDecimal);
}
- public enum Interpolation {
- method public String getRawName();
- enum_constant public static final com.android.server.display.config.Interpolation _default;
- enum_constant public static final com.android.server.display.config.Interpolation linear;
- }
-
public class NitsMap {
ctor public NitsMap();
- method public com.android.server.display.config.Interpolation getInterpolation();
+ method public String getInterpolation();
method @NonNull public final java.util.List<com.android.server.display.config.Point> getPoint();
- method public void setInterpolation(com.android.server.display.config.Interpolation);
+ method public void setInterpolation(String);
}
public class Point {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 5c3721d..e895d37 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -417,6 +417,8 @@
private static final String UWB_SERVICE_CLASS = "com.android.server.uwb.UwbService";
private static final String SAFETY_CENTER_SERVICE_CLASS =
"com.android.safetycenter.SafetyCenterService";
+ private static final String BLUETOOTH_SERVICE_CLASS =
+ "com.android.server.bluetooth.BluetoothService";
private static final String SUPPLEMENTALPROCESS_SERVICE_CLASS =
"com.android.server.supplementalprocess.SupplementalProcessManagerService$Lifecycle";
@@ -1624,7 +1626,7 @@
Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");
} else {
t.traceBegin("StartBluetoothService");
- mSystemServiceManager.startService(BluetoothService.class);
+ mSystemServiceManager.startService(BLUETOOTH_SERVICE_CLASS);
t.traceEnd();
}
@@ -2705,15 +2707,6 @@
systemTheme.rebase();
}
- t.traceBegin("MakePowerManagerServiceReady");
- try {
- // TODO: use boot phase
- mPowerManagerService.systemReady();
- } catch (Throwable e) {
- reportWtf("making Power Manager Service ready", e);
- }
- t.traceEnd();
-
// Permission policy service
t.traceBegin("StartPermissionPolicyService");
mSystemServiceManager.startService(PermissionPolicyService.class);
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt
index 11300ce..cd2d0fc 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt
@@ -509,7 +509,12 @@
ParsingPackage::setInheritKeyStoreKeys,
true
),
- getter(AndroidPackage::getKnownActivityEmbeddingCerts, setOf("TESTEMBEDDINGCERT"))
+ getter(AndroidPackage::getKnownActivityEmbeddingCerts, setOf("TESTEMBEDDINGCERT")),
+ getSetByValue(
+ AndroidPackage::isOnBackInvokedCallbackEnabled,
+ ParsingPackage::setOnBackInvokedCallbackEnabled,
+ true
+ )
)
override fun initialObject() = PackageImpl.forParsing(
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
index 936940f..e6bb0ce 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
@@ -2648,6 +2648,11 @@
AppPermissionTracker getAppPermissionTracker() {
return mAppPermissionTracker;
}
+
+ @Override
+ void scheduleInitTrackers(Handler handler, Runnable initializers) {
+ initializers.run();
+ }
}
private class TestBaseTrackerInjector<T extends BaseAppStatePolicy>
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java
index 0411b94..9cf6c03 100644
--- a/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java
@@ -263,7 +263,7 @@
@Test
public void testUserActivityOnDeviceStateChange() {
createService();
- mService.systemReady();
+ mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
final DisplayInfo info = new DisplayInfo();
diff --git a/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/SensorPrivacyServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/SensorPrivacyServiceMockingTest.java
index 64e8613..8b7cc74 100644
--- a/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/SensorPrivacyServiceMockingTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/sensorprivacy/SensorPrivacyServiceMockingTest.java
@@ -18,8 +18,8 @@
import static android.hardware.SensorPrivacyManager.Sensors.CAMERA;
import static android.hardware.SensorPrivacyManager.Sensors.MICROPHONE;
-import static android.hardware.SensorPrivacyManager.ToggleTypes.HARDWARE;
-import static android.hardware.SensorPrivacyManager.ToggleTypes.SOFTWARE;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_HARDWARE;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
@@ -102,106 +102,106 @@
public void testMigration1() throws IOException {
PersistedState ps = migrateFromFile(PERSISTENCE_FILE1);
- assertTrue(ps.getState(SOFTWARE, 0, MICROPHONE).isEnabled());
- assertTrue(ps.getState(SOFTWARE, 0, CAMERA).isEnabled());
+ assertTrue(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE).isEnabled());
+ assertTrue(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA).isEnabled());
- assertNull(ps.getState(SOFTWARE, 10, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA));
- assertNull(ps.getState(HARDWARE, 0, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 0, CAMERA));
- assertNull(ps.getState(HARDWARE, 10, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, CAMERA));
}
@Test
public void testMigration2() throws IOException {
PersistedState ps = migrateFromFile(PERSISTENCE_FILE2);
- assertTrue(ps.getState(SOFTWARE, 0, MICROPHONE).isEnabled());
- assertTrue(ps.getState(SOFTWARE, 0, CAMERA).isEnabled());
+ assertTrue(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE).isEnabled());
+ assertTrue(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA).isEnabled());
- assertTrue(ps.getState(SOFTWARE, 10, MICROPHONE).isEnabled());
- assertFalse(ps.getState(SOFTWARE, 10, CAMERA).isEnabled());
+ assertTrue(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE).isEnabled());
+ assertFalse(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA).isEnabled());
- assertNull(ps.getState(SOFTWARE, 11, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 11, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 11, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 11, CAMERA));
- assertTrue(ps.getState(SOFTWARE, 12, MICROPHONE).isEnabled());
- assertNull(ps.getState(SOFTWARE, 12, CAMERA));
+ assertTrue(ps.getState(TOGGLE_TYPE_SOFTWARE, 12, MICROPHONE).isEnabled());
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 12, CAMERA));
- assertNull(ps.getState(HARDWARE, 0, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 0, CAMERA));
- assertNull(ps.getState(HARDWARE, 10, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 10, CAMERA));
- assertNull(ps.getState(HARDWARE, 11, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 11, CAMERA));
- assertNull(ps.getState(HARDWARE, 12, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 12, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 11, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 11, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 12, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 12, CAMERA));
}
@Test
public void testMigration3() throws IOException {
PersistedState ps = migrateFromFile(PERSISTENCE_FILE3);
- assertFalse(ps.getState(SOFTWARE, 0, MICROPHONE).isEnabled());
- assertFalse(ps.getState(SOFTWARE, 0, CAMERA).isEnabled());
+ assertFalse(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE).isEnabled());
+ assertFalse(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA).isEnabled());
- assertNull(ps.getState(SOFTWARE, 10, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA));
- assertNull(ps.getState(HARDWARE, 0, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 0, CAMERA));
- assertNull(ps.getState(HARDWARE, 10, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, CAMERA));
}
@Test
public void testMigration4() throws IOException {
PersistedState ps = migrateFromFile(PERSISTENCE_FILE4);
- assertTrue(ps.getState(SOFTWARE, 0, MICROPHONE).isEnabled());
- assertFalse(ps.getState(SOFTWARE, 0, CAMERA).isEnabled());
+ assertTrue(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE).isEnabled());
+ assertFalse(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA).isEnabled());
- assertFalse(ps.getState(SOFTWARE, 10, MICROPHONE).isEnabled());
- assertNull(ps.getState(SOFTWARE, 10, CAMERA));
+ assertFalse(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE).isEnabled());
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA));
- assertNull(ps.getState(HARDWARE, 0, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 0, CAMERA));
- assertNull(ps.getState(HARDWARE, 10, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, CAMERA));
}
@Test
public void testMigration5() throws IOException {
PersistedState ps = migrateFromFile(PERSISTENCE_FILE5);
- assertNull(ps.getState(SOFTWARE, 0, MICROPHONE));
- assertFalse(ps.getState(SOFTWARE, 0, CAMERA).isEnabled());
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE));
+ assertFalse(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA).isEnabled());
- assertNull(ps.getState(SOFTWARE, 10, MICROPHONE));
- assertFalse(ps.getState(SOFTWARE, 10, CAMERA).isEnabled());
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE));
+ assertFalse(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA).isEnabled());
- assertNull(ps.getState(HARDWARE, 0, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 0, CAMERA));
- assertNull(ps.getState(HARDWARE, 10, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, CAMERA));
}
@Test
public void testMigration6() throws IOException {
PersistedState ps = migrateFromFile(PERSISTENCE_FILE6);
- assertNull(ps.getState(SOFTWARE, 0, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA));
- assertNull(ps.getState(SOFTWARE, 10, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA));
- assertNull(ps.getState(HARDWARE, 0, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 0, CAMERA));
- assertNull(ps.getState(HARDWARE, 10, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, CAMERA));
}
private PersistedState migrateFromFile(String fileName) throws IOException {
@@ -233,32 +233,32 @@
public void testPersistence1Version2() throws IOException {
PersistedState ps = getPersistedStateV2(PERSISTENCE_FILE7);
- assertEquals(1, ps.getState(SOFTWARE, 0, MICROPHONE).getState());
- assertEquals(123L, ps.getState(SOFTWARE, 0, MICROPHONE).getLastChange());
- assertEquals(2, ps.getState(SOFTWARE, 0, CAMERA).getState());
- assertEquals(123L, ps.getState(SOFTWARE, 0, CAMERA).getLastChange());
+ assertEquals(1, ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE).getState());
+ assertEquals(123L, ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE).getLastChange());
+ assertEquals(2, ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA).getState());
+ assertEquals(123L, ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA).getLastChange());
- assertNull(ps.getState(HARDWARE, 0, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 0, CAMERA));
- assertNull(ps.getState(SOFTWARE, 10, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA));
}
@Test
public void testPersistence2Version2() throws IOException {
PersistedState ps = getPersistedStateV2(PERSISTENCE_FILE8);
- assertEquals(1, ps.getState(HARDWARE, 0, MICROPHONE).getState());
- assertEquals(1234L, ps.getState(HARDWARE, 0, MICROPHONE).getLastChange());
- assertEquals(2, ps.getState(HARDWARE, 0, CAMERA).getState());
- assertEquals(1234L, ps.getState(HARDWARE, 0, CAMERA).getLastChange());
+ assertEquals(1, ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE).getState());
+ assertEquals(1234L, ps.getState(TOGGLE_TYPE_HARDWARE, 0, MICROPHONE).getLastChange());
+ assertEquals(2, ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA).getState());
+ assertEquals(1234L, ps.getState(TOGGLE_TYPE_HARDWARE, 0, CAMERA).getLastChange());
- assertNull(ps.getState(SOFTWARE, 0, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 0, CAMERA));
- assertNull(ps.getState(SOFTWARE, 10, MICROPHONE));
- assertNull(ps.getState(SOFTWARE, 10, CAMERA));
- assertNull(ps.getState(HARDWARE, 10, MICROPHONE));
- assertNull(ps.getState(HARDWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_SOFTWARE, 10, CAMERA));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, MICROPHONE));
+ assertNull(ps.getState(TOGGLE_TYPE_HARDWARE, 10, CAMERA));
}
private PersistedState getPersistedStateV2(String version2FilePath) throws IOException {
@@ -296,13 +296,15 @@
SensorPrivacyStateController sensorPrivacyStateController =
getSensorPrivacyStateControllerImpl();
- SensorState micState = sensorPrivacyStateController.getState(SOFTWARE, 0, MICROPHONE);
- SensorState camState = sensorPrivacyStateController.getState(SOFTWARE, 0, CAMERA);
+ SensorState micState = sensorPrivacyStateController.getState(TOGGLE_TYPE_SOFTWARE, 0,
+ MICROPHONE);
+ SensorState camState = sensorPrivacyStateController.getState(TOGGLE_TYPE_SOFTWARE, 0,
+ CAMERA);
assertEquals(SensorPrivacyManager.StateTypes.DISABLED, micState.getState());
assertEquals(SensorPrivacyManager.StateTypes.DISABLED, camState.getState());
- verify(persistedState, times(1)).getState(SOFTWARE, 0, MICROPHONE);
- verify(persistedState, times(1)).getState(SOFTWARE, 0, CAMERA);
+ verify(persistedState, times(1)).getState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE);
+ verify(persistedState, times(1)).getState(TOGGLE_TYPE_SOFTWARE, 0, CAMERA);
} finally {
mockitoSession.finishMocking();
}
@@ -319,14 +321,16 @@
PersistedState persistedState = mock(PersistedState.class);
SensorState sensorState = mock(SensorState.class);
doReturn(persistedState).when(() -> PersistedState.fromFile(any()));
- doReturn(sensorState).when(persistedState).getState(SOFTWARE, 0, MICROPHONE);
+ doReturn(sensorState).when(persistedState).getState(TOGGLE_TYPE_SOFTWARE, 0,
+ MICROPHONE);
doReturn(SensorPrivacyManager.StateTypes.ENABLED).when(sensorState).getState();
doReturn(0L).when(sensorState).getLastChange();
SensorPrivacyStateController sensorPrivacyStateController =
getSensorPrivacyStateControllerImpl();
- SensorState micState = sensorPrivacyStateController.getState(SOFTWARE, 0, MICROPHONE);
+ SensorState micState = sensorPrivacyStateController.getState(TOGGLE_TYPE_SOFTWARE, 0,
+ MICROPHONE);
assertEquals(SensorPrivacyManager.StateTypes.ENABLED, micState.getState());
assertEquals(0L, micState.getLastChange());
@@ -349,13 +353,13 @@
SensorPrivacyStateController sensorPrivacyStateController =
getSensorPrivacyStateControllerImpl();
- sensorPrivacyStateController.setState(SOFTWARE, 0, MICROPHONE, true,
+ sensorPrivacyStateController.setState(TOGGLE_TYPE_SOFTWARE, 0, MICROPHONE, true,
mock(Handler.class), changed -> {});
ArgumentCaptor<SensorState> captor = ArgumentCaptor.forClass(SensorState.class);
- verify(persistedState, times(1)).setState(eq(SOFTWARE), eq(0), eq(MICROPHONE),
- captor.capture());
+ verify(persistedState, times(1)).setState(eq(TOGGLE_TYPE_SOFTWARE), eq(0),
+ eq(MICROPHONE), captor.capture());
assertEquals(SensorPrivacyManager.StateTypes.ENABLED, captor.getValue().getState());
} finally {
mockitoSession.finishMocking();
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java
index c4040b4..3c2fbd9 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java
@@ -27,6 +27,7 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -342,9 +343,58 @@
}
@Test
- public void setMagnificationConfig_controllingModeChangeAndAnimating_transitionConfigMode() {
+ public void setWindowModeConfig_fullScreenMode_transitionConfigMode() {
+ final int currentActivatedMode = MAGNIFICATION_MODE_FULLSCREEN;
+ final MagnificationConfig oldConfig = new MagnificationConfig.Builder()
+ .setMode(currentActivatedMode)
+ .setScale(TEST_SCALE)
+ .setCenterX(TEST_CENTER_X)
+ .setCenterY(TEST_CENTER_Y).build();
+ setMagnificationActivated(TEST_DISPLAY, oldConfig);
+ final MagnificationConfig targetConfig = new MagnificationConfig.Builder()
+ .setMode(MAGNIFICATION_MODE_WINDOW)
+ .setScale(TEST_SCALE)
+ .setCenterX(TEST_CENTER_X + 10)
+ .setCenterY(TEST_CENTER_Y + 10).build();
+
+ mMagnificationProcessor.setMagnificationConfig(TEST_DISPLAY, targetConfig, false,
+ SERVICE_ID);
+
+ verify(mMockMagnificationController).transitionMagnificationConfigMode(eq(TEST_DISPLAY),
+ eq(targetConfig), eq(false), eq(SERVICE_ID));
+ }
+
+ @Test
+ public void setConfigWithDefaultMode_fullScreenMode_expectedConfig() {
+ final MagnificationConfig oldConfig = new MagnificationConfig.Builder()
+ .setMode(MAGNIFICATION_MODE_FULLSCREEN)
+ .setScale(TEST_SCALE)
+ .setCenterX(TEST_CENTER_X)
+ .setCenterY(TEST_CENTER_Y).build();
+ setMagnificationActivated(TEST_DISPLAY, oldConfig);
+ final MagnificationConfig targetConfig = new MagnificationConfig.Builder()
+ .setScale(TEST_SCALE + 1)
+ .setCenterX(TEST_CENTER_X + 10)
+ .setCenterY(TEST_CENTER_Y + 10).build();
+
+ mMagnificationProcessor.setMagnificationConfig(TEST_DISPLAY, targetConfig, false,
+ SERVICE_ID);
+
+ verify(mMockMagnificationController, never()).transitionMagnificationConfigMode(
+ eq(TEST_DISPLAY), any(MagnificationConfig.class), eq(false), eq(SERVICE_ID));
+ final MagnificationConfig expectedConfig = new MagnificationConfig.Builder()
+ .setMode(MAGNIFICATION_MODE_FULLSCREEN)
+ .setScale(TEST_SCALE + 1)
+ .setCenterX(TEST_CENTER_X + 10)
+ .setCenterY(TEST_CENTER_Y + 10).build();
+ assertConfigEquals(expectedConfig,
+ mMagnificationProcessor.getMagnificationConfig(TEST_DISPLAY));
+ }
+
+ @Test
+ public void setWindowModeConfig_transitionToFullScreenModeWithAnimation_transitionConfigMode() {
final int currentActivatedMode = MAGNIFICATION_MODE_WINDOW;
- final int targetMode = MAGNIFICATION_MODE_FULLSCREEN;
+ final int targetMode = MAGNIFICATION_MODE_WINDOW;
final MagnificationConfig oldConfig = new MagnificationConfig.Builder()
.setMode(currentActivatedMode)
.setScale(TEST_SCALE)
@@ -356,17 +406,14 @@
.setScale(TEST_SCALE)
.setCenterX(TEST_CENTER_X + 10)
.setCenterY(TEST_CENTER_Y + 10).build();
-
// Has magnification animation running
when(mMockMagnificationController.hasDisableMagnificationCallback(TEST_DISPLAY)).thenReturn(
true);
- setMagnificationActivated(TEST_DISPLAY, newConfig);
- final MagnificationConfig result = mMagnificationProcessor.getMagnificationConfig(
- TEST_DISPLAY);
+ mMagnificationProcessor.setMagnificationConfig(TEST_DISPLAY, newConfig, false, SERVICE_ID);
+
verify(mMockMagnificationController).transitionMagnificationConfigMode(eq(TEST_DISPLAY),
eq(newConfig), anyBoolean(), anyInt());
- assertConfigEquals(newConfig, result);
}
private void setMagnificationActivated(int displayId, int configMode) {
@@ -383,7 +430,7 @@
MAGNIFICATION_MODE_WINDOW)).thenReturn(false);
mFullScreenMagnificationControllerStub.resetAndStubMethods();
mMockFullScreenMagnificationController.setScaleAndCenter(displayId, config.getScale(),
- config.getCenterX(), config.getCenterY(), true, SERVICE_ID);
+ config.getCenterX(), config.getCenterY(), false, SERVICE_ID);
} else if (config.getMode() == MAGNIFICATION_MODE_WINDOW) {
when(mMockMagnificationController.isActivated(displayId,
MAGNIFICATION_MODE_FULLSCREEN)).thenReturn(false);
@@ -429,7 +476,7 @@
};
doAnswer(enableMagnificationStubAnswer).when(
mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), anyFloat(),
- anyFloat(), anyFloat(), eq(true), eq(SERVICE_ID));
+ anyFloat(), anyFloat(), anyBoolean(), eq(SERVICE_ID));
Answer registerStubAnswer = invocation -> {
mIsRegistered = true;
@@ -444,6 +491,8 @@
};
doAnswer(unregisterStubAnswer).when(
mScreenMagnificationController).unregister(eq(TEST_DISPLAY));
+ doAnswer(unregisterStubAnswer).when(
+ mScreenMagnificationController).reset(eq(TEST_DISPLAY), anyBoolean());
}
public void resetAndStubMethods() {
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
index 064b762..3fcce92 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
@@ -20,6 +20,7 @@
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW;
import static com.android.server.accessibility.AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID;
+import static com.android.server.wm.WindowManagerInternal.AccessibilityControllerInternal.UiChangesForAccessibilityCallbacks;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -32,9 +33,9 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -80,7 +81,6 @@
private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY;
private static final int TEST_SERVICE_ID = 1;
- private static final Region MAGNIFICATION_REGION = new Region(0, 0, 500, 600);
private static final Rect TEST_RECT = new Rect(0, 50, 100, 51);
private static final float MAGNIFIED_CENTER_X = 100;
private static final float MAGNIFIED_CENTER_Y = 200;
@@ -109,7 +109,8 @@
private WindowMagnificationManager mWindowMagnificationManager;
private MockContentResolver mMockResolver;
private MagnificationController mMagnificationController;
- private FullScreenMagnificationControllerStubber mScreenMagnificationControllerStubber;
+ private final WindowMagnificationMgrCallbackDelegate mCallbackDelegate =
+ new WindowMagnificationMgrCallbackDelegate();
@Mock
private WindowManagerInternal mMockWindowManagerInternal;
@@ -141,17 +142,16 @@
mScaleProvider = spy(new MagnificationScaleProvider(mContext));
mWindowMagnificationManager = Mockito.spy(
new WindowMagnificationManager(mContext, globalLock,
- mock(WindowMagnificationManager.Callback.class), mTraceManager,
- mScaleProvider));
+ mCallbackDelegate, mTraceManager, mScaleProvider));
mMockConnection = new MockWindowMagnificationConnection(true);
mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mScreenMagnificationControllerStubber = new FullScreenMagnificationControllerStubber(
- mScreenMagnificationController);
+ new FullScreenMagnificationControllerStubber(mScreenMagnificationController);
mMagnificationController = new MagnificationController(mService, globalLock, mContext,
mScreenMagnificationController, mWindowMagnificationManager, mScaleProvider);
mMagnificationController.setMagnificationCapabilities(
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);
+ mCallbackDelegate.setDelegate(mMagnificationController);
}
@After
@@ -222,8 +222,10 @@
MODE_WINDOW,
mTransitionCallBack);
- mMockConnection.invokeCallbacks();
- verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY),
+ // The first time is triggered when window mode is activated, the second time is triggered
+ // when activating the window mode again. The third time is triggered when the transition is
+ // completed.
+ verify(mWindowMagnificationManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
}
@@ -247,7 +249,8 @@
@Test
public void transitionToFullScreen_centerNotInTheBounds_magnifyBoundsCenter()
throws RemoteException {
- final Rect magnificationBounds = MAGNIFICATION_REGION.getBounds();
+ final Rect magnificationBounds =
+ FullScreenMagnificationControllerStubber.MAGNIFICATION_REGION.getBounds();
final PointF magnifiedCenter = new PointF(magnificationBounds.right + 100,
magnificationBounds.bottom + 100);
setMagnificationEnabled(MODE_WINDOW, magnifiedCenter.x, magnifiedCenter.y);
@@ -430,18 +433,21 @@
}
@Test
- public void onSourceBoundsChanged_notifyMagnificationChanged() {
- Rect rect = new Rect(0, 0, 100, 120);
- Region region = new Region(rect);
-
- mMagnificationController.onSourceBoundsChanged(TEST_DISPLAY, rect);
+ public void enableWindowMode_notifyMagnificationChanged() throws RemoteException {
+ setMagnificationEnabled(MODE_WINDOW);
final ArgumentCaptor<MagnificationConfig> configCaptor = ArgumentCaptor.forClass(
MagnificationConfig.class);
- verify(mService).notifyMagnificationChanged(eq(TEST_DISPLAY), eq(region),
+ final ArgumentCaptor<Region> regionCaptor = ArgumentCaptor.forClass(
+ Region.class);
+ verify(mService).notifyMagnificationChanged(eq(TEST_DISPLAY), regionCaptor.capture(),
configCaptor.capture());
- assertEquals(rect.exactCenterX(), configCaptor.getValue().getCenterX(), 0);
- assertEquals(rect.exactCenterY(), configCaptor.getValue().getCenterY(), 0);
+
+ final Rect actualRect = regionCaptor.getValue().getBounds();
+ final MagnificationConfig actualConfig = configCaptor.getValue();
+ assertEquals(actualRect.exactCenterX(), actualConfig.getCenterX(), 0);
+ assertEquals(actualRect.exactCenterY(), actualConfig.getCenterY(), 0);
+ assertEquals(DEFAULT_SCALE, actualConfig.getScale(), 0);
}
@Test
@@ -451,7 +457,8 @@
mMagnificationController.onAccessibilityActionPerformed(TEST_DISPLAY);
- verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY),
+ // The first time is triggered when window mode is activated.
+ verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
}
@@ -464,7 +471,8 @@
mMagnificationController.onAccessibilityActionPerformed(TEST_DISPLAY);
- verify(mWindowMagnificationManager).removeMagnificationButton(eq(TEST_DISPLAY));
+ // The first time is triggered when window mode is activated.
+ verify(mWindowMagnificationManager, times(2)).removeMagnificationButton(eq(TEST_DISPLAY));
}
@Test
@@ -490,8 +498,7 @@
public void onRectangleOnScreenRequested_fullScreenIsActivated_fullScreenDispatchEvent() {
mMagnificationController.onFullScreenMagnificationActivationState(TEST_DISPLAY,
true);
- WindowManagerInternal.AccessibilityControllerInternal.UiChangesForAccessibilityCallbacks
- callbacks = getUiChangesForAccessibilityCallbacks();
+ UiChangesForAccessibilityCallbacks callbacks = getUiChangesForAccessibilityCallbacks();
callbacks.onRectangleOnScreenRequested(TEST_DISPLAY,
TEST_RECT.left, TEST_RECT.top, TEST_RECT.right, TEST_RECT.bottom);
@@ -508,8 +515,7 @@
true);
mMagnificationController.onFullScreenMagnificationActivationState(TEST_DISPLAY,
false);
- WindowManagerInternal.AccessibilityControllerInternal.UiChangesForAccessibilityCallbacks
- callbacks = getUiChangesForAccessibilityCallbacks();
+ UiChangesForAccessibilityCallbacks callbacks = getUiChangesForAccessibilityCallbacks();
callbacks.onRectangleOnScreenRequested(TEST_DISPLAY,
TEST_RECT.left, TEST_RECT.top, TEST_RECT.right, TEST_RECT.bottom);
@@ -522,8 +528,7 @@
@Test
public void onRectangleOnScreenRequested_NoneIsActivated_noneDispatchEvent() {
- WindowManagerInternal.AccessibilityControllerInternal.UiChangesForAccessibilityCallbacks
- callbacks = getUiChangesForAccessibilityCallbacks();
+ UiChangesForAccessibilityCallbacks callbacks = getUiChangesForAccessibilityCallbacks();
callbacks.onRectangleOnScreenRequested(TEST_DISPLAY,
TEST_RECT.left, TEST_RECT.top, TEST_RECT.right, TEST_RECT.bottom);
@@ -546,8 +551,7 @@
}
@Test
- public void
- onFullScreenMagnificationActivationState_fullScreenActivated_logFullScreenDuration() {
+ public void onFullScreenMagnificationActivationState_fullScreenEnabled_logFullScreenDuration() {
MagnificationController spyController = spy(mMagnificationController);
spyController.onFullScreenMagnificationActivationState(TEST_DISPLAY, true);
@@ -596,7 +600,8 @@
mMagnificationController.onTouchInteractionStart(TEST_DISPLAY, MODE_WINDOW);
- verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY),
+ // The first time is triggered when the window mode is activated.
+ verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
}
@@ -607,7 +612,8 @@
mMagnificationController.onTouchInteractionEnd(TEST_DISPLAY, MODE_WINDOW);
- verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY),
+ // The first time is triggered when the window mode is activated.
+ verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
}
@@ -639,12 +645,10 @@
}
@Test
- public void onWindowActivated_windowModeEnabledAndCapabilitiesAll_showMagnificationButton()
+ public void enableWindowMode_showMagnificationButton()
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
- mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, true);
-
verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
}
@@ -661,18 +665,17 @@
}
@Test
- public void onWindowDeactivated_windowModeInactive_removeMagnificationButton()
+ public void disableWindowMode_windowModeInActive_removeMagnificationButton()
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
- mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, false);
+ mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
verify(mWindowMagnificationManager).removeMagnificationButton(eq(TEST_DISPLAY));
}
@Test
- public void onFullScreenDeactivated_fullscreenModeInactive_removeMagnificationButton()
+ public void onFullScreenDeactivated_fullscreenModeInActive_removeMagnificationButton()
throws RemoteException {
setMagnificationEnabled(MODE_FULLSCREEN);
mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY,
@@ -685,7 +688,7 @@
}
@Test
- public void transitionToFullScreenMode_fullscreenModeActivated_showMagnificationButton()
+ public void transitionToFullScreenMode_fullscreenModeInActive_showMagnificationButton()
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
@@ -698,7 +701,7 @@
}
@Test
- public void transitionToWindow_windowModeActivated_showMagnificationButton()
+ public void transitionToWindow_fullscreenModeInActive_showMagnificationButton()
throws RemoteException {
setMagnificationEnabled(MODE_FULLSCREEN);
@@ -709,7 +712,10 @@
mCallbackArgumentCaptor.capture());
mCallbackArgumentCaptor.getValue().onResult(true);
mMockConnection.invokeCallbacks();
- verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY),
+
+ // The first time is triggered when window mode is activated, the second time is triggered
+ // when the disable-magnification callback is triggered.
+ verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
}
@@ -784,7 +790,6 @@
}
private void activateMagnifier(int mode, float centerX, float centerY) throws RemoteException {
- mScreenMagnificationControllerStubber.resetAndStubMethods();
final boolean windowMagnifying = mWindowMagnificationManager.isWindowMagnifierEnabled(
TEST_DISPLAY);
if (windowMagnifying) {
@@ -806,13 +811,20 @@
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, mode, CURRENT_USER_ID);
}
- private MagnificationConfig obtainMagnificationConfig(int mode) {
- return new MagnificationConfig.Builder().setMode(mode).setScale(DEFAULT_SCALE).setCenterX(
- MAGNIFIED_CENTER_X).setCenterY(MAGNIFIED_CENTER_Y).build();
+ private static MagnificationConfig obtainMagnificationConfig(int mode) {
+ return obtainMagnificationConfig(mode, true);
}
- private WindowManagerInternal.AccessibilityControllerInternal.UiChangesForAccessibilityCallbacks
- getUiChangesForAccessibilityCallbacks() {
+ private static MagnificationConfig obtainMagnificationConfig(int mode, boolean defaultScale) {
+ MagnificationConfig.Builder builder = new MagnificationConfig.Builder();
+ if (defaultScale) {
+ builder = builder.setScale(DEFAULT_SCALE);
+ }
+ return builder.setMode(mode).setCenterX(MAGNIFIED_CENTER_X)
+ .setCenterY(MAGNIFIED_CENTER_Y).build();
+ }
+
+ private UiChangesForAccessibilityCallbacks getUiChangesForAccessibilityCallbacks() {
ArgumentCaptor<WindowManagerInternal.AccessibilityControllerInternal
.UiChangesForAccessibilityCallbacks> captor = ArgumentCaptor.forClass(
WindowManagerInternal.AccessibilityControllerInternal
@@ -822,21 +834,65 @@
return captor.getValue();
}
+ private static class WindowMagnificationMgrCallbackDelegate implements
+ WindowMagnificationManager.Callback {
+ private WindowMagnificationManager.Callback mCallback;
+
+ public void setDelegate(WindowMagnificationManager.Callback callback) {
+ mCallback = callback;
+ }
+
+ @Override
+ public void onPerformScaleAction(int displayId, float scale) {
+ if (mCallback != null) {
+ mCallback.onPerformScaleAction(displayId, scale);
+ }
+ }
+
+ @Override
+ public void onAccessibilityActionPerformed(int displayId) {
+ if (mCallback != null) {
+ mCallback.onAccessibilityActionPerformed(displayId);
+ }
+ }
+
+ @Override
+ public void onWindowMagnificationActivationState(int displayId, boolean activated) {
+ if (mCallback != null) {
+ mCallback.onWindowMagnificationActivationState(displayId, activated);
+ }
+ }
+
+ @Override
+ public void onSourceBoundsChanged(int displayId, Rect bounds) {
+ if (mCallback != null) {
+ mCallback.onSourceBoundsChanged(displayId, bounds);
+ }
+ }
+
+ @Override
+ public void onChangeMagnificationMode(int displayId, int magnificationMode) {
+ if (mCallback != null) {
+ mCallback.onChangeMagnificationMode(displayId, magnificationMode);
+ }
+ }
+ }
+
/**
- * Stubs public methods to simulate the real beahviours.
+ * Stubs public methods to simulate the real behaviours.
*/
private static class FullScreenMagnificationControllerStubber {
+ private static final Region MAGNIFICATION_REGION = new Region(0, 0, 500, 600);
private final FullScreenMagnificationController mScreenMagnificationController;
private boolean mIsMagnifying = false;
private float mScale = 1.0f;
- private float mCenterX = 0;
- private float mCenterY = 0;
+ private float mCenterX = MAGNIFICATION_REGION.getBounds().exactCenterX();
+ private float mCenterY = MAGNIFICATION_REGION.getBounds().exactCenterY();
private int mServiceId = -1;
FullScreenMagnificationControllerStubber(
FullScreenMagnificationController screenMagnificationController) {
mScreenMagnificationController = screenMagnificationController;
- resetCenter();
stubMethods();
}
@@ -872,8 +928,7 @@
mCenterY = invocation.getArgument(3);
mServiceId = invocation.getArgument(5);
} else {
- mServiceId = -1;
- resetCenter();
+ reset();
}
return true;
};
@@ -886,26 +941,21 @@
anyFloat(), anyFloat(), anyFloat(), anyBoolean(), anyInt());
Answer resetStubAnswer = invocation -> {
- mScale = 1.0f;
- mIsMagnifying = false;
- mServiceId = -1;
- resetCenter();
+ reset();
return true;
};
doAnswer(resetStubAnswer).when(mScreenMagnificationController).reset(eq(TEST_DISPLAY),
- any());
+ any(MagnificationAnimationCallback.class));
doAnswer(resetStubAnswer).when(mScreenMagnificationController).reset(eq(TEST_DISPLAY),
anyBoolean());
}
- private void resetCenter() {
+ private void reset() {
+ mScale = 1.0f;
+ mIsMagnifying = false;
+ mServiceId = -1;
mCenterX = MAGNIFICATION_REGION.getBounds().exactCenterX();
mCenterY = MAGNIFICATION_REGION.getBounds().exactCenterY();
}
-
- public void resetAndStubMethods() {
- Mockito.reset(mScreenMagnificationController);
- stubMethods();
- }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java
index 8da513b..0742c09 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java
@@ -62,6 +62,7 @@
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
@@ -633,9 +634,15 @@
public void onWindowMagnificationActivationState_magnifierDisabled_notifyDeactivatedState() {
mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, true);
+ mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
verify(mMockCallback).onWindowMagnificationActivationState(TEST_DISPLAY, false);
+
+ Mockito.reset(mMockCallback);
+ mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+
+ verify(mMockCallback, never()).onWindowMagnificationActivationState(eq(TEST_DISPLAY),
+ anyBoolean());
}
private MotionEvent generatePointersDownEvent(PointF[] pointersLocation) {
diff --git a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
index 02cf971..b36aa06 100644
--- a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
@@ -635,7 +635,7 @@
long time = System.currentTimeMillis();
for (String key : testKeys) {
long connectionTime = adbKeyStore.getLastConnectionTime(key);
- if (Math.abs(connectionTime - connectionTime) > epsilon) {
+ if (Math.abs(time - connectionTime) > epsilon) {
fail("The connection time for a previously untracked key, " + connectionTime
+ ", is beyond the current time of " + time);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java b/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java
index 877538c..782d519 100644
--- a/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java
@@ -20,7 +20,12 @@
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
@@ -42,6 +47,7 @@
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
@@ -51,6 +57,7 @@
@SmallTest
@Presubmit
public class AnrHelperTest {
+ private static final long TIMEOUT_MS = TimeUnit.SECONDS.toMillis(5);
private AnrHelper mAnrHelper;
private ProcessRecord mAnrApp;
@@ -106,8 +113,42 @@
mAnrHelper.appNotResponding(mAnrApp, activityShortComponentName, appInfo,
parentShortComponentName, parentProcess, aboveSystem, annotation);
- verify(mAnrApp.mErrorState, timeout(TimeUnit.SECONDS.toMillis(5))).appNotResponding(
+ verify(mAnrApp.mErrorState, timeout(TIMEOUT_MS)).appNotResponding(
eq(activityShortComponentName), eq(appInfo), eq(parentShortComponentName),
eq(parentProcess), eq(aboveSystem), eq(annotation), eq(false) /* onlyDumpSelf */);
}
+
+ @Test
+ public void testSkipDuplicatedAnr() {
+ final CountDownLatch consumerLatch = new CountDownLatch(1);
+ final CountDownLatch processingLatch = new CountDownLatch(1);
+ doAnswer(invocation -> {
+ consumerLatch.countDown();
+ // Simulate that it is dumping to block the consumer thread.
+ processingLatch.await();
+ return null;
+ }).when(mAnrApp.mErrorState).appNotResponding(anyString(), any(), any(), any(),
+ anyBoolean(), anyString(), anyBoolean());
+ final ApplicationInfo appInfo = new ApplicationInfo();
+ mAnrApp.mPid = 12345;
+ final Runnable reportAnr = () -> mAnrHelper.appNotResponding(mAnrApp,
+ "activityShortComponentName", appInfo, "parentShortComponentName",
+ null /* parentProcess */, false /* aboveSystem */, "annotation");
+ reportAnr.run();
+ // This should be skipped because the pid is pending in queue.
+ reportAnr.run();
+ // The first reported ANR must be processed.
+ try {
+ assertTrue(consumerLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } catch (InterruptedException ignored) {
+ }
+ // This should be skipped because the pid is under processing.
+ reportAnr.run();
+
+ // Assume that the first one finishes after all incoming ANRs.
+ processingLatch.countDown();
+ // There is only one ANR reported.
+ verify(mAnrApp.mErrorState, timeout(TIMEOUT_MS).only()).appNotResponding(
+ anyString(), any(), any(), any(), anyBoolean(), anyString(), anyBoolean());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java
index 3890d4d..897b91e 100644
--- a/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java
@@ -37,7 +37,7 @@
import static org.mockito.Mockito.verifyZeroInteractions;
import android.attention.AttentionManagerInternal.AttentionCallbackInternal;
-import android.attention.AttentionManagerInternal.ProximityCallbackInternal;
+import android.attention.AttentionManagerInternal.ProximityUpdateCallbackInternal;
import android.content.ComponentName;
import android.content.Context;
import android.os.IBinder;
@@ -48,7 +48,7 @@
import android.provider.DeviceConfig;
import android.service.attention.IAttentionCallback;
import android.service.attention.IAttentionService;
-import android.service.attention.IProximityCallback;
+import android.service.attention.IProximityUpdateCallback;
import androidx.test.filters.SmallTest;
@@ -85,7 +85,7 @@
@Mock
Context mContext;
@Mock
- private ProximityCallbackInternal mMockProximityCallbackInternal;
+ private ProximityUpdateCallbackInternal mMockProximityUpdateCallbackInternal;
@Before
public void setUp() throws RemoteException {
@@ -119,7 +119,8 @@
public void testRegisterProximityUpdates_returnFalseWhenServiceDisabled() {
mSpyAttentionManager.mIsServiceEnabled = false;
- assertThat(mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal))
+ assertThat(mSpyAttentionManager.onStartProximityUpdates(
+ mMockProximityUpdateCallbackInternal))
.isFalse();
}
@@ -128,7 +129,8 @@
mSpyAttentionManager.mIsServiceEnabled = true;
doReturn(false).when(mSpyAttentionManager).isServiceAvailable();
- assertThat(mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal))
+ assertThat(mSpyAttentionManager.onStartProximityUpdates(
+ mMockProximityUpdateCallbackInternal))
.isFalse();
}
@@ -139,7 +141,8 @@
doReturn(true).when(mSpyAttentionManager).isServiceAvailable();
doReturn(false).when(mMockIPowerManager).isInteractive();
- assertThat(mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal))
+ assertThat(mSpyAttentionManager.onStartProximityUpdates(
+ mMockProximityUpdateCallbackInternal))
.isFalse();
}
@@ -149,9 +152,10 @@
doReturn(true).when(mSpyAttentionManager).isServiceAvailable();
doReturn(true).when(mMockIPowerManager).isInteractive();
- assertThat(mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal))
+ assertThat(mSpyAttentionManager.onStartProximityUpdates(
+ mMockProximityUpdateCallbackInternal))
.isTrue();
- verify(mMockProximityCallbackInternal, times(1))
+ verify(mMockProximityUpdateCallbackInternal, times(1))
.onProximityUpdate(PROXIMITY_SUCCESS_STATE);
}
@@ -161,21 +165,23 @@
doReturn(true).when(mSpyAttentionManager).isServiceAvailable();
doReturn(true).when(mMockIPowerManager).isInteractive();
- assertThat(mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal))
+ assertThat(mSpyAttentionManager.onStartProximityUpdates(
+ mMockProximityUpdateCallbackInternal))
.isTrue();
ProximityUpdate prevProximityUpdate = mSpyAttentionManager.mCurrentProximityUpdate;
- assertThat(mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal))
+ assertThat(mSpyAttentionManager.onStartProximityUpdates(
+ mMockProximityUpdateCallbackInternal))
.isTrue();
assertThat(mSpyAttentionManager.mCurrentProximityUpdate).isEqualTo(prevProximityUpdate);
- verify(mMockProximityCallbackInternal, times(1))
+ verify(mMockProximityUpdateCallbackInternal, times(1))
.onProximityUpdate(PROXIMITY_SUCCESS_STATE);
}
@Test
public void testUnregisterProximityUpdates_noCrashWhenNoCallbackIsRegistered() {
- mSpyAttentionManager.onStopProximityUpdates(mMockProximityCallbackInternal);
- verifyZeroInteractions(mMockProximityCallbackInternal);
+ mSpyAttentionManager.onStopProximityUpdates(mMockProximityUpdateCallbackInternal);
+ verifyZeroInteractions(mMockProximityUpdateCallbackInternal);
}
@Test
@@ -184,11 +190,11 @@
mSpyAttentionManager.mIsServiceEnabled = true;
doReturn(true).when(mSpyAttentionManager).isServiceAvailable();
doReturn(true).when(mMockIPowerManager).isInteractive();
- mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal);
- verify(mMockProximityCallbackInternal, times(1))
+ mSpyAttentionManager.onStartProximityUpdates(mMockProximityUpdateCallbackInternal);
+ verify(mMockProximityUpdateCallbackInternal, times(1))
.onProximityUpdate(PROXIMITY_SUCCESS_STATE);
- ProximityCallbackInternal mismatchedCallback = new ProximityCallbackInternal() {
+ ProximityUpdateCallbackInternal mismatchedCallback = new ProximityUpdateCallbackInternal() {
@Override
public void onProximityUpdate(double distance) {
fail("Callback shouldn't have responded.");
@@ -196,7 +202,7 @@
};
mSpyAttentionManager.onStopProximityUpdates(mismatchedCallback);
- verifyNoMoreInteractions(mMockProximityCallbackInternal);
+ verifyNoMoreInteractions(mMockProximityUpdateCallbackInternal);
}
@Test
@@ -205,8 +211,8 @@
mSpyAttentionManager.mIsServiceEnabled = true;
doReturn(true).when(mSpyAttentionManager).isServiceAvailable();
doReturn(true).when(mMockIPowerManager).isInteractive();
- mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal);
- mSpyAttentionManager.onStopProximityUpdates(mMockProximityCallbackInternal);
+ mSpyAttentionManager.onStartProximityUpdates(mMockProximityUpdateCallbackInternal);
+ mSpyAttentionManager.onStopProximityUpdates(mMockProximityUpdateCallbackInternal);
assertThat(mSpyAttentionManager.mCurrentProximityUpdate).isNull();
}
@@ -217,14 +223,14 @@
mSpyAttentionManager.mIsServiceEnabled = true;
doReturn(true).when(mSpyAttentionManager).isServiceAvailable();
doReturn(true).when(mMockIPowerManager).isInteractive();
- mSpyAttentionManager.onStartProximityUpdates(mMockProximityCallbackInternal);
- verify(mMockProximityCallbackInternal, times(1))
+ mSpyAttentionManager.onStartProximityUpdates(mMockProximityUpdateCallbackInternal);
+ verify(mMockProximityUpdateCallbackInternal, times(1))
.onProximityUpdate(PROXIMITY_SUCCESS_STATE);
// Attention Service unregisters the proximity update twice in a row.
- mSpyAttentionManager.onStopProximityUpdates(mMockProximityCallbackInternal);
- mSpyAttentionManager.onStopProximityUpdates(mMockProximityCallbackInternal);
- verifyNoMoreInteractions(mMockProximityCallbackInternal);
+ mSpyAttentionManager.onStopProximityUpdates(mMockProximityUpdateCallbackInternal);
+ mSpyAttentionManager.onStopProximityUpdates(mMockProximityUpdateCallbackInternal);
+ verifyNoMoreInteractions(mMockProximityUpdateCallbackInternal);
}
@Test
@@ -337,7 +343,8 @@
public void cancelAttentionCheck(IAttentionCallback callback) {
}
- public void onStartProximityUpdates(IProximityCallback callback) throws RemoteException {
+ public void onStartProximityUpdates(IProximityUpdateCallback callback)
+ throws RemoteException {
callback.onProximityUpdate(PROXIMITY_SUCCESS_STATE);
}
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
index 2ae2854..9aac81c 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
@@ -361,6 +361,16 @@
}
@Test
+ public void close_cleanVirtualAudioController() {
+ mDeviceImpl.onVirtualDisplayCreatedLocked(DISPLAY_ID);
+ mDeviceImpl.onAudioSessionStarting(DISPLAY_ID, mCallback);
+
+ mDeviceImpl.close();
+
+ assertThat(mDeviceImpl.getVirtualAudioControllerForTesting()).isNull();
+ }
+
+ @Test
public void sendKeyEvent_noFd() {
assertThrows(
IllegalArgumentException.class,
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
index bdf94f3..356600d 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
@@ -33,6 +33,7 @@
import android.content.IntentFilter;
import android.content.pm.ParceledListSlice;
import android.database.ContentObserver;
+import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.display.AmbientBrightnessDayStats;
@@ -42,6 +43,7 @@
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayedContentSample;
import android.hardware.display.DisplayedContentSamplingAttributes;
+import android.hardware.input.InputSensorInfo;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.HandlerThread;
@@ -63,6 +65,8 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -84,8 +88,11 @@
private static final String DEFAULT_DISPLAY_ID = "123";
private static final float FLOAT_DELTA = 0.01f;
+ @Mock private InputSensorInfo mInputSensorInfoMock;
+
private BrightnessTracker mTracker;
private TestInjector mInjector;
+ private Sensor mLightSensorFake;
private static Object sHandlerLock = new Object();
private static Handler sHandler;
@@ -108,9 +115,12 @@
@Before
public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
mInjector = new TestInjector(ensureHandler());
+ mLightSensorFake = new Sensor(mInputSensorInfoMock);
mTracker = new BrightnessTracker(InstrumentationRegistry.getContext(), mInjector);
+ mTracker.setLightSensor(mLightSensorFake);
mDefaultNightModeColorTemperature =
InstrumentationRegistry.getContext().getResources().getInteger(
R.integer.config_nightDisplayColorTemperatureDefault);
@@ -834,6 +844,47 @@
mTracker.stop();
}
+ @Test
+ public void testLightSensorChange() {
+ // verify the tracker started correctly and a listener registered
+ startTracker(mTracker);
+ assertNotNull(mInjector.mSensorListener);
+ assertEquals(mInjector.mLightSensor, mLightSensorFake);
+
+ // Setting the sensor to null should stop the registered listener.
+ mTracker.setLightSensor(null);
+ mInjector.waitForHandler();
+ assertNull(mInjector.mSensorListener);
+ assertNull(mInjector.mLightSensor);
+
+ // Resetting sensor should start listener again
+ mTracker.setLightSensor(mLightSensorFake);
+ mInjector.waitForHandler();
+ assertNotNull(mInjector.mSensorListener);
+ assertEquals(mInjector.mLightSensor, mLightSensorFake);
+
+ Sensor secondSensor = new Sensor(mInputSensorInfoMock);
+ // Setting a different listener should keep things working
+ mTracker.setLightSensor(secondSensor);
+ mInjector.waitForHandler();
+ assertNotNull(mInjector.mSensorListener);
+ assertEquals(mInjector.mLightSensor, secondSensor);
+ }
+
+ @Test
+ public void testSetLightSensorDoesntStartListener() {
+ mTracker.setLightSensor(mLightSensorFake);
+ assertNull(mInjector.mSensorListener);
+ }
+
+ @Test
+ public void testNullLightSensorWontRegister() {
+ mTracker.setLightSensor(null);
+ startTracker(mTracker);
+ assertNull(mInjector.mSensorListener);
+ assertNull(mInjector.mLightSensor);
+ }
+
private InputStream getInputStream(String data) {
return new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
}
@@ -924,6 +975,7 @@
private class TestInjector extends BrightnessTracker.Injector {
SensorEventListener mSensorListener;
+ Sensor mLightSensor;
BroadcastReceiver mBroadcastReceiver;
DisplayManager.DisplayListener mDisplayListener;
Map<String, Integer> mSecureIntSettings = new HashMap<>();
@@ -974,14 +1026,16 @@
@Override
public void registerSensorListener(Context context,
- SensorEventListener sensorListener, Handler handler) {
+ SensorEventListener sensorListener, Sensor lightSensor, Handler handler) {
mSensorListener = sensorListener;
+ mLightSensor = lightSensor;
}
@Override
public void unregisterSensorListener(Context context,
SensorEventListener sensorListener) {
mSensorListener = null;
+ mLightSensor = null;
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
index 2f5993d1..5d3da43 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -132,7 +132,12 @@
@Test
public void testGetApexSystemServices() throws RemoteException {
- when(mApexService.getAllPackages()).thenReturn(createApexInfoForTestPkg(true, false));
+ when(mApexService.getAllPackages()).thenReturn(new ApexInfo[] {
+ createApexInfoForTestPkg(false, true, 1),
+ // only active apex reports apex-system-service
+ createApexInfoForTestPkg(true, false, 2),
+ });
+
mApexManager.scanApexPackagesTraced(mPackageParser2,
ParallelPackageParser.makeExecutorService());
@@ -484,17 +489,20 @@
assertThat(e).hasMessageThat().contains("Failed to collect certificates from ");
}
- private ApexInfo[] createApexInfoForTestPkg(boolean isActive, boolean isFactory) {
+ private ApexInfo createApexInfoForTestPkg(boolean isActive, boolean isFactory, int version) {
File apexFile = extractResource(TEST_APEX_PKG, TEST_APEX_FILE_NAME);
ApexInfo apexInfo = new ApexInfo();
apexInfo.isActive = isActive;
apexInfo.isFactory = isFactory;
apexInfo.moduleName = TEST_APEX_PKG;
apexInfo.modulePath = apexFile.getPath();
- apexInfo.versionCode = 191000070;
+ apexInfo.versionCode = version;
apexInfo.preinstalledModulePath = apexFile.getPath();
+ return apexInfo;
+ }
- return new ApexInfo[]{apexInfo};
+ private ApexInfo[] createApexInfoForTestPkg(boolean isActive, boolean isFactory) {
+ return new ApexInfo[]{createApexInfoForTestPkg(isActive, isFactory, 191000070)};
}
private ApexInfo createApexInfo(String moduleName, int versionCode, boolean isActive,
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index ea7804d..d99fbb1 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -2048,8 +2048,7 @@
protected List<ShortcutInfo> getShortcutAsLauncher(int targetUserId) {
final ShortcutQuery q = new ShortcutQuery();
- q.setQueryFlags(ShortcutQuery.FLAG_MATCH_DYNAMIC | ShortcutQuery.FLAG_MATCH_DYNAMIC
- | ShortcutQuery.FLAG_MATCH_PINNED);
+ q.setQueryFlags(ShortcutQuery.FLAG_MATCH_DYNAMIC | ShortcutQuery.FLAG_MATCH_PINNED);
return mLauncherApps.getShortcuts(q, UserHandle.of(targetUserId));
}
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index c94168c..1b92017 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -321,7 +321,7 @@
}
private void startSystem() {
- mService.systemReady();
+ mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
// Grab the BatteryReceiver
ArgumentCaptor<BatteryReceiver> batCaptor = ArgumentCaptor.forClass(BatteryReceiver.class);
@@ -439,7 +439,7 @@
@Test
public void testGetDesiredScreenPolicy_WithVR() {
createService();
- mService.systemReady();
+ startSystem();
// Brighten up the screen
mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_AWAKE, 0, 0, 0, 0,
null, null);
@@ -627,8 +627,7 @@
public void testWasDeviceIdleFor_true() {
int interval = 1000;
createService();
- mService.systemReady();
- mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+ startSystem();
mService.onUserActivity();
advanceTime(interval + 1 /* just a little more */);
assertThat(mService.wasDeviceIdleForInternal(interval)).isTrue();
@@ -638,8 +637,7 @@
public void testWasDeviceIdleFor_false() {
int interval = 1000;
createService();
- mService.systemReady();
- mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+ startSystem();
mService.onUserActivity();
assertThat(mService.wasDeviceIdleForInternal(interval)).isFalse();
}
@@ -647,8 +645,7 @@
@Test
public void testForceSuspend_putsDeviceToSleep() {
createService();
- mService.systemReady();
- mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+ startSystem();
// Verify that we start awake
assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
@@ -693,8 +690,7 @@
//
// TEST STARTS HERE
//
- mService.systemReady();
- mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+ startSystem();
// Verify that we start awake
assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
@@ -792,7 +788,7 @@
createService();
assertTrue(isAcquired[0]);
- mService.systemReady();
+ mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
assertTrue(isAcquired[0]);
mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
@@ -1231,7 +1227,7 @@
public void testQuiescentBoot_WakeKeyBeforeBootCompleted_AwakeAfterBootCompleted() {
when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), any())).thenReturn("1");
createService();
- mService.systemReady();
+ startSystem();
mService.getBinderServiceInstance().wakeUp(mClock.now(),
PowerManager.WAKE_REASON_UNKNOWN, "testing IPowerManager.wakeUp()", "pkg.name");
@@ -1444,7 +1440,7 @@
@Test
public void testSetPowerBoost_redirectsCallToNativeWrapper() {
createService();
- mService.systemReady();
+ startSystem();
mService.getBinderServiceInstance().setPowerBoost(Boost.INTERACTION, 1234);
@@ -1454,7 +1450,7 @@
@Test
public void testSetPowerMode_redirectsCallToNativeWrapper() {
createService();
- mService.systemReady();
+ startSystem();
// Enabled launch boost in BatterySaverController to allow setting launch mode.
when(mBatterySaverControllerMock.isLaunchBoostDisabled()).thenReturn(false);
@@ -1470,7 +1466,7 @@
@Test
public void testSetPowerMode_withLaunchBoostDisabledAndModeLaunch_ignoresCallToEnable() {
createService();
- mService.systemReady();
+ startSystem();
// Disables launch boost in BatterySaverController.
when(mBatterySaverControllerMock.isLaunchBoostDisabled()).thenReturn(true);
@@ -1486,7 +1482,7 @@
@Test
public void testSetPowerModeChecked_returnsNativeCallResult() {
createService();
- mService.systemReady();
+ startSystem();
// Disables launch boost in BatterySaverController.
when(mBatterySaverControllerMock.isLaunchBoostDisabled()).thenReturn(true);
@@ -1649,7 +1645,7 @@
@Test
public void testGetFullPowerSavePolicy_returnsStateMachineResult() {
createService();
- mService.systemReady();
+ startSystem();
BatterySaverPolicyConfig mockReturnConfig = new BatterySaverPolicyConfig.Builder().build();
when(mBatterySaverStateMachineMock.getFullBatterySaverPolicy())
.thenReturn(mockReturnConfig);
@@ -1664,7 +1660,7 @@
@Test
public void testSetFullPowerSavePolicy_callsStateMachine() {
createService();
- mService.systemReady();
+ startSystem();
BatterySaverPolicyConfig mockSetPolicyConfig =
new BatterySaverPolicyConfig.Builder().build();
when(mBatterySaverStateMachineMock.setFullBatterySaverPolicy(any())).thenReturn(true);
@@ -1678,7 +1674,7 @@
@Test
public void testLowPowerStandby_whenInactive_FgsWakeLockEnabled() {
createService();
- mService.systemReady();
+ startSystem();
WakeLock wakeLock = acquireWakeLock("fgsWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_FOREGROUND_SERVICE);
mService.setDeviceIdleModeInternal(true);
@@ -1689,7 +1685,7 @@
@Test
public void testLowPowerStandby_whenActive_FgsWakeLockDisabled() {
createService();
- mService.systemReady();
+ startSystem();
WakeLock wakeLock = acquireWakeLock("fgsWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_FOREGROUND_SERVICE);
mService.setDeviceIdleModeInternal(true);
@@ -1701,7 +1697,7 @@
@Test
public void testLowPowerStandby_whenActive_FgsWakeLockEnabledIfAllowlisted() {
createService();
- mService.systemReady();
+ startSystem();
WakeLock wakeLock = acquireWakeLock("fgsWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_FOREGROUND_SERVICE);
mService.setDeviceIdleModeInternal(true);
@@ -1714,7 +1710,7 @@
@Test
public void testLowPowerStandby_whenActive_BoundTopWakeLockDisabled() {
createService();
- mService.systemReady();
+ startSystem();
WakeLock wakeLock = acquireWakeLock("BoundTopWakeLock", PowerManager.PARTIAL_WAKE_LOCK);
mService.updateUidProcStateInternal(wakeLock.mOwnerUid, PROCESS_STATE_BOUND_TOP);
mService.setDeviceIdleModeInternal(true);
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
index 32fed3b..4519890 100644
--- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
@@ -252,7 +252,7 @@
int slotIndex = 1234;
TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
return new TelephonyTimeSuggestion.Builder(slotIndex)
- .setUtcTime(timeValue)
+ .setUnixEpochTime(timeValue)
.build();
}
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
index 0d5b5a5..2d9903f 100644
--- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
@@ -52,12 +52,12 @@
@RunWith(AndroidJUnit4.class)
public class TimeDetectorStrategyImplTest {
- private static final Instant TIME_LOWER_BOUND = createUtcTime(2009, 1, 1, 12, 0, 0);
+ private static final Instant TIME_LOWER_BOUND = createUnixEpochTime(2009, 1, 1, 12, 0, 0);
private static final TimestampedValue<Instant> ARBITRARY_CLOCK_INITIALIZATION_INFO =
new TimestampedValue<>(
123456789L /* realtimeClockMillis */,
- createUtcTime(2010, 5, 23, 12, 0, 0));
+ createUnixEpochTime(2010, 5, 23, 12, 0, 0));
// This is the traditional ordering for time detection on Android.
private static final @Origin int [] PROVIDERS_PRIORITY = { ORIGIN_TELEPHONY, ORIGIN_NETWORK };
@@ -66,7 +66,7 @@
* An arbitrary time, very different from the {@link #ARBITRARY_CLOCK_INITIALIZATION_INFO}
* time. Can be used as the basis for time suggestions.
*/
- private static final Instant ARBITRARY_TEST_TIME = createUtcTime(2018, 1, 1, 12, 0, 0);
+ private static final Instant ARBITRARY_TEST_TIME = createUnixEpochTime(2018, 1, 1, 12, 0, 0);
private static final int ARBITRARY_SLOT_INDEX = 123456;
@@ -91,7 +91,7 @@
.simulateTelephonyTimeSuggestion(timeSuggestion);
long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(timeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion.getUnixEpochTime());
mScript.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis)
.assertLatestTelephonySuggestion(slotIndex, timeSuggestion);
}
@@ -128,7 +128,7 @@
mScript.simulateTimePassing(clockIncrementMillis);
long expectedSystemClockMillis1 =
- mScript.calculateTimeInMillisForNow(timeSuggestion1.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion1.getUnixEpochTime());
mScript.simulateTelephonyTimeSuggestion(timeSuggestion1)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis1)
@@ -155,7 +155,7 @@
mScript.simulateTimePassing(clockIncrementMillis);
long expectedSystemClockMillis3 =
- mScript.calculateTimeInMillisForNow(timeSuggestion3.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion3.getUnixEpochTime());
mScript.simulateTelephonyTimeSuggestion(timeSuggestion3)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis3)
@@ -182,8 +182,8 @@
mScript.generateTelephonyTimeSuggestion(slotIndex2, slotIndex2Time);
mScript.simulateTimePassing();
- long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(slotIndex2TimeSuggestion.getUtcTime());
+ long expectedSystemClockMillis = mScript.calculateTimeInMillisForNow(
+ slotIndex2TimeSuggestion.getUnixEpochTime());
mScript.simulateTelephonyTimeSuggestion(slotIndex2TimeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis)
@@ -199,8 +199,8 @@
mScript.generateTelephonyTimeSuggestion(slotIndex1, slotIndex1Time);
mScript.simulateTimePassing();
- long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(slotIndex1TimeSuggestion.getUtcTime());
+ long expectedSystemClockMillis = mScript.calculateTimeInMillisForNow(
+ slotIndex1TimeSuggestion.getUnixEpochTime());
mScript.simulateTelephonyTimeSuggestion(slotIndex1TimeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis)
@@ -232,8 +232,8 @@
mScript.generateTelephonyTimeSuggestion(slotIndex2, slotIndex2Time);
mScript.simulateTimePassing();
- long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(slotIndex2TimeSuggestion.getUtcTime());
+ long expectedSystemClockMillis = mScript.calculateTimeInMillisForNow(
+ slotIndex2TimeSuggestion.getUnixEpochTime());
mScript.simulateTelephonyTimeSuggestion(slotIndex2TimeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis)
@@ -267,26 +267,27 @@
TelephonyTimeSuggestion timeSuggestion1 =
mScript.generateTelephonyTimeSuggestion(slotIndex, testTime);
- TimestampedValue<Long> utcTime1 = timeSuggestion1.getUtcTime();
+ TimestampedValue<Long> unixEpochTime1 = timeSuggestion1.getUnixEpochTime();
// Initialize the strategy / device with a time set from a telephony suggestion.
mScript.simulateTimePassing();
- long expectedSystemClockMillis1 = mScript.calculateTimeInMillisForNow(utcTime1);
+ long expectedSystemClockMillis1 = mScript.calculateTimeInMillisForNow(unixEpochTime1);
mScript.simulateTelephonyTimeSuggestion(timeSuggestion1)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis1)
.assertLatestTelephonySuggestion(slotIndex, timeSuggestion1);
- // The UTC time increment should be larger than the system clock update threshold so we
- // know it shouldn't be ignored for other reasons.
- long validUtcTimeMillis = utcTime1.getValue() + (2 * systemClockUpdateThreshold);
+ // The Unix epoch time increment should be larger than the system clock update threshold so
+ // we know it shouldn't be ignored for other reasons.
+ long validUnixEpochTimeMillis = unixEpochTime1.getValue()
+ + (2 * systemClockUpdateThreshold);
// Now supply a new signal that has an obviously bogus reference time : older than the last
// one.
- long referenceTimeBeforeLastSignalMillis = utcTime1.getReferenceTimeMillis() - 1;
- TimestampedValue<Long> utcTime2 = new TimestampedValue<>(
- referenceTimeBeforeLastSignalMillis, validUtcTimeMillis);
+ long referenceTimeBeforeLastSignalMillis = unixEpochTime1.getReferenceTimeMillis() - 1;
+ TimestampedValue<Long> unixEpochTime2 = new TimestampedValue<>(
+ referenceTimeBeforeLastSignalMillis, validUnixEpochTimeMillis);
TelephonyTimeSuggestion timeSuggestion2 =
- createTelephonyTimeSuggestion(slotIndex, utcTime2);
+ createTelephonyTimeSuggestion(slotIndex, unixEpochTime2);
mScript.simulateTelephonyTimeSuggestion(timeSuggestion2)
.verifySystemClockWasNotSetAndResetCallTracking()
.assertLatestTelephonySuggestion(slotIndex, timeSuggestion1);
@@ -294,22 +295,22 @@
// Now supply a new signal that has an obviously bogus reference time : substantially in the
// future.
long referenceTimeInFutureMillis =
- utcTime1.getReferenceTimeMillis() + Integer.MAX_VALUE + 1;
- TimestampedValue<Long> utcTime3 = new TimestampedValue<>(
- referenceTimeInFutureMillis, validUtcTimeMillis);
+ unixEpochTime1.getReferenceTimeMillis() + Integer.MAX_VALUE + 1;
+ TimestampedValue<Long> unixEpochTime3 = new TimestampedValue<>(
+ referenceTimeInFutureMillis, validUnixEpochTimeMillis);
TelephonyTimeSuggestion timeSuggestion3 =
- createTelephonyTimeSuggestion(slotIndex, utcTime3);
+ createTelephonyTimeSuggestion(slotIndex, unixEpochTime3);
mScript.simulateTelephonyTimeSuggestion(timeSuggestion3)
.verifySystemClockWasNotSetAndResetCallTracking()
.assertLatestTelephonySuggestion(slotIndex, timeSuggestion1);
- // Just to prove validUtcTimeMillis is valid.
- long validReferenceTimeMillis = utcTime1.getReferenceTimeMillis() + 100;
- TimestampedValue<Long> utcTime4 = new TimestampedValue<>(
- validReferenceTimeMillis, validUtcTimeMillis);
- long expectedSystemClockMillis4 = mScript.calculateTimeInMillisForNow(utcTime4);
+ // Just to prove validUnixEpochTimeMillis is valid.
+ long validReferenceTimeMillis = unixEpochTime1.getReferenceTimeMillis() + 100;
+ TimestampedValue<Long> unixEpochTime4 = new TimestampedValue<>(
+ validReferenceTimeMillis, validUnixEpochTimeMillis);
+ long expectedSystemClockMillis4 = mScript.calculateTimeInMillisForNow(unixEpochTime4);
TelephonyTimeSuggestion timeSuggestion4 =
- createTelephonyTimeSuggestion(slotIndex, utcTime4);
+ createTelephonyTimeSuggestion(slotIndex, unixEpochTime4);
mScript.simulateTelephonyTimeSuggestion(timeSuggestion4)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis4)
.assertLatestTelephonySuggestion(slotIndex, timeSuggestion4);
@@ -344,7 +345,7 @@
Instant testTime = ARBITRARY_TEST_TIME;
TelephonyTimeSuggestion timeSuggestion1 =
mScript.generateTelephonyTimeSuggestion(slotIndex, testTime);
- TimestampedValue<Long> utcTime1 = timeSuggestion1.getUtcTime();
+ TimestampedValue<Long> unixEpochTime1 = timeSuggestion1.getUnixEpochTime();
// Simulate time passing.
mScript.simulateTimePassing(clockIncrementMillis);
@@ -358,7 +359,7 @@
// Simulate more time passing.
mScript.simulateTimePassing(clockIncrementMillis);
- long expectedSystemClockMillis1 = mScript.calculateTimeInMillisForNow(utcTime1);
+ long expectedSystemClockMillis1 = mScript.calculateTimeInMillisForNow(unixEpochTime1);
// Turn on auto time detection.
mScript.simulateAutoTimeDetectionToggle()
@@ -379,7 +380,7 @@
mScript.simulateTimePassing(clockIncrementMillis);
long expectedSystemClockMillis2 =
- mScript.calculateTimeInMillisForNow(timeSuggestion2.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion2.getUnixEpochTime());
// The new time, though valid, should not be set in the system clock because auto time is
// disabled.
@@ -406,7 +407,7 @@
mScript.simulateTimePassing();
long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(telephonySuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(telephonySuggestion.getUnixEpochTime());
mScript.simulateTelephonyTimeSuggestion(telephonySuggestion)
.verifySystemClockWasSetAndResetCallTracking(
expectedSystemClockMillis /* expectedNetworkBroadcast */)
@@ -416,7 +417,7 @@
assertEquals(telephonySuggestion, mScript.peekBestTelephonySuggestion());
// Simulate time passing, long enough that telephonySuggestion is now too old.
- mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_UTC_TIME_AGE_MILLIS);
+ mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_SUGGESTION_TIME_AGE_MILLIS);
// Look inside and check what the strategy considers the current best telephony suggestion.
// It should still be the, it's just no longer used.
@@ -435,7 +436,7 @@
mScript.simulateTimePassing();
long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(timeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion.getUnixEpochTime());
mScript.simulateManualTimeSuggestion(timeSuggestion, true /* expectedResult */)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis);
}
@@ -457,7 +458,7 @@
mScript.simulateTimePassing();
long expectedAutoClockMillis =
- mScript.calculateTimeInMillisForNow(telephonyTimeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(telephonyTimeSuggestion.getUnixEpochTime());
mScript.simulateTelephonyTimeSuggestion(telephonyTimeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(expectedAutoClockMillis)
.assertLatestTelephonySuggestion(slotIndex, telephonyTimeSuggestion);
@@ -480,7 +481,7 @@
mScript.simulateTimePassing();
long expectedManualClockMillis =
- mScript.calculateTimeInMillisForNow(manualTimeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(manualTimeSuggestion.getUnixEpochTime());
mScript.simulateManualTimeSuggestion(manualTimeSuggestion, true /* expectedResult */)
.verifySystemClockWasSetAndResetCallTracking(expectedManualClockMillis)
.assertLatestTelephonySuggestion(slotIndex, telephonyTimeSuggestion);
@@ -492,7 +493,7 @@
mScript.simulateAutoTimeDetectionToggle();
expectedAutoClockMillis =
- mScript.calculateTimeInMillisForNow(telephonyTimeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(telephonyTimeSuggestion.getUnixEpochTime());
mScript.verifySystemClockWasSetAndResetCallTracking(expectedAutoClockMillis)
.assertLatestTelephonySuggestion(slotIndex, telephonyTimeSuggestion);
@@ -540,7 +541,7 @@
mScript.simulateTimePassing();
long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(timeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion.getUnixEpochTime());
mScript.simulateNetworkTimeSuggestion(timeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis);
}
@@ -586,7 +587,7 @@
mScript.simulateTimePassing();
long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(timeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion.getUnixEpochTime());
mScript.simulateGnssTimeSuggestion(timeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis);
}
@@ -617,7 +618,7 @@
mScript.simulateTimePassing();
long expectedSystemClockMillis =
- mScript.calculateTimeInMillisForNow(timeSuggestion.getUtcTime());
+ mScript.calculateTimeInMillisForNow(timeSuggestion.getUnixEpochTime());
mScript.simulateExternalTimeSuggestion(timeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis);
}
@@ -671,7 +672,8 @@
mScript.simulateTimePassing(smallTimeIncrementMillis)
.simulateNetworkTimeSuggestion(networkTimeSuggestion1)
.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(networkTimeSuggestion1.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(
+ networkTimeSuggestion1.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestTelephonySuggestion(ARBITRARY_SLOT_INDEX, null)
@@ -690,7 +692,8 @@
mScript.simulateTimePassing(smallTimeIncrementMillis)
.simulateTelephonyTimeSuggestion(telephonyTimeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(telephonyTimeSuggestion.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(
+ telephonyTimeSuggestion.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestTelephonySuggestion(ARBITRARY_SLOT_INDEX, telephonyTimeSuggestion)
@@ -700,7 +703,7 @@
// Simulate some significant time passing: half the time allowed before a time signal
// becomes "too old to use".
- mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_UTC_TIME_AGE_MILLIS / 2)
+ mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_SUGGESTION_TIME_AGE_MILLIS / 2)
.verifySystemClockWasNotSetAndResetCallTracking();
// Now another network suggestion is made. Telephony suggestions are prioritized over
@@ -720,7 +723,7 @@
// Simulate some significant time passing: half the time allowed before a time signal
// becomes "too old to use". This should mean that telephonyTimeSuggestion is now too old to
// be used but networkTimeSuggestion2 is not.
- mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_UTC_TIME_AGE_MILLIS / 2);
+ mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_SUGGESTION_TIME_AGE_MILLIS / 2);
// NOTE: The TimeDetectorStrategyImpl doesn't set an alarm for the point when the last
// suggestion it used becomes too old: it requires a new suggestion or an auto-time toggle
@@ -743,7 +746,7 @@
// Verify the latest network time now wins.
mScript.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(networkTimeSuggestion2.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(networkTimeSuggestion2.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestTelephonySuggestion(ARBITRARY_SLOT_INDEX, telephonyTimeSuggestion)
@@ -774,7 +777,8 @@
mScript.simulateTimePassing(smallTimeIncrementMillis)
.simulateGnssTimeSuggestion(gnssTimeSuggestion1)
.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(gnssTimeSuggestion1.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(
+ gnssTimeSuggestion1.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestNetworkSuggestion(null)
@@ -793,7 +797,8 @@
mScript.simulateTimePassing(smallTimeIncrementMillis)
.simulateNetworkTimeSuggestion(networkTimeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(networkTimeSuggestion.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(
+ networkTimeSuggestion.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestNetworkSuggestion(networkTimeSuggestion)
@@ -803,7 +808,7 @@
// Simulate some significant time passing: half the time allowed before a time signal
// becomes "too old to use".
- mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_UTC_TIME_AGE_MILLIS / 2)
+ mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_SUGGESTION_TIME_AGE_MILLIS / 2)
.verifySystemClockWasNotSetAndResetCallTracking();
// Now another gnss suggestion is made. Network suggestions are prioritized over
@@ -823,7 +828,7 @@
// Simulate some significant time passing: half the time allowed before a time signal
// becomes "too old to use". This should mean that telephonyTimeSuggestion is now too old to
// be used but networkTimeSuggestion2 is not.
- mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_UTC_TIME_AGE_MILLIS / 2);
+ mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_SUGGESTION_TIME_AGE_MILLIS / 2);
// NOTE: The TimeDetectorStrategyImpl doesn't set an alarm for the point when the last
// suggestion it used becomes too old: it requires a new suggestion or an auto-time toggle
@@ -846,7 +851,7 @@
// Verify the latest gnss time now wins.
mScript.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(gnssTimeSuggestion2.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(gnssTimeSuggestion2.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestNetworkSuggestion(networkTimeSuggestion)
@@ -877,7 +882,8 @@
mScript.simulateTimePassing(smallTimeIncrementMillis)
.simulateExternalTimeSuggestion(externalTimeSuggestion1)
.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(externalTimeSuggestion1.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(
+ externalTimeSuggestion1.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestNetworkSuggestion(null)
@@ -896,7 +902,8 @@
mScript.simulateTimePassing(smallTimeIncrementMillis)
.simulateNetworkTimeSuggestion(networkTimeSuggestion)
.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(networkTimeSuggestion.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(
+ networkTimeSuggestion.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestNetworkSuggestion(networkTimeSuggestion)
@@ -906,7 +913,7 @@
// Simulate some significant time passing: half the time allowed before a time signal
// becomes "too old to use".
- mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_UTC_TIME_AGE_MILLIS / 2)
+ mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_SUGGESTION_TIME_AGE_MILLIS / 2)
.verifySystemClockWasNotSetAndResetCallTracking();
// Now another external suggestion is made. Network suggestions are prioritized over
@@ -926,7 +933,7 @@
// Simulate some significant time passing: half the time allowed before a time signal
// becomes "too old to use". This should mean that networkTimeSuggestion is now too old to
// be used but externalTimeSuggestion2 is not.
- mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_UTC_TIME_AGE_MILLIS / 2);
+ mScript.simulateTimePassing(TimeDetectorStrategyImpl.MAX_SUGGESTION_TIME_AGE_MILLIS / 2);
// NOTE: The TimeDetectorStrategyImpl doesn't set an alarm for the point when the last
// suggestion it used becomes too old: it requires a new suggestion or an auto-time toggle
@@ -949,7 +956,7 @@
// Verify the latest external time now wins.
mScript.verifySystemClockWasSetAndResetCallTracking(
- mScript.calculateTimeInMillisForNow(externalTimeSuggestion2.getUtcTime()));
+ mScript.calculateTimeInMillisForNow(externalTimeSuggestion2.getUnixEpochTime()));
// Check internal state.
mScript.assertLatestNetworkSuggestion(networkTimeSuggestion)
@@ -1438,11 +1445,11 @@
* reference time.
*/
ManualTimeSuggestion generateManualTimeSuggestion(Instant suggestedTime) {
- TimestampedValue<Long> utcTime =
+ TimestampedValue<Long> unixEpochTime =
new TimestampedValue<>(
mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
- return new ManualTimeSuggestion(utcTime);
+ return new ManualTimeSuggestion(unixEpochTime);
}
/**
@@ -1472,11 +1479,11 @@
* reference time.
*/
NetworkTimeSuggestion generateNetworkTimeSuggestion(Instant suggestedTime) {
- TimestampedValue<Long> utcTime =
+ TimestampedValue<Long> unixEpochTime =
new TimestampedValue<>(
mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
- return new NetworkTimeSuggestion(utcTime);
+ return new NetworkTimeSuggestion(unixEpochTime);
}
/**
@@ -1484,11 +1491,11 @@
* reference time.
*/
GnssTimeSuggestion generateGnssTimeSuggestion(Instant suggestedTime) {
- TimestampedValue<Long> utcTime =
+ TimestampedValue<Long> unixEpochTime =
new TimestampedValue<>(
mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
- return new GnssTimeSuggestion(utcTime);
+ return new GnssTimeSuggestion(unixEpochTime);
}
/**
@@ -1504,19 +1511,19 @@
* Calculates what the supplied time would be when adjusted for the movement of the fake
* elapsed realtime clock.
*/
- long calculateTimeInMillisForNow(TimestampedValue<Long> utcTime) {
- return TimeDetectorStrategy.getTimeAt(utcTime, peekElapsedRealtimeMillis());
+ long calculateTimeInMillisForNow(TimestampedValue<Long> unixEpochTime) {
+ return TimeDetectorStrategy.getTimeAt(unixEpochTime, peekElapsedRealtimeMillis());
}
}
private static TelephonyTimeSuggestion createTelephonyTimeSuggestion(int slotIndex,
- TimestampedValue<Long> utcTime) {
+ TimestampedValue<Long> unixEpochTime) {
return new TelephonyTimeSuggestion.Builder(slotIndex)
- .setUtcTime(utcTime)
+ .setUnixEpochTime(unixEpochTime)
.build();
}
- private static Instant createUtcTime(int year, int monthInYear, int day, int hourOfDay,
+ private static Instant createUnixEpochTime(int year, int monthInYear, int day, int hourOfDay,
int minute, int second) {
return LocalDateTime.of(year, monthInYear, day, hourOfDay, minute, second)
.toInstant(ZoneOffset.UTC);
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
index 020d9f8..e1a4989 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -100,7 +100,7 @@
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock
- private VibrationThread.VibrationCallbacks mThreadCallbacks;
+ private VibrationThread.VibratorManagerHooks mManagerHooks;
@Mock
private VibratorController.OnVibrationCompleteListener mControllerCallbacks;
@Mock
@@ -648,9 +648,9 @@
VibrationEffect.createOneShot(10, 100)));
verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
- verify(mThreadCallbacks, never()).prepareSyncedVibration(anyLong(), any());
- verify(mThreadCallbacks, never()).triggerSyncedVibration(anyLong());
- verify(mThreadCallbacks, never()).cancelSyncedVibration();
+ verify(mManagerHooks, never()).prepareSyncedVibration(anyLong(), any());
+ verify(mManagerHooks, never()).triggerSyncedVibration(anyLong());
+ verify(mManagerHooks, never()).cancelSyncedVibration();
}
@Test
@@ -807,8 +807,8 @@
mockVibrators(vibratorIds);
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
- when(mThreadCallbacks.prepareSyncedVibration(anyLong(), eq(vibratorIds))).thenReturn(true);
- when(mThreadCallbacks.triggerSyncedVibration(eq(vibrationId))).thenReturn(true);
+ when(mManagerHooks.prepareSyncedVibration(anyLong(), eq(vibratorIds))).thenReturn(true);
+ when(mManagerHooks.triggerSyncedVibration(eq(vibrationId))).thenReturn(true);
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 100)
@@ -823,9 +823,9 @@
waitForCompletion(thread);
long expectedCap = IVibratorManager.CAP_SYNC | IVibratorManager.CAP_PREPARE_COMPOSE;
- verify(mThreadCallbacks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mThreadCallbacks).triggerSyncedVibration(eq(vibrationId));
- verify(mThreadCallbacks, never()).cancelSyncedVibration();
+ verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
+ verify(mManagerHooks).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks, never()).cancelSyncedVibration();
verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
VibrationEffectSegment expected = expectedPrimitive(
@@ -840,8 +840,8 @@
mockVibrators(vibratorIds);
mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
mVibratorProviders.get(4).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
- when(mThreadCallbacks.prepareSyncedVibration(anyLong(), any())).thenReturn(true);
- when(mThreadCallbacks.triggerSyncedVibration(anyLong())).thenReturn(true);
+ when(mManagerHooks.prepareSyncedVibration(anyLong(), any())).thenReturn(true);
+ when(mManagerHooks.triggerSyncedVibration(anyLong())).thenReturn(true);
long vibrationId = 1;
VibrationEffect composed = VibrationEffect.startComposition()
@@ -863,9 +863,9 @@
| IVibratorManager.CAP_MIXED_TRIGGER_ON
| IVibratorManager.CAP_MIXED_TRIGGER_PERFORM
| IVibratorManager.CAP_MIXED_TRIGGER_COMPOSE;
- verify(mThreadCallbacks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mThreadCallbacks).triggerSyncedVibration(eq(vibrationId));
- verify(mThreadCallbacks, never()).cancelSyncedVibration();
+ verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
+ verify(mManagerHooks).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks, never()).cancelSyncedVibration();
verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
}
@@ -875,7 +875,7 @@
mockVibrators(vibratorIds);
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
- when(mThreadCallbacks.prepareSyncedVibration(anyLong(), any())).thenReturn(false);
+ when(mManagerHooks.prepareSyncedVibration(anyLong(), any())).thenReturn(false);
long vibrationId = 1;
CombinedVibration effect = CombinedVibration.startParallel()
@@ -886,9 +886,9 @@
waitForCompletion(thread);
long expectedCap = IVibratorManager.CAP_SYNC | IVibratorManager.CAP_PREPARE_ON;
- verify(mThreadCallbacks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mThreadCallbacks, never()).triggerSyncedVibration(eq(vibrationId));
- verify(mThreadCallbacks, never()).cancelSyncedVibration();
+ verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
+ verify(mManagerHooks, never()).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks, never()).cancelSyncedVibration();
assertEquals(Arrays.asList(expectedOneShot(10)),
mVibratorProviders.get(1).getEffectSegments());
@@ -903,8 +903,8 @@
int[] vibratorIds = new int[]{1, 2};
mockVibrators(vibratorIds);
mVibratorProviders.get(2).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
- when(mThreadCallbacks.prepareSyncedVibration(anyLong(), any())).thenReturn(true);
- when(mThreadCallbacks.triggerSyncedVibration(anyLong())).thenReturn(false);
+ when(mManagerHooks.prepareSyncedVibration(anyLong(), any())).thenReturn(true);
+ when(mManagerHooks.triggerSyncedVibration(anyLong())).thenReturn(false);
long vibrationId = 1;
CombinedVibration effect = CombinedVibration.startParallel()
@@ -919,9 +919,9 @@
| IVibratorManager.CAP_PREPARE_PERFORM
| IVibratorManager.CAP_MIXED_TRIGGER_ON
| IVibratorManager.CAP_MIXED_TRIGGER_PERFORM;
- verify(mThreadCallbacks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
- verify(mThreadCallbacks).triggerSyncedVibration(eq(vibrationId));
- verify(mThreadCallbacks).cancelSyncedVibration();
+ verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
+ verify(mManagerHooks).triggerSyncedVibration(eq(vibrationId));
+ verify(mManagerHooks).cancelSyncedVibration();
assertTrue(mVibratorProviders.get(1).getAmplitudes().isEmpty());
}
@@ -1161,9 +1161,9 @@
VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
// Vibration completed but vibrator not yet released.
- verify(mThreadCallbacks, timeout(TEST_TIMEOUT_MILLIS)).onVibrationCompleted(eq(vibrationId),
+ verify(mManagerHooks, timeout(TEST_TIMEOUT_MILLIS)).onVibrationCompleted(eq(vibrationId),
eq(Vibration.Status.FINISHED));
- verify(mThreadCallbacks, never()).onVibratorsReleased();
+ verify(mManagerHooks, never()).onVibrationThreadReleased();
// Thread still running ramp down.
assertTrue(thread.isAlive());
@@ -1177,9 +1177,9 @@
waitForCompletion(thread);
// Does not cancel already finished vibration, but releases vibrator.
- verify(mThreadCallbacks, never()).onVibrationCompleted(eq(vibrationId),
+ verify(mManagerHooks, never()).onVibrationCompleted(eq(vibrationId),
eq(Vibration.Status.CANCELLED));
- verify(mThreadCallbacks).onVibratorsReleased();
+ verify(mManagerHooks).onVibrationThreadReleased();
}
@Test
@@ -1300,7 +1300,7 @@
private VibrationThread startThreadAndDispatcher(Vibration vib) {
VibrationThread thread = new VibrationThread(vib, mVibrationSettings, mEffectAdapter,
- createVibratorControllers(), mWakeLock, mIBatteryStatsMock, mThreadCallbacks);
+ createVibratorControllers(), mWakeLock, mIBatteryStatsMock, mManagerHooks);
doAnswer(answer -> {
thread.vibratorComplete(answer.getArgument(0));
return null;
@@ -1380,8 +1380,8 @@
}
private void verifyCallbacksTriggered(long vibrationId, Vibration.Status expectedStatus) {
- verify(mThreadCallbacks).onVibrationCompleted(eq(vibrationId), eq(expectedStatus));
- verify(mThreadCallbacks).onVibratorsReleased();
+ verify(mManagerHooks).onVibrationCompleted(eq(vibrationId), eq(expectedStatus));
+ verify(mManagerHooks).onVibrationThreadReleased();
}
private final class TestLooperAutoDispatcher extends Thread {
diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
index a12bc3b..de81d6b 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
@@ -28,6 +28,8 @@
import static android.app.UiModeManager.PROJECTION_TYPE_AUTOMOTIVE;
import static android.app.UiModeManager.PROJECTION_TYPE_NONE;
+import static com.android.server.UiModeManagerService.SUPPORTED_NIGHT_MODE_CUSTOM_TYPES;
+
import static com.google.common.truth.Truth.assertThat;
import static junit.framework.TestCase.assertFalse;
@@ -295,6 +297,24 @@
}
@Test
+ public void setNightModeCustomType_customTypeUnknown_shouldThrow() throws RemoteException {
+ assertThrows(IllegalArgumentException.class,
+ () -> mService.setNightModeCustomType(MODE_NIGHT_CUSTOM_TYPE_UNKNOWN));
+ }
+
+ @Test
+ public void setNightModeCustomType_customTypeUnsupported_shouldThrow() throws RemoteException {
+ assertThrows(IllegalArgumentException.class,
+ () -> {
+ int maxSupportedCustomType = 0;
+ for (Integer supportedType : SUPPORTED_NIGHT_MODE_CUSTOM_TYPES) {
+ maxSupportedCustomType = Math.max(maxSupportedCustomType, supportedType);
+ }
+ mService.setNightModeCustomType(maxSupportedCustomType + 1);
+ });
+ }
+
+ @Test
public void setNightModeCustomType_bedtime_shouldHaveNoScreenOffRegistered()
throws RemoteException {
try {
@@ -777,7 +797,6 @@
}
-
@Test
public void customTime_darkThemeOn_beforeStartEnd() throws RemoteException {
LocalTime now = LocalTime.now();
@@ -1220,6 +1239,35 @@
verify(listener, never()).onProjectionStateChanged(anyInt(), any());
}
+ @Test
+ public void enableCarMode_failsForBogusPackageName() throws Exception {
+ when(mPackageManager.getPackageUidAsUser(eq(PACKAGE_NAME), anyInt()))
+ .thenReturn(TestInjector.CALLING_UID + 1);
+
+ assertThrows(SecurityException.class, () -> mService.enableCarMode(0, 0, PACKAGE_NAME));
+ assertThat(mService.getCurrentModeType()).isNotEqualTo(Configuration.UI_MODE_TYPE_CAR);
+ }
+
+ @Test
+ public void disableCarMode_failsForBogusPackageName() throws Exception {
+ when(mPackageManager.getPackageUidAsUser(eq(PACKAGE_NAME), anyInt()))
+ .thenReturn(TestInjector.CALLING_UID);
+ mService.enableCarMode(0, 0, PACKAGE_NAME);
+ assertThat(mService.getCurrentModeType()).isEqualTo(Configuration.UI_MODE_TYPE_CAR);
+ when(mPackageManager.getPackageUidAsUser(eq(PACKAGE_NAME), anyInt()))
+ .thenReturn(TestInjector.CALLING_UID + 1);
+
+ assertThrows(SecurityException.class,
+ () -> mService.disableCarModeByCallingPackage(0, PACKAGE_NAME));
+ assertThat(mService.getCurrentModeType()).isEqualTo(Configuration.UI_MODE_TYPE_CAR);
+
+ // Clean up
+ when(mPackageManager.getPackageUidAsUser(eq(PACKAGE_NAME), anyInt()))
+ .thenReturn(TestInjector.CALLING_UID);
+ mService.disableCarModeByCallingPackage(0, PACKAGE_NAME);
+ assertThat(mService.getCurrentModeType()).isNotEqualTo(Configuration.UI_MODE_TYPE_CAR);
+ }
+
private void requestAllPossibleProjectionTypes() throws RemoteException {
for (int i = 0; i < Integer.SIZE; ++i) {
mService.requestProjection(mBinder, 1 << i, PACKAGE_NAME);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
index 1126e1e..4b6183d 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
@@ -15,16 +15,22 @@
*/
package com.android.server.notification;
+import static android.os.UserHandle.USER_ALL;
import static android.os.UserHandle.USER_CURRENT;
+import static android.os.UserHandle.USER_NULL;
import static android.os.UserHandle.USER_SYSTEM;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
import android.app.Notification;
import android.os.UserHandle;
+import android.os.UserManager;
import android.service.notification.StatusBarNotification;
import android.test.suitebuilder.annotation.SmallTest;
@@ -35,6 +41,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
@@ -51,6 +58,8 @@
private static final int SIZE = 5;
private NotificationManagerService.Archive mArchive;
+ @Mock
+ private UserManager mUm;
@Before
public void setUp() {
@@ -59,6 +68,9 @@
mArchive = new NotificationManagerService.Archive(SIZE);
mArchive.updateHistoryEnabled(USER_SYSTEM, true);
mArchive.updateHistoryEnabled(USER_CURRENT, true);
+
+ when(mUm.getProfileIds(anyInt(), anyBoolean())).thenReturn(
+ new int[] {USER_CURRENT, USER_SYSTEM});
}
private StatusBarNotification getNotification(String pkg, int id, UserHandle user) {
@@ -70,7 +82,6 @@
pkg, pkg, id, null, 0, 0, n, user, null, System.currentTimeMillis());
}
-
@Test
public void testRecordAndRead() {
List<String> expected = new ArrayList<>();
@@ -81,7 +92,7 @@
mArchive.record(sbn, REASON_CANCEL);
}
- List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+ List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(mUm, SIZE, true));
assertThat(actual).hasSize(expected.size());
for (StatusBarNotification sbn : actual) {
assertThat(expected).contains(sbn.getKey());
@@ -89,6 +100,22 @@
}
@Test
+ public void testCrossUser() {
+ mArchive.record(getNotification("pkg", 1, UserHandle.of(USER_SYSTEM)), REASON_CANCEL);
+ mArchive.record(getNotification("pkg", 2, UserHandle.of(USER_CURRENT)), REASON_CANCEL);
+ mArchive.record(getNotification("pkg", 3, UserHandle.of(USER_ALL)), REASON_CANCEL);
+ mArchive.record(getNotification("pkg", 4, UserHandle.of(USER_NULL)), REASON_CANCEL);
+
+ List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(mUm, SIZE, true));
+ assertThat(actual).hasSize(3);
+ for (StatusBarNotification sbn : actual) {
+ if (sbn.getUserId() == USER_NULL) {
+ fail("leaked notification from wrong user");
+ }
+ }
+ }
+
+ @Test
public void testRecordAndRead_overLimit() {
List<String> expected = new ArrayList<>();
for (int i = 0; i < (SIZE * 2); i++) {
@@ -99,7 +126,8 @@
}
}
- List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray((SIZE * 2), true));
+ List<StatusBarNotification> actual = Arrays.asList(
+ mArchive.getArray(mUm, (SIZE * 2), true));
assertThat(actual).hasSize(expected.size());
for (StatusBarNotification sbn : actual) {
assertThat(expected).contains(sbn.getKey());
@@ -119,7 +147,7 @@
}
}
- List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+ List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(mUm, SIZE, true));
assertThat(actual).hasSize(expected.size());
for (StatusBarNotification sbn : actual) {
assertThat(expected).contains(sbn.getKey());
@@ -140,7 +168,7 @@
}
mArchive.updateHistoryEnabled(USER_CURRENT, false);
- List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+ List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(mUm, SIZE, true));
assertThat(actual).hasSize(expected.size());
for (StatusBarNotification sbn : actual) {
assertThat(expected).contains(sbn.getKey());
@@ -165,7 +193,7 @@
}
mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test0");
mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test" + (SIZE - 2));
- List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+ List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(mUm, SIZE, true));
assertThat(actual).hasSize(expected.size());
for (StatusBarNotification sbn : actual) {
assertThat(expected).contains(sbn.getKey());
@@ -215,7 +243,7 @@
fail("Concurrent modification exception");
}
- List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+ List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(mUm, SIZE, true));
assertThat(actual).hasSize(expected.size());
for (StatusBarNotification sbn : actual) {
assertThat(expected).contains(sbn.getKey());
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index dfcab2b..018a916 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -430,6 +430,7 @@
when(mPermissionPolicyInternal.canShowPermissionPromptForTask(
any(ActivityManager.RecentTaskInfo.class))).thenReturn(false);
mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
+ when(mUm.getProfileIds(0, false)).thenReturn(new int[]{0});
ActivityManager.AppTask task = mock(ActivityManager.AppTask.class);
List<ActivityManager.AppTask> taskList = new ArrayList<>();
@@ -7643,8 +7644,9 @@
waitForIdle();
// A notification exists for the given record
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
- assertEquals(1, notifsBefore.length);
+ List<StatusBarNotification> notifsBefore =
+ mBinderService.getAppActiveNotifications(PKG, nr.getSbn().getUserId()).getList();
+ assertEquals(1, notifsBefore.size());
reset(mPackageManager);
@@ -9131,4 +9133,33 @@
// make sure we don't bother if the migration is not enabled
assertThat(mService.getAllUsersNotificationPermissions()).isNull();
}
+
+ @Test
+ public void testGetActiveNotification_filtersUsers() throws Exception {
+ when(mUm.getProfileIds(0, false)).thenReturn(new int[]{0, 10});
+
+ NotificationRecord nr0 =
+ generateNotificationRecord(mTestNotificationChannel, 0);
+ mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ nr0.getSbn().getId(), nr0.getSbn().getNotification(), nr0.getSbn().getUserId());
+
+ NotificationRecord nr10 =
+ generateNotificationRecord(mTestNotificationChannel, 10);
+ mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag10",
+ nr10.getSbn().getId(), nr10.getSbn().getNotification(), nr10.getSbn().getUserId());
+
+ NotificationRecord nr11 =
+ generateNotificationRecord(mTestNotificationChannel, 11);
+ mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag11",
+ nr11.getSbn().getId(), nr11.getSbn().getNotification(), nr11.getSbn().getUserId());
+ waitForIdle();
+
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ assertEquals(2, notifs.length);
+ for (StatusBarNotification sbn : notifs) {
+ if (sbn.getUserId() == 11) {
+ fail("leaked data across users");
+ }
+ }
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java
index d922f40..5a6ca6d 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java
@@ -293,6 +293,7 @@
LocalServices.removeServiceForTest(PackageManagerInternal.class);
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
mContext.addMockSystemService(Context.ALARM_SERVICE, mAlarmManager);
+ when(mUm.getProfileIds(0, false)).thenReturn(new int[]{0});
doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any());
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
index b71323b4..a24ba0d 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
@@ -221,6 +221,8 @@
@Test
public void testSetNotificationPermission_grantUserSet() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
mPermissionHelper.setNotificationPermission("pkg", 10, true, true);
verify(mPermManager).grantRuntimePermission(
@@ -232,9 +234,12 @@
@Test
public void testSetNotificationPermission_grantReviewRequired() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
+
mPermissionHelper.setNotificationPermission("pkg", 10, true, false, true);
- verify(mPermManager).revokeRuntimePermission(
+ verify(mPermManager, never()).revokeRuntimePermission(
"pkg", Manifest.permission.POST_NOTIFICATIONS, 10, "PermissionHelper");
verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
FLAG_PERMISSION_REVIEW_REQUIRED, FLAG_PERMISSION_REVIEW_REQUIRED, true, 10);
@@ -242,11 +247,14 @@
@Test
public void testSetNotificationPermission_pkgPerm_grantReviewRequired() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
+
PermissionHelper.PackagePermission pkgPerm = new PermissionHelper.PackagePermission(
"pkg", 10, true, false);
mPermissionHelper.setNotificationPermission(pkgPerm);
- verify(mPermManager).revokeRuntimePermission(
+ verify(mPermManager, never()).revokeRuntimePermission(
"pkg", Manifest.permission.POST_NOTIFICATIONS, 10, "PermissionHelper");
verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
FLAG_PERMISSION_REVIEW_REQUIRED, FLAG_PERMISSION_REVIEW_REQUIRED, true, 10);
@@ -255,6 +263,8 @@
@Test
public void testSetNotificationPermission_pkgPerm_notUserSet_grantedByDefaultPermNotSet()
throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
when(mPermManager.getPermissionFlags(anyString(),
eq(Manifest.permission.POST_NOTIFICATIONS),
anyInt())).thenReturn(FLAG_PERMISSION_GRANTED_BY_DEFAULT);
@@ -271,6 +281,8 @@
@Test
public void testSetNotificationPermission_pkgPerm_userSet_grantedByDefaultPermSet()
throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
when(mPermManager.getPermissionFlags(anyString(),
eq(Manifest.permission.POST_NOTIFICATIONS),
anyInt())).thenReturn(FLAG_PERMISSION_GRANTED_BY_DEFAULT);
@@ -287,6 +299,9 @@
@Test
public void testSetNotificationPermission_revokeUserSet() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_GRANTED);
+
mPermissionHelper.setNotificationPermission("pkg", 10, false, true);
verify(mPermManager).revokeRuntimePermission(
@@ -298,6 +313,9 @@
@Test
public void testSetNotificationPermission_grantNotUserSet() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
+
mPermissionHelper.setNotificationPermission("pkg", 10, true, false);
verify(mPermManager).grantRuntimePermission(
@@ -308,6 +326,9 @@
@Test
public void testSetNotificationPermission_revokeNotUserSet() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_GRANTED);
+
mPermissionHelper.setNotificationPermission("pkg", 10, false, false);
verify(mPermManager).revokeRuntimePermission(
@@ -343,6 +364,26 @@
}
@Test
+ public void testSetNotificationPermission_alreadyGrantedNotRegranted() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_GRANTED);
+ mPermissionHelper.setNotificationPermission("pkg", 10, true, false);
+
+ verify(mPermManager, never()).grantRuntimePermission(
+ "pkg", Manifest.permission.POST_NOTIFICATIONS, 10);
+ }
+
+ @Test
+ public void testSetNotificationPermission_alreadyRevokedNotRerevoked() throws Exception {
+ when(mPmi.checkPermission(anyString(), anyString(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
+ mPermissionHelper.setNotificationPermission("pkg", 10, false, false);
+
+ verify(mPermManager, never()).revokeRuntimePermission(
+ eq("pkg"), eq(Manifest.permission.POST_NOTIFICATIONS), eq(10), anyString());
+ }
+
+ @Test
public void testIsPermissionFixed() throws Exception {
when(mPermManager.getPermissionFlags(anyString(),
eq(Manifest.permission.POST_NOTIFICATIONS),
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
index 0552a83..c12f0a9 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
@@ -274,7 +274,7 @@
new ValidateNotificationPeople().searchContactsAndLookupNumbers(mockContext, lookupUri);
verify(mockContentResolver, never()).query(
eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI),
- eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }),
+ eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION),
contains(ContactsContract.Contacts.LOOKUP_KEY),
any(), // selection args
isNull()); // sort order
@@ -308,7 +308,7 @@
// in the case of a phone lookup, return null cursor; that's not an error case
// and we're not checking the actual storing of the phone data here.
when(mockContentResolver.query(eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI),
- eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }),
+ eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION),
contains(ContactsContract.Contacts.LOOKUP_KEY),
any(), isNull())).thenReturn(null);
@@ -317,7 +317,7 @@
new ValidateNotificationPeople().searchContactsAndLookupNumbers(mockContext, lookupUri);
verify(mockContentResolver, times(1)).query(
eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI),
- eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }),
+ eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION),
contains(ContactsContract.Contacts.LOOKUP_KEY),
eq(new String[] { "testlookupkey" }), // selection args
isNull()); // sort order
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java b/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
index 184ea52..fe1ea0d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
@@ -33,6 +33,7 @@
import android.app.ActivityOptions;
import android.app.Instrumentation;
import android.app.Instrumentation.ActivityMonitor;
+import android.app.PictureInPictureParams;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -40,6 +41,7 @@
import android.os.Bundle;
import android.os.IBinder;
import android.platform.test.annotations.Presubmit;
+import android.util.Rational;
import android.view.SurfaceControl;
import android.window.TaskOrganizer;
@@ -91,6 +93,20 @@
}
@Test
+ public void testMakeLaunchIntoPip() {
+ // Construct some params with set values
+ PictureInPictureParams params = new PictureInPictureParams.Builder()
+ .setAspectRatio(new Rational(1, 1))
+ .build();
+ // Construct ActivityOptions via makeLaunchIntoPip
+ ActivityOptions opts = ActivityOptions.makeLaunchIntoPip(params);
+
+ // Verify the params in ActivityOptions has the right flag being turned on
+ assertNotNull(opts.getLaunchIntoPipParams());
+ assertTrue(opts.isLaunchIntoPip());
+ }
+
+ @Test
public void testTransferLaunchCookie() {
final Binder cookie = new Binder();
final ActivityOptions options = ActivityOptions.makeBasic();
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 043bc07..ffc10d7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -109,6 +109,7 @@
import android.app.ActivityOptions;
import android.app.ICompatCameraControlCallback;
+import android.app.PictureInPictureParams;
import android.app.servertransaction.ActivityConfigurationChangeItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.DestroyActivityItem;
@@ -2200,6 +2201,20 @@
assertFalse(activity.supportsPictureInPicture());
}
+ @Test
+ public void testLaunchIntoPip() {
+ final PictureInPictureParams params = new PictureInPictureParams.Builder()
+ .build();
+ final ActivityOptions opts = ActivityOptions.makeLaunchIntoPip(params);
+ final ActivityRecord activity = new ActivityBuilder(mAtm)
+ .setLaunchIntoPipActivityOptions(opts)
+ .build();
+
+ // Verify the pictureInPictureArgs is set on the new Activity
+ assertNotNull(activity.pictureInPictureArgs);
+ assertTrue(activity.pictureInPictureArgs.isLaunchIntoPip());
+ }
+
private void verifyProcessInfoUpdate(ActivityRecord activity, State state,
boolean shouldUpdate, boolean activityChange) {
reset(activity.app);
@@ -3044,7 +3059,7 @@
mDisplayContent.setImeLayeringTarget(app);
mDisplayContent.updateImeInputAndControlTarget(app);
- InsetsState state = mDisplayContent.getInsetsPolicy().getInsetsForWindow(app);
+ InsetsState state = app.getInsetsState();
assertFalse(state.getSource(ITYPE_IME).isVisible());
assertTrue(state.getSource(ITYPE_IME).getFrame().isEmpty());
@@ -3064,7 +3079,7 @@
// Verify when IME is visible and the app can receive the right IME insets from policy.
makeWindowVisibleAndDrawn(app, mImeWindow);
- state = mDisplayContent.getInsetsPolicy().getInsetsForWindow(app);
+ state = app.getInsetsState();
assertTrue(state.getSource(ITYPE_IME).isVisible());
assertEquals(state.getSource(ITYPE_IME).getFrame(), imeSource.getFrame());
}
@@ -3076,7 +3091,7 @@
final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1");
final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2");
- mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_IME).setWindow(
+ mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_IME).setWindowContainer(
mImeWindow, null, null);
mImeWindow.getControllableInsetProvider().setServerVisible(true);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index c8e48a4..87abc53 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -39,6 +39,7 @@
import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
+import static android.os.Process.SYSTEM_UID;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.clearInvocations;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
@@ -68,6 +69,7 @@
import android.app.ActivityOptions;
import android.app.IApplicationThread;
+import android.app.PictureInPictureParams;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -1141,6 +1143,34 @@
}
@Test
+ public void testStartActivityInner_inTaskFragment_allowedForSystemUid() {
+ final ActivityStarter starter = prepareStarter(0, false);
+ final ActivityRecord targetRecord = new ActivityBuilder(mAtm).build();
+ final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).setCreateTask(true).build();
+ final TaskFragment taskFragment = new TaskFragment(mAtm, sourceRecord.token,
+ true /* createdByOrganizer */);
+ sourceRecord.getTask().addChild(taskFragment, POSITION_TOP);
+
+ taskFragment.setTaskFragmentOrganizer(mock(TaskFragmentOrganizerToken.class), SYSTEM_UID,
+ "system_uid");
+
+ starter.startActivityInner(
+ /* r */targetRecord,
+ /* sourceRecord */ sourceRecord,
+ /* voiceSession */null,
+ /* voiceInteractor */ null,
+ /* startFlags */ 0,
+ /* doResume */true,
+ /* options */null,
+ /* inTask */null,
+ /* inTaskFragment */ taskFragment,
+ /* restrictedBgActivity */false,
+ /* intentGrants */null);
+
+ assertTrue(taskFragment.hasChild());
+ }
+
+ @Test
public void testStartActivityInner_inTaskFragment_allowedForSameUid() {
final ActivityStarter starter = prepareStarter(0, false);
final ActivityRecord targetRecord = new ActivityBuilder(mAtm).build();
@@ -1264,4 +1294,36 @@
// Verify the cookie is updated
assertTrue(mRootWindowContainer.topRunningActivity().mLaunchCookie == newCookie);
}
+
+ @Test
+ public void testStartLaunchIntoPipActivity() {
+ final ActivityStarter starter = prepareStarter(0, false);
+
+ // Create an activity from ActivityOptions#makeLaunchIntoPip
+ final PictureInPictureParams params = new PictureInPictureParams.Builder()
+ .build();
+ final ActivityOptions opts = ActivityOptions.makeLaunchIntoPip(params);
+ ActivityRecord targetRecord = new ActivityBuilder(mAtm)
+ .setLaunchIntoPipActivityOptions(opts)
+ .build();
+
+ // Start the target launch-into-pip activity from a source
+ final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).setCreateTask(true).build();
+ starter.startActivityInner(
+ /* r */ targetRecord,
+ /* sourceRecord */ sourceRecord,
+ /* voiceSession */ null,
+ /* voiceInteractor */ null,
+ /* startFlags */ 0,
+ /* doResume */ true,
+ /* options */ opts,
+ /* inTask */ null,
+ /* inTaskFragment */ null,
+ /* restrictedBgActivity */ false,
+ /* intentGrants */ null);
+
+ // Verify the ActivityRecord#getLaunchIntoPipHostActivity points to sourceRecord.
+ assertThat(targetRecord.getLaunchIntoPipHostActivity()).isNotNull();
+ assertEquals(targetRecord.getLaunchIntoPipHostActivity(), sourceRecord);
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
index fb3a626..c21a5b6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.window.BackNavigationInfo.typeToString;
@@ -97,7 +98,7 @@
BackNavigationInfo backNavigationInfo =
mBackNavigationController.startBackNavigation(task, new StubTransaction());
assertThat(backNavigationInfo).isNotNull();
- assertThat(backNavigationInfo.getDepartingWindowContainer()).isNotNull();
+ assertThat(backNavigationInfo.getDepartingAnimationTarget()).isNotNull();
assertThat(backNavigationInfo.getScreenshotSurface()).isNotNull();
assertThat(backNavigationInfo.getScreenshotHardwareBuffer()).isNotNull();
assertThat(backNavigationInfo.getTaskWindowConfiguration()).isNotNull();
@@ -117,6 +118,9 @@
private Task createTopTaskWithActivity() {
Task task = createTask(mDefaultDisplay);
ActivityRecord record = createActivityRecord(task);
+ // enable OnBackInvokedCallbacks
+ record.info.applicationInfo.privateFlagsExt |=
+ PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK;
createWindow(null, FIRST_APPLICATION_WINDOW, record, "window");
when(record.mSurfaceControl.isValid()).thenReturn(true);
mAtm.setFocusedTask(task.mTaskId, record);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java
index 497ae1d..db22757 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java
@@ -258,11 +258,9 @@
.rotationForActivityInDifferentOrientation(eq(mWindow.mActivityRecord));
mWindow.mAboveInsetsState.set(
mDisplayContent.getInsetsStateController().getRawInsetsState());
- final Rect frame = mDisplayPolicy.getInsetsPolicy().getInsetsForWindow(mWindow)
- .getSource(ITYPE_STATUS_BAR).getFrame();
+ final Rect frame = mWindow.getInsetsState().getSource(ITYPE_STATUS_BAR).getFrame();
mDisplayContent.rotateInDifferentOrientationIfNeeded(mWindow.mActivityRecord);
- final Rect rotatedFrame = mDisplayPolicy.getInsetsPolicy().getInsetsForWindow(mWindow)
- .getSource(ITYPE_STATUS_BAR).getFrame();
+ final Rect rotatedFrame = mWindow.getInsetsState().getSource(ITYPE_STATUS_BAR).getFrame();
assertEquals(DISPLAY_WIDTH, frame.width());
assertEquals(DISPLAY_HEIGHT, rotatedFrame.width());
diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
index 5f96267..ca8481a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
@@ -71,7 +71,7 @@
public void testIsImeShowing() {
WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
makeWindowVisibleAndDrawn(ime);
- mImeProvider.setWindow(ime, null, null);
+ mImeProvider.setWindowContainer(ime, null, null);
WindowState target = createWindow(null, TYPE_APPLICATION, "app");
mDisplayContent.setImeLayeringTarget(target);
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
index 2987f94..c61b88b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
@@ -63,7 +63,7 @@
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
statusBar.getFrame().set(0, 0, 500, 100);
statusBar.mHasSurface = true;
- mProvider.setWindow(statusBar, null, null);
+ mProvider.setWindowContainer(statusBar, null, null);
mProvider.onPostLayout();
assertEquals(new Rect(0, 0, 500, 100), mProvider.getSource().getFrame());
assertEquals(Insets.of(0, 100, 0, 0),
@@ -80,7 +80,7 @@
ime.mGivenContentInsets.set(0, 0, 0, 60);
ime.mGivenVisibleInsets.set(0, 0, 0, 75);
ime.mHasSurface = true;
- mProvider.setWindow(ime, null, null);
+ mProvider.setWindowContainer(ime, null, null);
mProvider.onPostLayout();
assertEquals(new Rect(0, 0, 500, 40), mProvider.getSource().getFrame());
assertEquals(new Rect(0, 0, 500, 25), mProvider.getSource().getVisibleFrame());
@@ -95,10 +95,10 @@
public void testPostLayout_invisible() {
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
statusBar.getFrame().set(0, 0, 500, 100);
- mProvider.setWindow(statusBar, null, null);
+ mProvider.setWindowContainer(statusBar, null, null);
mProvider.onPostLayout();
assertEquals(Insets.NONE, mProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500),
- false /* ignoreVisibility */));
+ false /* ignoreVisibility */));
}
@Test
@@ -106,7 +106,7 @@
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
statusBar.getFrame().set(0, 0, 500, 100);
statusBar.mHasSurface = true;
- mProvider.setWindow(statusBar,
+ mProvider.setWindowContainer(statusBar,
(displayFrames, windowState, rect) -> {
rect.set(10, 10, 20, 20);
}, null);
@@ -126,7 +126,7 @@
assertNull(mProvider.getControlTarget());
// We can have the control or the control target after we have the insets source window.
- mProvider.setWindow(statusBar, null, null);
+ mProvider.setWindowContainer(statusBar, null, null);
mProvider.updateControlForTarget(target, false /* force */);
assertNotNull(mProvider.getControl(target));
assertNotNull(mProvider.getControlTarget());
@@ -164,7 +164,7 @@
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
statusBar.getFrame().set(0, 0, 500, 100);
- mProvider.setWindow(statusBar, null, null);
+ mProvider.setWindowContainer(statusBar, null, null);
mProvider.updateControlForFakeTarget(target);
assertNotNull(mProvider.getControl(target));
assertNull(mProvider.getControl(target).getLeash());
@@ -178,7 +178,7 @@
inputMethod.getFrame().set(new Rect(0, 400, 500, 500));
- mImeProvider.setWindow(inputMethod, null, null);
+ mImeProvider.setWindowContainer(inputMethod, null, null);
mImeProvider.setServerVisible(false);
mImeSource.setVisible(true);
mImeProvider.updateSourceFrame();
@@ -201,7 +201,7 @@
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
statusBar.getFrame().set(0, 0, 500, 100);
- mProvider.setWindow(statusBar, null, null);
+ mProvider.setWindowContainer(statusBar, null, null);
mProvider.updateControlForTarget(target, false /* force */);
final InsetsVisibilities requestedVisibilities = new InsetsVisibilities();
requestedVisibilities.setVisibility(ITYPE_STATUS_BAR, false);
@@ -215,7 +215,7 @@
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
statusBar.getFrame().set(0, 0, 500, 100);
- mProvider.setWindow(statusBar, null, null);
+ mProvider.setWindowContainer(statusBar, null, null);
final InsetsVisibilities requestedVisibilities = new InsetsVisibilities();
requestedVisibilities.setVisibility(ITYPE_STATUS_BAR, false);
target.setRequestedVisibilities(requestedVisibilities);
@@ -228,7 +228,7 @@
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
statusBar.getFrame().set(0, 0, 500, 100);
statusBar.mHasSurface = true;
- mProvider.setWindow(statusBar, null, null);
+ mProvider.setWindowContainer(statusBar, null, null);
mProvider.onPostLayout();
assertEquals(new Rect(0, 0, 500, 100), mProvider.getSource().getFrame());
// Still apply top insets if window overlaps even if it's top doesn't exactly match
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
index 2eece4c..c7a1b07 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -68,11 +68,14 @@
// IME cannot be the IME target.
ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
- getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
- assertNull(getController().getInsetsForWindow(navBar).peekSource(ITYPE_IME));
- assertNull(getController().getInsetsForWindow(navBar).peekSource(ITYPE_STATUS_BAR));
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(ime, null, null);
+
+ assertNull(navBar.getInsetsState().peekSource(ITYPE_IME));
+ assertNull(navBar.getInsetsState().peekSource(ITYPE_STATUS_BAR));
}
@Test
@@ -81,13 +84,15 @@
final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
app.setWindowingMode(WINDOWING_MODE_PINNED);
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_STATUS_BAR));
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_NAVIGATION_BAR));
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_IME));
+ assertNull(app.getInsetsState().peekSource(ITYPE_STATUS_BAR));
+ assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR));
+ assertNull(app.getInsetsState().peekSource(ITYPE_IME));
}
@Test
@@ -96,12 +101,14 @@
final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
app.setWindowingMode(WINDOWING_MODE_FREEFORM);
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_STATUS_BAR));
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_NAVIGATION_BAR));
+ assertNull(app.getInsetsState().peekSource(ITYPE_STATUS_BAR));
+ assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR));
}
@Test
@@ -110,19 +117,21 @@
final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
app.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
app.setAlwaysOnTop(true);
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_STATUS_BAR));
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_NAVIGATION_BAR));
+ assertNull(app.getInsetsState().peekSource(ITYPE_STATUS_BAR));
+ assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR));
}
@UseTestDisplay(addWindows = W_INPUT_METHOD)
@Test
public void testStripForDispatch_independentSources() {
- getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null);
final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1");
final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2");
@@ -130,34 +139,34 @@
app1.mAboveInsetsState.addSource(getController().getRawInsetsState().getSource(ITYPE_IME));
getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
- assertFalse(getController().getInsetsForWindow(app2).getSource(ITYPE_IME)
+ assertFalse(app2.getInsetsState().getSource(ITYPE_IME)
.isVisible());
- assertTrue(getController().getInsetsForWindow(app1).getSource(ITYPE_IME)
+ assertTrue(app1.getInsetsState().getSource(ITYPE_IME)
.isVisible());
}
@UseTestDisplay(addWindows = W_INPUT_METHOD)
@Test
public void testStripForDispatch_belowIme() {
- getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null);
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
app.mAboveInsetsState.getSource(ITYPE_IME).setVisible(true);
app.mAboveInsetsState.getSource(ITYPE_IME).setFrame(mImeWindow.getFrame());
getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
- assertTrue(getController().getInsetsForWindow(app).getSource(ITYPE_IME).isVisible());
+ assertTrue(app.getInsetsState().getSource(ITYPE_IME).isVisible());
}
@UseTestDisplay(addWindows = W_INPUT_METHOD)
@Test
public void testStripForDispatch_aboveIme() {
- getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null);
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
- assertFalse(getController().getInsetsForWindow(app).getSource(ITYPE_IME)
+ assertFalse(app.getInsetsState().getSource(ITYPE_IME)
.isVisible());
}
@@ -172,7 +181,7 @@
// Make IME and stay visible during the test.
mImeWindow.setHasSurface(true);
- getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null);
getController().onImeControlTargetChanged(mDisplayContent.getImeTarget(IME_TARGET_INPUT));
final InsetsVisibilities requestedVisibilities = new InsetsVisibilities();
requestedVisibilities.setVisibility(ITYPE_IME, true);
@@ -195,7 +204,7 @@
// app won't get visible IME insets while above IME even when IME is visible.
assertTrue(getController().getRawInsetsState().getSourceOrDefaultVisibility(ITYPE_IME));
- assertFalse(getController().getInsetsForWindow(app).getSource(ITYPE_IME)
+ assertFalse(app.getInsetsState().getSource(ITYPE_IME)
.isVisible());
// Reset invocation counter.
@@ -212,13 +221,13 @@
verify(app, atLeastOnce()).notifyInsetsChanged();
// app will get visible IME insets while below IME.
- assertTrue(getController().getInsetsForWindow(app).getSource(ITYPE_IME).isVisible());
+ assertTrue(app.getInsetsState().getSource(ITYPE_IME).isVisible());
}
@UseTestDisplay(addWindows = W_INPUT_METHOD)
@Test
public void testStripForDispatch_childWindow_altFocusable() {
- getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null);
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
final WindowState child = createWindow(app, TYPE_APPLICATION, "child");
@@ -231,15 +240,15 @@
mDisplayContent.applySurfaceChangesTransaction();
getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
- assertTrue(getController().getInsetsForWindow(app).getSource(ITYPE_IME).isVisible());
- assertFalse(getController().getInsetsForWindow(child).getSource(ITYPE_IME)
+ assertTrue(app.getInsetsState().getSource(ITYPE_IME).isVisible());
+ assertFalse(child.getInsetsState().getSource(ITYPE_IME)
.isVisible());
}
@UseTestDisplay(addWindows = W_INPUT_METHOD)
@Test
public void testStripForDispatch_childWindow_splitScreen() {
- getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null);
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
final WindowState child = createWindow(app, TYPE_APPLICATION, "child");
@@ -252,8 +261,8 @@
mDisplayContent.applySurfaceChangesTransaction();
getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
- assertTrue(getController().getInsetsForWindow(app).getSource(ITYPE_IME).isVisible());
- assertFalse(getController().getInsetsForWindow(child).getSource(ITYPE_IME)
+ assertTrue(app.getInsetsState().getSource(ITYPE_IME).isVisible());
+ assertFalse(child.getInsetsState().getSource(ITYPE_IME)
.isVisible());
}
@@ -267,14 +276,14 @@
InsetsSourceProvider statusBarProvider =
getController().getSourceProvider(ITYPE_STATUS_BAR);
- statusBarProvider.setWindow(statusBar, null, ((displayFrames, windowState, rect) ->
- rect.set(0, 1, 2, 3)));
- getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
+ statusBarProvider.setWindowContainer(statusBar, null, ((displayFrames, windowState, rect) ->
+ rect.set(0, 1, 2, 3)));
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(ime, null, null);
statusBar.setControllableInsetProvider(statusBarProvider);
statusBarProvider.onPostLayout();
- final InsetsState state = getController().getInsetsForWindow(ime);
+ final InsetsState state = ime.getInsetsState();
assertEquals(new Rect(0, 1, 2, 3), state.getSource(ITYPE_STATUS_BAR).getFrame());
}
@@ -285,10 +294,14 @@
final WindowState climateBar = createWindow(null, TYPE_APPLICATION, "climateBar");
final WindowState extraNavBar = createWindow(null, TYPE_APPLICATION, "extraNavBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
- getController().getSourceProvider(ITYPE_CLIMATE_BAR).setWindow(climateBar, null, null);
- getController().getSourceProvider(ITYPE_EXTRA_NAVIGATION_BAR).setWindow(extraNavBar, null,
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_CLIMATE_BAR).setWindowContainer(climateBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_EXTRA_NAVIGATION_BAR).setWindowContainer(
+ extraNavBar, null,
null);
getController().onBarControlTargetChanged(app, null, app, null);
InsetsSourceControl[] controls = getController().getControlsForDispatch(app);
@@ -299,7 +312,8 @@
public void testControlRevoked() {
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
getController().onBarControlTargetChanged(app, null, null, null);
assertNotNull(getController().getControlsForDispatch(app));
getController().onBarControlTargetChanged(null, null, null, null);
@@ -310,7 +324,8 @@
public void testControlRevoked_animation() {
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
getController().onBarControlTargetChanged(app, null, null, null);
assertNotNull(getController().getControlsForDispatch(app));
statusBar.cancelAnimation();
@@ -322,7 +337,7 @@
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
final InsetsSourceProvider provider = getController().getSourceProvider(ITYPE_STATUS_BAR);
- provider.setWindow(statusBar, null, null);
+ provider.setWindowContainer(statusBar, null, null);
final InsetsState rotatedState = new InsetsState(app.getInsetsState(),
true /* copySources */);
@@ -344,7 +359,8 @@
final WindowState statusBar = createTestWindow("statusBar");
final WindowState navBar = createTestWindow("navBar");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
assertNull(app.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR));
assertNull(statusBar.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR));
@@ -365,8 +381,10 @@
final WindowState statusBar = createTestWindow("statusBar");
final WindowState navBar = createTestWindow("navBar");
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
assertNull(app.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR));
assertNull(app.mAboveInsetsState.peekSource(ITYPE_NAVIGATION_BAR));
@@ -386,10 +404,12 @@
final WindowState statusBar = createTestWindow("statusBar");
final WindowState navBar = createTestWindow("navBar");
- getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
+ getController().getSourceProvider(ITYPE_IME).setWindowContainer(ime, null, null);
getController().getSourceProvider(ITYPE_IME).setClientVisible(true);
- getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
+ getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null,
+ null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
getController().updateAboveInsetsState(ime, false /* notifyInsetsChange */);
getController().updateAboveInsetsState(statusBar, false /* notifyInsetsChange */);
getController().updateAboveInsetsState(navBar, false /* notifyInsetsChange */);
@@ -420,11 +440,12 @@
@Test
public void testDispatchGlobalInsets() {
final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar");
- getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
+ getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null,
+ null);
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
- assertNull(getController().getInsetsForWindow(app).peekSource(ITYPE_NAVIGATION_BAR));
+ assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR));
app.mAttrs.receiveInsetsIgnoringZOrder = true;
- assertNotNull(getController().getInsetsForWindow(app).peekSource(ITYPE_NAVIGATION_BAR));
+ assertNotNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR));
}
private WindowState createTestWindow(String name) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java
index dcaa511..6128428 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java
@@ -24,8 +24,6 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.ActivityInfo.FLAG_RESUME_WHILE_PAUSING;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
@@ -87,7 +85,6 @@
import androidx.test.filters.SmallTest;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -499,42 +496,54 @@
assertTrue(pinnedRootTask.shouldBeVisible(null /* starting */));
}
- // TODO(b/199236198): check this is unnecessary or need to migrate after remove legacy split.
@Test
- @Ignore
public void testShouldBeVisible_SplitScreen() {
- // task not supporting split should be fullscreen for this test.
- final Task notSupportingSplitTask = createTaskForShouldBeVisibleTest(
+ // Fullscreen root task for this test.
+ final Task fullScreenRootTask = createTaskForShouldBeVisibleTest(
mDefaultTaskDisplayArea, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
true /* onTop */);
- doReturn(false).when(notSupportingSplitTask).supportsSplitScreenWindowingMode();
- final Task splitScreenPrimary = createTaskForShouldBeVisibleTest(mDefaultTaskDisplayArea,
- WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- final Task splitScreenSecondary = createTaskForShouldBeVisibleTest(mDefaultTaskDisplayArea,
- WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- // root task not supporting split shouldn't be visible if both halves of split-screen are
- // opaque.
+ final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm);
+ final Task splitScreenPrimary = createTaskForShouldBeVisibleTest(mDefaultTaskDisplayArea,
+ WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final Task splitScreenSecondary = createTaskForShouldBeVisibleTest(mDefaultTaskDisplayArea,
+ WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ organizer.putTaskToPrimary(splitScreenPrimary, true /* onTop */);
+ organizer.putTaskToSecondary(splitScreenSecondary, true /* onTop */);
+ splitScreenPrimary.moveToFront("testShouldBeVisible_SplitScreen");
+ splitScreenSecondary.moveToFront("testShouldBeVisible_SplitScreen");
+
+ // Fullscreen root task shouldn't be visible if both halves of split-screen are opaque.
+ doReturn(false).when(organizer.mPrimary).isTranslucent(any());
+ doReturn(false).when(organizer.mSecondary).isTranslucent(any());
doReturn(false).when(splitScreenPrimary).isTranslucent(any());
doReturn(false).when(splitScreenSecondary).isTranslucent(any());
- assertFalse(notSupportingSplitTask.shouldBeVisible(null /* starting */));
+ assertFalse(fullScreenRootTask.shouldBeVisible(null /* starting */));
+ assertTrue(organizer.mPrimary.shouldBeVisible(null /* starting */));
+ assertTrue(organizer.mSecondary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
- // root task not supporting split shouldn't be visible if one of the halves of split-screen
+ // Fullscreen root task shouldn't be visible if one of the halves of split-screen
// is translucent.
doReturn(true).when(splitScreenPrimary).isTranslucent(any());
- assertFalse(notSupportingSplitTask.shouldBeVisible(null /* starting */));
+ assertFalse(fullScreenRootTask.shouldBeVisible(null /* starting */));
+ assertTrue(organizer.mPrimary.shouldBeVisible(null /* starting */));
+ assertTrue(organizer.mSecondary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
final Task splitScreenSecondary2 = createTaskForShouldBeVisibleTest(mDefaultTaskDisplayArea,
- WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ organizer.putTaskToSecondary(splitScreenSecondary2, true /* onTop */);
// First split-screen secondary shouldn't be visible behind another opaque split-split
// secondary.
doReturn(false).when(splitScreenSecondary2).isTranslucent(any());
+ assertTrue(organizer.mSecondary.shouldBeVisible(null /* starting */));
assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
+ assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
+ organizer.mSecondary.getVisibility(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE,
splitScreenSecondary.getVisibility(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
@@ -543,8 +552,11 @@
// First split-screen secondary should be visible behind another translucent split-screen
// secondary.
doReturn(true).when(splitScreenSecondary2).isTranslucent(any());
+ assertTrue(organizer.mSecondary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
+ assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
+ organizer.mSecondary.getVisibility(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
splitScreenSecondary.getVisibility(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
@@ -556,6 +568,8 @@
// Split-screen root tasks shouldn't be visible behind an opaque fullscreen root task.
doReturn(false).when(assistantRootTask).isTranslucent(any());
assertTrue(assistantRootTask.shouldBeVisible(null /* starting */));
+ assertFalse(organizer.mPrimary.shouldBeVisible(null /* starting */));
+ assertFalse(organizer.mSecondary.shouldBeVisible(null /* starting */));
assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
assertFalse(splitScreenSecondary2.shouldBeVisible(null /* starting */));
@@ -571,51 +585,23 @@
// Split-screen root tasks should be visible behind a translucent fullscreen root task.
doReturn(true).when(assistantRootTask).isTranslucent(any());
assertTrue(assistantRootTask.shouldBeVisible(null /* starting */));
+ assertTrue(organizer.mPrimary.shouldBeVisible(null /* starting */));
+ assertTrue(organizer.mSecondary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
assistantRootTask.getVisibility(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
+ organizer.mPrimary.getVisibility(null /* starting */));
+ assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
+ organizer.mSecondary.getVisibility(null /* starting */));
+ assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
splitScreenPrimary.getVisibility(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
splitScreenSecondary.getVisibility(null /* starting */));
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
splitScreenSecondary2.getVisibility(null /* starting */));
-
- // Assistant root task shouldn't be visible behind translucent split-screen root task,
- // unless it is configured to show on top of everything.
- doReturn(false).when(assistantRootTask).isTranslucent(any());
- doReturn(true).when(splitScreenPrimary).isTranslucent(any());
- doReturn(true).when(splitScreenSecondary2).isTranslucent(any());
- splitScreenSecondary2.moveToFront("testShouldBeVisible_SplitScreen");
- splitScreenPrimary.moveToFront("testShouldBeVisible_SplitScreen");
-
- if (isAssistantOnTop()) {
- assertTrue(assistantRootTask.shouldBeVisible(null /* starting */));
- assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
- assertFalse(splitScreenSecondary2.shouldBeVisible(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
- assistantRootTask.getVisibility(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE,
- splitScreenPrimary.getVisibility(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE,
- splitScreenSecondary.getVisibility(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE,
- splitScreenSecondary2.getVisibility(null /* starting */));
- } else {
- assertFalse(assistantRootTask.shouldBeVisible(null /* starting */));
- assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
- assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE,
- assistantRootTask.getVisibility(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
- splitScreenPrimary.getVisibility(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE,
- splitScreenSecondary.getVisibility(null /* starting */));
- assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE,
- splitScreenSecondary2.getVisibility(null /* starting */));
- }
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index ee17f52..ba65104 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -251,7 +251,8 @@
ensureTaskPlacement(fullscreenTask, firstActivity, secondActivity);
// Move first activity to pinned root task.
- mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, "initialMove");
+ mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity,
+ null /* launchIntoPipHostActivity */, "initialMove");
final TaskDisplayArea taskDisplayArea = fullscreenTask.getDisplayArea();
Task pinnedRootTask = taskDisplayArea.getRootPinnedTask();
@@ -260,7 +261,8 @@
ensureTaskPlacement(fullscreenTask, secondActivity);
// Move second activity to pinned root task.
- mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "secondMove");
+ mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity,
+ null /* launchIntoPipHostActivity */, "secondMove");
// Need to get root tasks again as a new instance might have been created.
pinnedRootTask = taskDisplayArea.getRootPinnedTask();
@@ -291,7 +293,8 @@
// Move first activity to pinned root task.
- mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "initialMove");
+ mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity,
+ null /* launchIntoPipHostActivity */, "initialMove");
assertTrue(firstActivity.mRequestForceTransition);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index b815c38..7b38a95 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -31,6 +31,7 @@
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
@@ -2128,6 +2129,136 @@
APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE);
}
+ @Test
+ public void testIsEligibleForLetterboxEducation_educationNotEnabled_returnsFalse() {
+ setUpDisplaySizeWithApp(2500, 1000);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(false);
+
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+
+ assertFalse(mActivity.isEligibleForLetterboxEducation());
+ }
+
+ @Test
+ public void testIsEligibleForLetterboxEducation_notEligibleForFixedOrientation_returnsFalse() {
+ setUpDisplaySizeWithApp(1000, 2500);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(true);
+
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+
+ assertFalse(mActivity.isEligibleForLetterboxEducation());
+ }
+
+ @Test
+ public void testIsEligibleForLetterboxEducation_windowingModeMultiWindow_returnsFalse() {
+ // Support non resizable in multi window
+ mAtm.mDevEnableNonResizableMultiWindow = true;
+ setUpDisplaySizeWithApp(1000, 1200);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(true);
+ final TestSplitOrganizer organizer =
+ new TestSplitOrganizer(mAtm, mActivity.getDisplayContent());
+
+ // Non-resizable landscape activity
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+ final Rect originalBounds = new Rect(mActivity.getBounds());
+
+ // Move activity to split screen which takes half of the screen.
+ mTask.reparent(organizer.mPrimary, POSITION_TOP,
+ false /*moveParents*/, "test");
+ organizer.mPrimary.setBounds(0, 0, 1000, 600);
+
+ assertFalse(mActivity.isEligibleForLetterboxEducation());
+ assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode());
+ }
+
+ @Test
+ public void testIsEligibleForLetterboxEducation_fixedOrientationLandscape_returnsFalse() {
+ setUpDisplaySizeWithApp(1000, 2500);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(true);
+
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE);
+
+ assertFalse(mActivity.isEligibleForLetterboxEducation());
+ assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ }
+
+ @Test
+ public void testIsEligibleForLetterboxEducation_hasStartingWindow_returnsFalseUntilRemoved() {
+ setUpDisplaySizeWithApp(2500, 1000);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(true);
+
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+ mActivity.mStartingData = mock(StartingData.class);
+ mActivity.attachStartingWindow(
+ createWindowState(new WindowManager.LayoutParams(TYPE_APPLICATION_STARTING),
+ mActivity));
+
+ assertFalse(mActivity.isEligibleForLetterboxEducation());
+
+ // Verify that after removing the starting window isEligibleForLetterboxEducation returns
+ // true and mTask.dispatchTaskInfoChangedIfNeeded is called.
+ spyOn(mTask);
+ mActivity.removeStartingWindow();
+
+ assertTrue(mActivity.isEligibleForLetterboxEducation());
+ verify(mTask).dispatchTaskInfoChangedIfNeeded(true);
+ }
+
+ @Test
+ public void testIsEligibleForLetterboxEducation_hasStartingWindowAndEducationNotEnabled() {
+ setUpDisplaySizeWithApp(2500, 1000);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(false);
+
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+ mActivity.mStartingData = mock(StartingData.class);
+ mActivity.attachStartingWindow(
+ createWindowState(new WindowManager.LayoutParams(TYPE_APPLICATION_STARTING),
+ mActivity));
+
+ assertFalse(mActivity.isEligibleForLetterboxEducation());
+
+ // Verify that after removing the starting window isEligibleForLetterboxEducation still
+ // returns false and mTask.dispatchTaskInfoChangedIfNeeded isn't called.
+ spyOn(mTask);
+ mActivity.removeStartingWindow();
+
+ assertFalse(mActivity.isEligibleForLetterboxEducation());
+ verify(mTask, never()).dispatchTaskInfoChangedIfNeeded(true);
+ }
+
+ @Test
+ public void testIsEligibleForLetterboxEducation_letterboxedForFixedOrientation_returnsTrue() {
+ setUpDisplaySizeWithApp(2500, 1000);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(true);
+
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+
+ assertTrue(mActivity.isEligibleForLetterboxEducation());
+ assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ }
+
+ @Test
+ public void testIsEligibleForLetterboxEducation_sizeCompatAndEligibleForFixedOrientation() {
+ setUpDisplaySizeWithApp(1000, 2500);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setIsEducationEnabled(true);
+
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+
+ rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
+
+ assertTrue(mActivity.isEligibleForLetterboxEducation());
+ assertFalse(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ assertTrue(mActivity.inSizeCompatMode());
+ }
+
/**
* Tests that all three paths in which aspect ratio logic can be applied yield the same
* result, which is that aspect ratio is respected on app bounds. The three paths are
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
index a91298f..68e90e1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
@@ -46,6 +46,7 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.content.pm.PackageManager;
import android.os.Binder;
@@ -160,8 +161,7 @@
@Test
public void testDismissKeyguardCanWakeUp() {
doReturn(true).when(mWm).checkCallingPermission(anyString(), anyString());
- spyOn(mWm.mAtmInternal);
- doReturn(true).when(mWm.mAtmInternal).isDreaming();
+ doReturn(true).when(mWm.mAtmService).isDreaming();
doNothing().when(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString());
mWm.dismissKeyguard(null, "test-dismiss-keyguard");
verify(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString());
@@ -285,4 +285,32 @@
verify(mWm.mWindowContextListenerController, never()).registerWindowContainerListener(any(),
any(), anyInt(), anyInt(), any());
}
+
+ @Test
+ public void testSetInTouchMode_instrumentedProcessGetPermissionToSwitchTouchMode() {
+ boolean currentTouchMode = mWm.getInTouchMode();
+ int callingPid = Binder.getCallingPid();
+ int callingUid = Binder.getCallingUid();
+ doReturn(false).when(mWm).checkCallingPermission(anyString(), anyString());
+ when(mWm.mAtmService.isInstrumenting(callingPid)).thenReturn(true);
+
+ mWm.setInTouchMode(!currentTouchMode);
+
+ verify(mWm.mInputManager).setInTouchMode(
+ !currentTouchMode, callingPid, callingUid, /* hasPermission= */ true);
+ }
+
+ @Test
+ public void testSetInTouchMode_nonInstrumentedProcessDontGetPermissionToSwitchTouchMode() {
+ boolean currentTouchMode = mWm.getInTouchMode();
+ int callingPid = Binder.getCallingPid();
+ int callingUid = Binder.getCallingUid();
+ doReturn(false).when(mWm).checkCallingPermission(anyString(), anyString());
+ when(mWm.mAtmService.isInstrumenting(callingPid)).thenReturn(false);
+
+ mWm.setInTouchMode(!currentTouchMode);
+
+ verify(mWm.mInputManager).setInTouchMode(
+ !currentTouchMode, callingPid, callingUid, /* hasPermission= */ false);
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index 80192f7..459e3a5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -105,7 +105,7 @@
* Tests for the {@link WindowState} class.
*
* Build/Install/Run:
- * atest WmTests:WindowStateTests
+ * atest WmTests:WindowStateTests
*/
@SmallTest
@Presubmit
@@ -411,7 +411,7 @@
assertFalse(app.canAffectSystemUiFlags());
}
- @UseTestDisplay(addWindows = { W_ACTIVITY, W_STATUS_BAR })
+ @UseTestDisplay(addWindows = {W_ACTIVITY, W_STATUS_BAR})
@Test
public void testVisibleWithInsetsProvider() {
final WindowState statusBar = mStatusBarWindow;
@@ -419,7 +419,8 @@
statusBar.mHasSurface = true;
assertTrue(statusBar.isVisible());
mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_STATUS_BAR)
- .setWindow(statusBar, null /* frameProvider */, null /* imeFrameProvider */);
+ .setWindowContainer(statusBar, null /* frameProvider */,
+ null /* imeFrameProvider */);
mDisplayContent.getInsetsStateController().onBarControlTargetChanged(
app, null /* fakeTopControlling */, app, null /* fakeNavControlling */);
final InsetsVisibilities requestedVisibilities = new InsetsVisibilities();
@@ -623,7 +624,7 @@
assertEquals(w.getWindowConfiguration().getBounds(), unscaledClientBounds);
}
- @UseTestDisplay(addWindows = { W_ABOVE_ACTIVITY, W_NOTIFICATION_SHADE })
+ @UseTestDisplay(addWindows = {W_ABOVE_ACTIVITY, W_NOTIFICATION_SHADE})
@Test
public void testRequestDrawIfNeeded() {
final WindowState startingApp = createWindow(null /* parent */,
@@ -831,7 +832,7 @@
assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
}
- @UseTestDisplay(addWindows = { W_ACTIVITY, W_INPUT_METHOD })
+ @UseTestDisplay(addWindows = {W_ACTIVITY, W_INPUT_METHOD})
@Test
public void testNeedsRelativeLayeringToIme_startingWindow() {
WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING,
@@ -864,7 +865,7 @@
verify(app).notifyInsetsChanged();
}
- @UseTestDisplay(addWindows = { W_INPUT_METHOD, W_ACTIVITY })
+ @UseTestDisplay(addWindows = {W_INPUT_METHOD, W_ACTIVITY})
@Test
public void testImeAlwaysReceivesVisibleNavigationBarInsets() {
final InsetsSource navSource = new InsetsSource(ITYPE_NAVIGATION_BAR);
@@ -890,7 +891,7 @@
mDisplayContent.mInputMethodWindow = imeWindow;
final InsetsStateController controller = mDisplayContent.getInsetsStateController();
- controller.getImeSourceProvider().setWindow(imeWindow, null, null);
+ controller.getImeSourceProvider().setWindowContainer(imeWindow, null, null);
// Simulate app requests IME with updating all windows Insets State when IME is above app.
mDisplayContent.setImeLayeringTarget(app);
@@ -914,7 +915,7 @@
assertFalse(app2.getInsetsState().getSource(ITYPE_IME).isVisible());
}
- @UseTestDisplay(addWindows = { W_ACTIVITY })
+ @UseTestDisplay(addWindows = {W_ACTIVITY})
@Test
public void testUpdateImeControlTargetWhenLeavingMultiWindow() {
WindowState app = createWindow(null, TYPE_BASE_APPLICATION,
@@ -940,7 +941,7 @@
assertEquals(mAppWindow, mDisplayContent.getImeTarget(IME_TARGET_CONTROL).getWindow());
}
- @UseTestDisplay(addWindows = { W_ACTIVITY, W_INPUT_METHOD, W_NOTIFICATION_SHADE })
+ @UseTestDisplay(addWindows = {W_ACTIVITY, W_INPUT_METHOD, W_NOTIFICATION_SHADE})
@Test
public void testNotificationShadeHasImeInsetsWhenMultiWindow() {
WindowState app = createWindow(null, TYPE_BASE_APPLICATION,
@@ -954,7 +955,7 @@
mNotificationShadeWindow.setHasSurface(true);
mNotificationShadeWindow.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE;
assertTrue(mNotificationShadeWindow.canBeImeTarget());
- mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_IME).setWindow(
+ mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_IME).setWindowContainer(
mImeWindow, null, null);
mDisplayContent.computeImeTarget(true);
@@ -963,8 +964,7 @@
.setSourceVisible(ITYPE_IME, true);
// Verify notificationShade can still get IME insets even windowing mode is multi-window.
- InsetsState state = mDisplayContent.getInsetsStateController().getInsetsForWindow(
- mNotificationShadeWindow);
+ InsetsState state = mNotificationShadeWindow.getInsetsState();
assertNotNull(state.peekSource(ITYPE_IME));
assertTrue(state.getSource(ITYPE_IME).isVisible());
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 05eedcf..bd1f9d5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -941,6 +941,7 @@
private boolean mOnTop = false;
private ActivityInfo.WindowLayout mWindowLayout;
private boolean mVisible = true;
+ private ActivityOptions mLaunchIntoPipOpts;
ActivityBuilder(ActivityTaskManagerService service) {
mService = service;
@@ -1076,6 +1077,11 @@
return this;
}
+ ActivityBuilder setLaunchIntoPipActivityOptions(ActivityOptions opts) {
+ mLaunchIntoPipOpts = opts;
+ return this;
+ }
+
ActivityRecord build() {
SystemServicesTestRule.checkHoldsLock(mService.mGlobalLock);
try {
@@ -1132,7 +1138,9 @@
}
ActivityOptions options = null;
- if (mLaunchTaskBehind) {
+ if (mLaunchIntoPipOpts != null) {
+ options = mLaunchIntoPipOpts;
+ } else if (mLaunchTaskBehind) {
options = ActivityOptions.makeTaskLaunchBehind();
}
final ActivityRecord activity = new ActivityRecord.Builder(mService)
@@ -1539,6 +1547,9 @@
}
mPrimary.setBounds(primaryBounds);
mSecondary.setBounds(secondaryBounds);
+
+ spyOn(mPrimary);
+ spyOn(mSecondary);
}
TestSplitOrganizer(ActivityTaskManagerService service) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
index 74cff10..4b5f330a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
@@ -262,7 +262,7 @@
@Test
public void testSetInsetsFrozen_notAffectImeWindowState() {
// Pre-condition: make the IME window be controlled by IME insets provider.
- mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_IME).setWindow(
+ mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_IME).setWindowContainer(
mDisplayContent.mInputMethodWindow, null, null);
// Simulate an app window to be the IME layering target, assume the app window has no
diff --git a/services/translation/OWNERS b/services/translation/OWNERS
index a1e663a..440f9a8 100644
--- a/services/translation/OWNERS
+++ b/services/translation/OWNERS
@@ -1,8 +1,3 @@
# Bug component: 994311
-adamhe@google.com
-augale@google.com
-joannechung@google.com
-lpeter@google.com
-svetoslavganov@google.com
-tymtsai@google.com
+include /core/java/android/view/translation/OWNERS
diff --git a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
index 9f4fee8..364d592 100644
--- a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
+++ b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
@@ -24,6 +24,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -43,6 +44,7 @@
import android.view.translation.TranslationCapability;
import android.view.translation.TranslationContext;
import android.view.translation.TranslationSpec;
+import android.view.translation.UiTranslationController;
import android.view.translation.UiTranslationManager.UiTranslationState;
import android.view.translation.UiTranslationSpec;
@@ -253,7 +255,10 @@
try (TransferPipe tp = new TransferPipe()) {
activityTokens.getApplicationThread().dumpActivity(tp.getWriteFd(),
activityTokens.getActivityToken(), prefix,
- new String[]{"--translation"});
+ new String[] {
+ Activity.DUMP_ARG_DUMP_DUMPABLE,
+ UiTranslationController.DUMPABLE_NAME
+ });
tp.go(fd);
} catch (IOException e) {
pw.println(prefix + "Failure while dumping the activity: " + e);
diff --git a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java
index 27e8d69..ab8f69b 100644
--- a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java
+++ b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java
@@ -22,6 +22,7 @@
import android.annotation.ElapsedRealtimeLong;
import android.annotation.IntDef;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
@@ -39,6 +40,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
class BroadcastResponseStatsTracker {
private static final String TAG = "ResponseStatsTracker";
@@ -172,28 +175,27 @@
}
}
- @NonNull BroadcastResponseStats queryBroadcastResponseStats(int callingUid,
- @NonNull String packageName, long id, @UserIdInt int userId) {
- final BroadcastResponseStats aggregatedResponseStats =
- new BroadcastResponseStats(packageName);
+ @NonNull List<BroadcastResponseStats> queryBroadcastResponseStats(int callingUid,
+ @Nullable String packageName, @IntRange(from = 0) long id, @UserIdInt int userId) {
+ final List<BroadcastResponseStats> broadcastResponseStatsList = new ArrayList<>();
synchronized (mLock) {
final SparseArray<UserBroadcastResponseStats> responseStatsForCaller =
mUserResponseStats.get(callingUid);
if (responseStatsForCaller == null) {
- return aggregatedResponseStats;
+ return broadcastResponseStatsList;
}
final UserBroadcastResponseStats responseStatsForUser =
responseStatsForCaller.get(userId);
if (responseStatsForUser == null) {
- return aggregatedResponseStats;
+ return broadcastResponseStatsList;
}
- responseStatsForUser.aggregateBroadcastResponseStats(aggregatedResponseStats,
- packageName, id);
+ responseStatsForUser.populateAllBroadcastResponseStats(
+ broadcastResponseStatsList, packageName, id);
}
- return aggregatedResponseStats;
+ return broadcastResponseStatsList;
}
- void clearBroadcastResponseStats(int callingUid, @NonNull String packageName, long id,
+ void clearBroadcastResponseStats(int callingUid, @Nullable String packageName, long id,
@UserIdInt int userId) {
synchronized (mLock) {
final SparseArray<UserBroadcastResponseStats> responseStatsForCaller =
@@ -210,6 +212,16 @@
}
}
+ void clearBroadcastEvents(int callingUid, @UserIdInt int userId) {
+ synchronized (mLock) {
+ final UserBroadcastEvents userBroadcastEvents = mUserBroadcastEvents.get(userId);
+ if (userBroadcastEvents == null) {
+ return;
+ }
+ userBroadcastEvents.clear(callingUid);
+ }
+ }
+
void onUserRemoved(@UserIdInt int userId) {
synchronized (mLock) {
mUserBroadcastEvents.remove(userId);
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 4a761a7..06aa8f0 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -49,7 +49,7 @@
import android.app.admin.DevicePolicyManagerInternal;
import android.app.usage.AppLaunchEstimateInfo;
import android.app.usage.AppStandbyInfo;
-import android.app.usage.BroadcastResponseStats;
+import android.app.usage.BroadcastResponseStatsList;
import android.app.usage.ConfigurationStats;
import android.app.usage.EventStats;
import android.app.usage.IUsageStatsManager;
@@ -2686,16 +2686,15 @@
@Override
@NonNull
- public BroadcastResponseStats queryBroadcastResponseStats(
- @NonNull String packageName,
- @IntRange(from = 1) long id,
+ public BroadcastResponseStatsList queryBroadcastResponseStats(
+ @Nullable String packageName,
+ @IntRange(from = 0) long id,
@NonNull String callingPackage,
@UserIdInt int userId) {
- Objects.requireNonNull(packageName);
Objects.requireNonNull(callingPackage);
// TODO: Move to Preconditions utility class
- if (id <= 0) {
- throw new IllegalArgumentException("id needs to be >0");
+ if (id < 0) {
+ throw new IllegalArgumentException("id needs to be >=0");
}
final int callingUid = Binder.getCallingUid();
@@ -2708,8 +2707,9 @@
userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), callingUid,
userId, false /* allowAll */, false /* requireFull */,
"queryBroadcastResponseStats" /* name */, callingPackage);
- return mResponseStatsTracker.queryBroadcastResponseStats(
- callingUid, packageName, id, userId);
+ return new BroadcastResponseStatsList(
+ mResponseStatsTracker.queryBroadcastResponseStats(
+ callingUid, packageName, id, userId));
}
@Override
@@ -2718,10 +2718,9 @@
@IntRange(from = 1) long id,
@NonNull String callingPackage,
@UserIdInt int userId) {
- Objects.requireNonNull(packageName);
Objects.requireNonNull(callingPackage);
- if (id <= 0) {
- throw new IllegalArgumentException("id needs to be >0");
+ if (id < 0) {
+ throw new IllegalArgumentException("id needs to be >=0");
}
final int callingUid = Binder.getCallingUid();
@@ -2737,6 +2736,23 @@
mResponseStatsTracker.clearBroadcastResponseStats(callingUid,
packageName, id, userId);
}
+
+ @Override
+ public void clearBroadcastEvents(@NonNull String callingPackage, @UserIdInt int userId) {
+ Objects.requireNonNull(callingPackage);
+
+ final int callingUid = Binder.getCallingUid();
+ if (!hasPermission(callingPackage)) {
+ throw new SecurityException(
+ "Caller does not have the permission needed to call this API; "
+ + "callingPackage=" + callingPackage
+ + ", callingUid=" + callingUid);
+ }
+ userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), callingUid,
+ userId, false /* allowAll */, false /* requireFull */,
+ "clearBroadcastResponseStats" /* name */, callingPackage);
+ mResponseStatsTracker.clearBroadcastEvents(callingUid, userId);
+ }
}
void registerAppUsageObserver(int callingUid, int observerId, String[] packages,
diff --git a/services/usage/java/com/android/server/usage/UserBroadcastEvents.java b/services/usage/java/com/android/server/usage/UserBroadcastEvents.java
index 819644846..0ec59c3 100644
--- a/services/usage/java/com/android/server/usage/UserBroadcastEvents.java
+++ b/services/usage/java/com/android/server/usage/UserBroadcastEvents.java
@@ -51,6 +51,10 @@
}
void onUidRemoved(int uid) {
+ clear(uid);
+ }
+
+ void clear(int uid) {
for (int i = mBroadcastEvents.size() - 1; i >= 0; --i) {
final LongSparseArray<BroadcastEvent> broadcastEvents = mBroadcastEvents.valueAt(i);
for (int j = broadcastEvents.size() - 1; j >= 0; --j) {
diff --git a/services/usage/java/com/android/server/usage/UserBroadcastResponseStats.java b/services/usage/java/com/android/server/usage/UserBroadcastResponseStats.java
index ac2a320..1828a71 100644
--- a/services/usage/java/com/android/server/usage/UserBroadcastResponseStats.java
+++ b/services/usage/java/com/android/server/usage/UserBroadcastResponseStats.java
@@ -16,6 +16,7 @@
package com.android.server.usage;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.usage.BroadcastResponseStats;
@@ -23,6 +24,8 @@
import com.android.internal.util.IndentingPrintWriter;
+import java.util.List;
+
class UserBroadcastResponseStats {
/**
* Contains the mapping of a BroadcastEvent type to it's aggregated stats.
@@ -39,31 +42,38 @@
BroadcastEvent broadcastEvent) {
BroadcastResponseStats responseStats = mResponseStats.get(broadcastEvent);
if (responseStats == null) {
- responseStats = new BroadcastResponseStats(broadcastEvent.getTargetPackage());
+ responseStats = new BroadcastResponseStats(broadcastEvent.getTargetPackage(),
+ broadcastEvent.getIdForResponseEvent());
mResponseStats.put(broadcastEvent, responseStats);
}
return responseStats;
}
- void aggregateBroadcastResponseStats(
- @NonNull BroadcastResponseStats responseStats,
- @NonNull String packageName, long id) {
+ void populateAllBroadcastResponseStats(
+ @NonNull List<BroadcastResponseStats> broadcastResponseStatsList,
+ @Nullable String packageName, @IntRange(from = 0) long id) {
for (int i = mResponseStats.size() - 1; i >= 0; --i) {
final BroadcastEvent broadcastEvent = mResponseStats.keyAt(i);
- if (broadcastEvent.getIdForResponseEvent() == id
- && broadcastEvent.getTargetPackage().equals(packageName)) {
- responseStats.addCounts(mResponseStats.valueAt(i));
+ if (id != 0 && id != broadcastEvent.getIdForResponseEvent()) {
+ continue;
}
+ if (packageName != null && !packageName.equals(broadcastEvent.getTargetPackage())) {
+ continue;
+ }
+ broadcastResponseStatsList.add(mResponseStats.valueAt(i));
}
}
- void clearBroadcastResponseStats(@NonNull String packageName, long id) {
+ void clearBroadcastResponseStats(@Nullable String packageName, @IntRange(from = 0) long id) {
for (int i = mResponseStats.size() - 1; i >= 0; --i) {
final BroadcastEvent broadcastEvent = mResponseStats.keyAt(i);
- if (broadcastEvent.getIdForResponseEvent() == id
- && broadcastEvent.getTargetPackage().equals(packageName)) {
- mResponseStats.removeAt(i);
+ if (id != 0 && id != broadcastEvent.getIdForResponseEvent()) {
+ continue;
}
+ if (packageName != null && !packageName.equals(broadcastEvent.getTargetPackage())) {
+ continue;
+ }
+ mResponseStats.removeAt(i);
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 2fb67d7..7f70301 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -498,6 +498,7 @@
// current USB state
private boolean mHostConnected;
+ private boolean mUsbAccessoryConnected;
private boolean mSourcePower;
private boolean mSinkPower;
private boolean mConfigured;
@@ -964,10 +965,10 @@
break;
case MSG_UPDATE_HOST_STATE:
Iterator devices = (Iterator) msg.obj;
- boolean connected = (msg.arg1 == 1);
+ mUsbAccessoryConnected = (msg.arg1 == 1);
if (DEBUG) {
- Slog.i(TAG, "HOST_STATE connected:" + connected);
+ Slog.i(TAG, "HOST_STATE connected:" + mUsbAccessoryConnected);
}
mHideUsbNotification = false;
@@ -1221,7 +1222,7 @@
} else if (mSourcePower) {
titleRes = com.android.internal.R.string.usb_supplying_notification_title;
id = SystemMessage.NOTE_USB_SUPPLYING;
- } else if (mHostConnected && mSinkPower && mUsbCharging) {
+ } else if (mHostConnected && mSinkPower && (mUsbCharging || mUsbAccessoryConnected)) {
titleRes = com.android.internal.R.string.usb_charging_notification_title;
id = SystemMessage.NOTE_USB_CHARGING;
}
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index d0825ba..f07a406 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -384,7 +384,7 @@
}
/**
- * Enables USB data when disabled due to {@link UsbPortStatus#USB_DATA_STATUS_DISABLED_DOCK}
+ * Enables USB data when disabled due to {@link UsbPortStatus#DATA_STATUS_DISABLED_DOCK}
*/
public void enableUsbDataWhileDocked(@NonNull String portId, long transactionId,
IUsbOperationInternal callback, IndentingPrintWriter pw) {
@@ -844,7 +844,7 @@
portInfo.contaminantDetectionStatus,
portInfo.usbDataStatus,
portInfo.powerTransferLimited,
- portInfo.powerBrickStatus, pw);
+ portInfo.powerBrickConnectionStatus, pw);
}
} else {
for (RawPortInfo currentPortInfo : newPortInfo) {
@@ -859,7 +859,7 @@
currentPortInfo.contaminantDetectionStatus,
currentPortInfo.usbDataStatus,
currentPortInfo.powerTransferLimited,
- currentPortInfo.powerBrickStatus, pw);
+ currentPortInfo.powerBrickConnectionStatus, pw);
}
}
@@ -895,9 +895,9 @@
int contaminantProtectionStatus,
boolean supportsEnableContaminantPresenceDetection,
int contaminantDetectionStatus,
- int[] usbDataStatus,
+ int usbDataStatus,
boolean powerTransferLimited,
- int powerBrickStatus,
+ int powerBrickConnectionStatus,
IndentingPrintWriter pw) {
// Only allow mode switch capability for dual role ports.
// Validate that the current mode matches the supported modes we expect.
@@ -957,7 +957,7 @@
currentDataRole, canChangeDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickStatus);
+ powerTransferLimited, powerBrickConnectionStatus);
mPorts.put(portId, portInfo);
} else {
// Validate that ports aren't changing definition out from under us.
@@ -995,7 +995,7 @@
currentDataRole, canChangeDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickStatus)) {
+ powerTransferLimited, powerBrickConnectionStatus)) {
portInfo.mDisposition = PortInfo.DISPOSITION_CHANGED;
} else {
portInfo.mDisposition = PortInfo.DISPOSITION_READY;
@@ -1222,7 +1222,7 @@
mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
supportedRoleCombinations, UsbPortStatus.CONTAMINANT_PROTECTION_NONE,
UsbPortStatus.CONTAMINANT_DETECTION_NOT_SUPPORTED,
- new int[]{UsbPortStatus.USB_DATA_STATUS_UNKNOWN}, false,
+ UsbPortStatus.DATA_STATUS_UNKNOWN, false,
UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN);
dispositionChanged = true;
}
@@ -1238,31 +1238,12 @@
return dispositionChanged;
}
- private boolean dataStatusEquals(int[] dataStatusL, int[] dataStatusR) {
- if (dataStatusL == null && dataStatusR == null) {
- return true;
- }
- if ((dataStatusL == null && dataStatusR != null)
- || (dataStatusL != null && dataStatusR == null)) {
- return false;
- }
- if (dataStatusL.length != dataStatusR.length) {
- return false;
- }
- for (int i = 0; i < dataStatusL.length; i++) {
- if (dataStatusL[i] != dataStatusR[i]) {
- return false;
- }
- }
- return true;
- }
-
public boolean setStatus(int currentMode, boolean canChangeMode,
int currentPowerRole, boolean canChangePowerRole,
int currentDataRole, boolean canChangeDataRole,
int supportedRoleCombinations, int contaminantProtectionStatus,
- int contaminantDetectionStatus, int[] usbDataStatus,
- boolean powerTransferLimited, int powerBrickStatus) {
+ int contaminantDetectionStatus, int usbDataStatus,
+ boolean powerTransferLimited, int powerBrickConnectionStatus) {
boolean dispositionChanged = false;
mCanChangeMode = canChangeMode;
@@ -1278,15 +1259,16 @@
!= contaminantProtectionStatus
|| mUsbPortStatus.getContaminantDetectionStatus()
!= contaminantDetectionStatus
- || !dataStatusEquals(mUsbPortStatus.getUsbDataStatus(), usbDataStatus)
+ || mUsbPortStatus.getUsbDataStatus()
+ != usbDataStatus
|| mUsbPortStatus.isPowerTransferLimited()
!= powerTransferLimited
- || mUsbPortStatus.getPowerBrickStatus()
- != powerBrickStatus) {
+ || mUsbPortStatus.getPowerBrickConnectionStatus()
+ != powerBrickConnectionStatus) {
mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickStatus);
+ powerTransferLimited, powerBrickConnectionStatus);
dispositionChanged = true;
}
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index f3308bb..c0ecf58 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -63,6 +63,8 @@
import com.android.server.SystemServerInitThreadPool;
import com.android.server.SystemService;
+import dalvik.annotation.optimization.NeverCompile;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -883,6 +885,7 @@
}
}
+ @NeverCompile // Avoid size overhead of debugging code.
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, writer)) return;
diff --git a/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java b/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java
index dd25620..128a051 100644
--- a/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java
+++ b/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java
@@ -37,9 +37,9 @@
public int contaminantProtectionStatus;
public boolean supportsEnableContaminantPresenceDetection;
public int contaminantDetectionStatus;
- public int[] usbDataStatus;
+ public int usbDataStatus;
public boolean powerTransferLimited;
- public int powerBrickStatus;
+ public int powerBrickConnectionStatus;
public RawPortInfo(String portId, int supportedModes) {
this.portId = portId;
@@ -49,9 +49,10 @@
this.contaminantProtectionStatus = UsbPortStatus.CONTAMINANT_PROTECTION_NONE;
this.supportsEnableContaminantPresenceDetection = false;
this.contaminantDetectionStatus = UsbPortStatus.CONTAMINANT_DETECTION_NOT_SUPPORTED;
- this.usbDataStatus[0] = UsbPortStatus.USB_DATA_STATUS_UNKNOWN;
+ this.usbDataStatus = UsbPortStatus.DATA_STATUS_UNKNOWN;
+
this.powerTransferLimited = false;
- this.powerBrickStatus = UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN;
+ this.powerBrickConnectionStatus = UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN;
}
public RawPortInfo(String portId, int supportedModes, int supportedContaminantProtectionModes,
@@ -62,9 +63,9 @@
int contaminantProtectionStatus,
boolean supportsEnableContaminantPresenceDetection,
int contaminantDetectionStatus,
- int[] usbDataStatus,
+ int usbDataStatus,
boolean powerTransferLimited,
- int powerBrickStatus) {
+ int powerBrickConnectionStatus) {
this.portId = portId;
this.supportedModes = supportedModes;
this.supportedContaminantProtectionModes = supportedContaminantProtectionModes;
@@ -82,7 +83,7 @@
this.contaminantDetectionStatus = contaminantDetectionStatus;
this.usbDataStatus = usbDataStatus;
this.powerTransferLimited = powerTransferLimited;
- this.powerBrickStatus = powerBrickStatus;
+ this.powerBrickConnectionStatus = powerBrickConnectionStatus;
}
@Override
@@ -105,10 +106,9 @@
dest.writeInt(contaminantProtectionStatus);
dest.writeBoolean(supportsEnableContaminantPresenceDetection);
dest.writeInt(contaminantDetectionStatus);
- dest.writeInt(usbDataStatus.length);
- dest.writeIntArray(usbDataStatus);
+ dest.writeInt(usbDataStatus);
dest.writeBoolean(powerTransferLimited);
- dest.writeInt(powerBrickStatus);
+ dest.writeInt(powerBrickConnectionStatus);
}
public static final Parcelable.Creator<RawPortInfo> CREATOR =
@@ -128,10 +128,9 @@
int contaminantProtectionStatus = in.readInt();
boolean supportsEnableContaminantPresenceDetection = in.readBoolean();
int contaminantDetectionStatus = in.readInt();
- int[] usbDataStatus = new int[in.readInt()];
- in.readIntArray(usbDataStatus);
+ int usbDataStatus = in.readInt();
boolean powerTransferLimited = in.readBoolean();
- int powerBrickStatus = in.readInt();
+ int powerBrickConnectionStatus = in.readInt();
return new RawPortInfo(id, supportedModes,
supportedContaminantProtectionModes, currentMode, canChangeMode,
currentPowerRole, canChangePowerRole,
@@ -140,7 +139,7 @@
contaminantProtectionStatus,
supportsEnableContaminantPresenceDetection,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickStatus);
+ powerTransferLimited, powerBrickConnectionStatus);
}
@Override
diff --git a/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java b/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java
index f468db3..1db018e 100644
--- a/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java
+++ b/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java
@@ -73,6 +73,42 @@
private boolean mSystemReady;
private long mTransactionId;
+ /**
+ * USB data status is not known.
+ */
+ public static final int USB_DATA_STATUS_UNKNOWN = 0;
+
+ /**
+ * USB data is enabled.
+ */
+ public static final int USB_DATA_STATUS_ENABLED = 1;
+
+ /**
+ * USB data is disabled as the port is too hot.
+ */
+ public static final int USB_DATA_STATUS_DISABLED_OVERHEAT = 2;
+
+ /**
+ * USB data is disabled due to contaminated port.
+ */
+ public static final int USB_DATA_STATUS_DISABLED_CONTAMINANT = 3;
+
+ /**
+ * USB data is disabled due to docking event.
+ */
+ public static final int USB_DATA_STATUS_DISABLED_DOCK = 4;
+
+ /**
+ * USB data is disabled by
+ * {@link UsbPort#enableUsbData UsbPort.enableUsbData}.
+ */
+ public static final int USB_DATA_STATUS_DISABLED_FORCE = 5;
+
+ /**
+ * USB data is disabled for debug.
+ */
+ public static final int USB_DATA_STATUS_DISABLED_DEBUG = 6;
+
public @UsbHalVersion int getUsbHalVersion() throws RemoteException {
synchronized (mLock) {
if (mProxy == null) {
@@ -489,12 +525,34 @@
return supportedContaminantProtectionModes;
}
- private int[] toIntArray(byte[] input) {
- int[] output = new int[input.length];
- for (int i = 0; i < input.length; i++) {
- output[i] = input[i];
+ private int toUsbDataStatusInt(byte[] usbDataStatusHal) {
+ int usbDataStatus = UsbPortStatus.DATA_STATUS_UNKNOWN;
+ for (int i = 0; i < usbDataStatusHal.length; i++) {
+ switch (usbDataStatusHal[i]) {
+ case USB_DATA_STATUS_ENABLED:
+ usbDataStatus |= UsbPortStatus.DATA_STATUS_ENABLED;
+ break;
+ case USB_DATA_STATUS_DISABLED_OVERHEAT:
+ usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_OVERHEAT;
+ break;
+ case USB_DATA_STATUS_DISABLED_CONTAMINANT:
+ usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_CONTAMINANT;
+ break;
+ case USB_DATA_STATUS_DISABLED_DOCK:
+ usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK;
+ break;
+ case USB_DATA_STATUS_DISABLED_FORCE:
+ usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_FORCE;
+ break;
+ case USB_DATA_STATUS_DISABLED_DEBUG:
+ usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DEBUG;
+ break;
+ default:
+ usbDataStatus |= UsbPortStatus.DATA_STATUS_UNKNOWN;
+ }
}
- return output;
+ UsbPortManager.logAndPrint(Log.INFO, mPw, "AIDL UsbDataStatus:" + usbDataStatus);
+ return usbDataStatus;
}
@Override
@@ -528,7 +586,7 @@
toContaminantProtectionStatus(current.contaminantProtectionStatus),
current.supportsEnableContaminantPresenceDetection,
current.contaminantDetectionStatus,
- toIntArray(current.usbDataStatus),
+ toUsbDataStatusInt(current.usbDataStatus),
current.powerTransferLimited,
current.powerBrickStatus);
newPortInfo.add(temp);
diff --git a/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java b/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java
index 64e8adc..c7f0775 100644
--- a/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java
+++ b/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java
@@ -33,8 +33,8 @@
import static android.hardware.usb.UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SOURCE;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_FORCE;
-import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_UNKNOWN;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_FORCE;
+import static android.hardware.usb.UsbPortStatus.DATA_STATUS_UNKNOWN;
import static com.android.server.usb.UsbPortManager.logAndPrint;
@@ -85,7 +85,7 @@
private HALCallback mHALCallback;
private boolean mSystemReady;
// Workaround since HIDL HAL versions report UsbDataEnabled status in UsbPortStatus;
- private static int sUsbDataStatus = USB_DATA_STATUS_UNKNOWN;
+ private static int sUsbDataStatus = DATA_STATUS_UNKNOWN;
public @UsbHalVersion int getUsbHalVersion() throws RemoteException {
int version;
@@ -375,7 +375,7 @@
}
}
if (success) {
- sUsbDataStatus = enable ? USB_DATA_STATUS_UNKNOWN : USB_DATA_STATUS_DISABLED_FORCE;
+ sUsbDataStatus = enable ? DATA_STATUS_UNKNOWN : DATA_STATUS_DISABLED_FORCE;
}
try {
callback.onOperationComplete(success
@@ -421,7 +421,7 @@
current.canChangePowerRole,
current.currentDataRole, current.canChangeDataRole,
false, CONTAMINANT_PROTECTION_NONE,
- false, CONTAMINANT_DETECTION_NOT_SUPPORTED, new int[sUsbDataStatus],
+ false, CONTAMINANT_DETECTION_NOT_SUPPORTED, sUsbDataStatus,
false, POWER_BRICK_STATUS_UNKNOWN);
newPortInfo.add(temp);
UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_0: "
@@ -455,7 +455,7 @@
current.status.canChangePowerRole,
current.status.currentDataRole, current.status.canChangeDataRole,
false, CONTAMINANT_PROTECTION_NONE,
- false, CONTAMINANT_DETECTION_NOT_SUPPORTED, new int[sUsbDataStatus],
+ false, CONTAMINANT_DETECTION_NOT_SUPPORTED, sUsbDataStatus,
false, POWER_BRICK_STATUS_UNKNOWN);
newPortInfo.add(temp);
UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_1: "
@@ -493,7 +493,7 @@
current.contaminantProtectionStatus,
current.supportsEnableContaminantPresenceDetection,
current.contaminantDetectionStatus,
- new int[sUsbDataStatus],
+ sUsbDataStatus,
false, POWER_BRICK_STATUS_UNKNOWN);
newPortInfo.add(temp);
UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_2: "
diff --git a/telephony/java/android/telephony/ActivityStatsTechSpecificInfo.aidl b/telephony/java/android/telephony/ActivityStatsTechSpecificInfo.aidl
new file mode 100644
index 0000000..542c6ad
--- /dev/null
+++ b/telephony/java/android/telephony/ActivityStatsTechSpecificInfo.aidl
@@ -0,0 +1,20 @@
+/*
+**
+** Copyright 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 android.telephony;
+
+parcelable ActivityStatsTechSpecificInfo;
diff --git a/telephony/java/android/telephony/ActivityStatsTechSpecificInfo.java b/telephony/java/android/telephony/ActivityStatsTechSpecificInfo.java
new file mode 100644
index 0000000..e5a20ea
--- /dev/null
+++ b/telephony/java/android/telephony/ActivityStatsTechSpecificInfo.java
@@ -0,0 +1,245 @@
+/*
+ * 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 android.telephony;
+
+import android.annotation.DurationMillisLong;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.telephony.ServiceState.FrequencyRange;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * Technology specific activity stats info. List of the activity stats for each RATs (2G, 3G, 4G and
+ * 5G) and frequency ranges (HIGH for sub6 and MMWAVE) in case of 5G. In case implementation doesn't
+ * have RAT specific activity stats then send only one activity stats info with RAT unknown.
+ *
+ * @hide
+ */
+public final class ActivityStatsTechSpecificInfo implements Parcelable {
+ private static final int TX_POWER_LEVELS = 5;
+
+ private int mRat;
+ private int mFrequencyRange;
+ private int[] mTxTimeMs;
+ private int mRxTimeMs;
+
+ /** @hide */
+ public ActivityStatsTechSpecificInfo(
+ int rat, @FrequencyRange int frequencyRange, @NonNull int[] txTimeMs, int rxTimeMs) {
+ Objects.requireNonNull(txTimeMs);
+ if (txTimeMs.length != TX_POWER_LEVELS) {
+ throw new IllegalArgumentException("txTimeMs must have length == TX_POWER_LEVELS");
+ }
+ mRat = rat;
+ mFrequencyRange = frequencyRange;
+ mTxTimeMs = txTimeMs;
+ mRxTimeMs = rxTimeMs;
+ }
+
+ /**
+ * Returns the radio access technology for this activity stats info.
+ *
+ * The returned value is define in {@link AccessNetworkConstants.AccessNetworkType};
+ * @hide
+ */
+ public int getRat() {
+ return mRat;
+ }
+
+ /**
+ * Returns the rough frequency range for this activity stats info.
+ *
+ * The returned value is define in {@link ServiceState.FrequencyRange};
+ * @hide
+ */
+ public @FrequencyRange int getFrequencyRange() {
+ return mFrequencyRange;
+ }
+
+ /**
+ * Gets the amount of time the modem spent transmitting at a certain power level.
+ *
+ * @return The amount of time, in milliseconds, that the modem spent transmitting at the given
+ * power level.
+ */
+ public @DurationMillisLong long getTransmitTimeMillis(int powerLevel) {
+ return mTxTimeMs[powerLevel];
+ }
+
+ /**
+ * @return The raw array of transmit power durations
+ * @hide
+ */
+ @NonNull
+ public int[] getTransmitTimeMillis() {
+ return mTxTimeMs;
+ }
+
+ /**
+ * Gets the amount of time (in milliseconds) when the modem is awake and receiving data.
+ *
+ * @return Time in milliseconds.
+ * @hide
+ */
+ public @DurationMillisLong long getReceiveTimeMillis() {
+ return mRxTimeMs;
+ }
+ /** @hide */
+ public void setRat(int rat) {
+ mRat = rat;
+ }
+
+ /** @hide */
+ public void setFrequencyRange(@FrequencyRange int frequencyRange) {
+ mFrequencyRange = frequencyRange;
+ }
+
+ /** @hide */
+ public void setReceiveTimeMillis(int receiveTimeMillis) {
+ mRxTimeMs = receiveTimeMillis;
+ }
+
+ /**
+ * Provided for convenience, since the API surface needs to return longs but internal
+ * representations are ints.
+ *
+ * @hide
+ */
+ public void setReceiveTimeMillis(long receiveTimeMillis) {
+ mRxTimeMs = (int) receiveTimeMillis;
+ }
+
+ /** @hide */
+ public void setTransmitTimeMillis(int[] txTimeMs) {
+ mTxTimeMs = Arrays.copyOf(txTimeMs, TX_POWER_LEVELS);
+ }
+
+ /** @hide */
+ public boolean isTxPowerValid() {
+ return Arrays.stream(mTxTimeMs).allMatch((i) -> i >= 0);
+ }
+
+ /** @hide */
+ public boolean isRxPowerValid() {
+ return getReceiveTimeMillis() >= 0;
+ }
+
+ /** @hide */
+ public boolean isTxPowerEmpty() {
+ boolean isTxPowerEmpty =
+ mTxTimeMs == null
+ || mTxTimeMs.length == 0
+ || Arrays.stream(mTxTimeMs).allMatch((i) -> i == 0);
+ return isTxPowerEmpty;
+ }
+
+ /** @hide */
+ public boolean isRxPowerEmpty() {
+ return getReceiveTimeMillis() == 0;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = Objects.hash(mRat, mFrequencyRange, mRxTimeMs);
+ result = 31 * result + Arrays.hashCode(mTxTimeMs);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof ActivityStatsTechSpecificInfo)) return false;
+ ActivityStatsTechSpecificInfo that = (ActivityStatsTechSpecificInfo) o;
+ return mRat == that.mRat
+ && mFrequencyRange == that.mFrequencyRange
+ && Arrays.equals(mTxTimeMs, that.mTxTimeMs)
+ && mRxTimeMs == that.mRxTimeMs;
+ }
+
+ private static String ratToString(int type) {
+ switch (type) {
+ case AccessNetworkConstants.AccessNetworkType.UNKNOWN:
+ return "UNKNOWN";
+ case AccessNetworkConstants.AccessNetworkType.GERAN:
+ return "GERAN";
+ case AccessNetworkConstants.AccessNetworkType.UTRAN:
+ return "UTRAN";
+ case AccessNetworkConstants.AccessNetworkType.EUTRAN:
+ return "EUTRAN";
+ case AccessNetworkConstants.AccessNetworkType.CDMA2000:
+ return "CDMA2000";
+ case AccessNetworkConstants.AccessNetworkType.IWLAN:
+ return "IWLAN";
+ case AccessNetworkConstants.AccessNetworkType.NGRAN:
+ return "NGRAN";
+ default:
+ return Integer.toString(type);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder()
+ .append("{mRat=")
+ .append(ratToString(mRat))
+ .append(",mFrequencyRange=")
+ .append(ServiceState.frequencyRangeToString(mFrequencyRange))
+ .append(",mTxTimeMs[]=")
+ .append(Arrays.toString(mTxTimeMs))
+ .append(",mRxTimeMs=")
+ .append(mRxTimeMs)
+ .append("}")
+ .toString();
+ }
+
+ /**
+ * {@link Parcelable#describeContents}
+ */
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final @android.annotation.NonNull Parcelable.Creator<
+ ActivityStatsTechSpecificInfo>
+ CREATOR =
+ new Parcelable.Creator<ActivityStatsTechSpecificInfo>() {
+ public ActivityStatsTechSpecificInfo createFromParcel(@NonNull Parcel in) {
+ int rat = in.readInt();
+ int frequencyRange = in.readInt();
+ int[] txTimeMs = new int[TX_POWER_LEVELS];
+ in.readIntArray(txTimeMs);
+ int rxTimeMs = in.readInt();
+ return new ActivityStatsTechSpecificInfo(
+ rat, frequencyRange, txTimeMs, rxTimeMs);
+ }
+
+ public ActivityStatsTechSpecificInfo[] newArray(int size) {
+ return new ActivityStatsTechSpecificInfo[size];
+ }
+ };
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mRat);
+ dest.writeInt(mFrequencyRange);
+ dest.writeIntArray(mTxTimeMs);
+ dest.writeInt(mRxTimeMs);
+ }
+}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 2c39863..eb3df1c 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -5395,7 +5395,7 @@
defaults.putPersistableBundle(
KEY_RCS_REQUIRES_PROVISIONING_BUNDLE, new PersistableBundle());
- defaults.putBoolean(KEY_GRUU_ENABLED_BOOL, true);
+ defaults.putBoolean(KEY_GRUU_ENABLED_BOOL, false);
defaults.putBoolean(KEY_SIP_OVER_IPSEC_ENABLED_BOOL, true);
defaults.putBoolean(KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL, false);
defaults.putBoolean(KEY_REGISTRATION_EVENT_PACKAGE_SUPPORTED_BOOL, true);
@@ -5410,7 +5410,7 @@
defaults.putInt(KEY_SIP_TIMER_H_MILLIS_INT, 128000);
defaults.putInt(KEY_SIP_TIMER_J_MILLIS_INT, 128000);
defaults.putInt(KEY_SIP_SERVER_PORT_NUMBER_INT, 5060);
- defaults.putInt(KEY_REQUEST_URI_TYPE_INT, REQUEST_URI_FORMAT_SIP);
+ defaults.putInt(KEY_REQUEST_URI_TYPE_INT, REQUEST_URI_FORMAT_TEL);
defaults.putInt(KEY_SIP_PREFERRED_TRANSPORT_INT, PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP);
defaults.putInt(KEY_IPV4_SIP_MTU_SIZE_CELLULAR_INT, 1500);
defaults.putInt(KEY_IPV6_SIP_MTU_SIZE_CELLULAR_INT, 1500);
@@ -6431,11 +6431,11 @@
defaults.putBoolean(KEY_MULTIENDPOINT_SUPPORTED_BOOL, false);
defaults.putBoolean(KEY_SESSION_TIMER_SUPPORTED_BOOL, true);
defaults.putBoolean(KEY_OIP_SOURCE_FROM_HEADER_BOOL, false);
- defaults.putBoolean(KEY_PRACK_SUPPORTED_FOR_18X_BOOL, true);
+ defaults.putBoolean(KEY_PRACK_SUPPORTED_FOR_18X_BOOL, false);
defaults.putBoolean(KEY_VOICE_QOS_PRECONDITION_SUPPORTED_BOOL, true);
defaults.putBoolean(KEY_VOICE_ON_DEFAULT_BEARER_SUPPORTED_BOOL, false);
- defaults.putInt(KEY_SESSION_REFRESHER_TYPE_INT, SESSION_REFRESHER_TYPE_UNKNOWN);
+ defaults.putInt(KEY_SESSION_REFRESHER_TYPE_INT, SESSION_REFRESHER_TYPE_UAC);
defaults.putInt(KEY_SESSION_PRIVACY_TYPE_INT, SESSION_PRIVACY_TYPE_HEADER);
defaults.putInt(KEY_SESSION_REFRESH_METHOD_INT,
SESSION_REFRESH_METHOD_UPDATE_PREFERRED);
@@ -6457,7 +6457,9 @@
KEY_AUDIO_INACTIVITY_CALL_END_REASONS_INT_ARRAY,
new int[] {
Ims.RTCP_INACTIVITY_ON_CONNECTED,
- Ims.RTP_INACTIVITY_ON_CONNECTED
+ Ims.RTP_INACTIVITY_ON_CONNECTED,
+ Ims.E911_RTCP_INACTIVITY_ON_CONNECTED,
+ Ims.RTCP_INACTIVITY_ON_HOLD
});
defaults.putIntArray(
@@ -6821,7 +6823,7 @@
AccessNetworkType.IWLAN
});
- defaults.putInt(KEY_EMERGENCY_REGISTRATION_TIMER_MILLIS_INT, 20000);
+ defaults.putInt(KEY_EMERGENCY_REGISTRATION_TIMER_MILLIS_INT, 10000);
defaults.putInt(KEY_REFRESH_GEOLOCATION_TIMEOUT_MILLIS_INT, 5000);
return defaults;
@@ -7494,7 +7496,7 @@
private static PersistableBundle getDefaults() {
PersistableBundle defaults = new PersistableBundle();
- defaults.putBoolean(KEY_UT_REQUIRES_IMS_REGISTRATION_BOOL, true);
+ defaults.putBoolean(KEY_UT_REQUIRES_IMS_REGISTRATION_BOOL, false);
defaults.putBoolean(KEY_USE_CSFB_ON_XCAP_OVER_UT_FAILURE_BOOL, true);
defaults.putBoolean(KEY_UT_SUPPORTED_WHEN_PS_DATA_OFF_BOOL, true);
defaults.putBoolean(KEY_NETWORK_INITIATED_USSD_OVER_IMS_SUPPORTED_BOOL, true);
@@ -8124,6 +8126,13 @@
"telephony_data_handover_retry_rules_string_array";
/**
+ * Indicates whether delay tearing down IMS data network until voice call ends.
+ * @hide
+ */
+ public static final String KEY_DELAY_IMS_TEAR_DOWN_UNTIL_CALL_END_BOOL =
+ "delay_ims_tear_down_until_call_end_bool";
+
+ /**
* The patterns of missed incoming call sms. This is the regular expression used for
* matching the missed incoming call's date, time, and caller id. The pattern should match
* fields for at least month, day, hour, and minute. Year is optional although it is encouraged.
@@ -8217,7 +8226,9 @@
"store_sim_pin_for_unattended_reboot_bool";
/**
- * Determine whether "Enable 2G" toggle can be shown.
+ * Allow whether the user can use the "Allow 2G" toggle in Settings.
+ *
+ * If {@code true} then the toggle is disabled (i.e. grayed out).
*
* Used to trade privacy/security against potentially reduced carrier coverage for some
* carriers.
@@ -8968,6 +8979,7 @@
KEY_TELEPHONY_DATA_HANDOVER_RETRY_RULES_STRING_ARRAY, new String[] {
"retry_interval=1000|2000|4000|8000|16000, maximum_retries=5"
});
+ sDefaults.putBoolean(KEY_DELAY_IMS_TEAR_DOWN_UNTIL_CALL_END_BOOL, false);
sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]);
sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false);
sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, "");
diff --git a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java
index 837124f..ca6dc2d 100644
--- a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java
+++ b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java
@@ -22,6 +22,8 @@
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.util.Objects;
@@ -76,7 +78,8 @@
/**
* @hide
*/
- DataSpecificRegistrationInfo(
+ @VisibleForTesting
+ public DataSpecificRegistrationInfo(
int maxDataCalls, boolean isDcNrRestricted, boolean isNrAvailable,
boolean isEnDcAvailable, @Nullable VopsSupportInfo vops) {
this.maxDataCalls = maxDataCalls;
@@ -186,7 +189,7 @@
/**
* @return The VOPS (Voice over Packet Switched) support information.
*
- * The instance of {@link LTEVopsSupportInfo}, or {@link NrVopsSupportInfo},
+ * The instance of {@link LteVopsSupportInfo}, or {@link NrVopsSupportInfo},
* null if there is there is no VOPS support information available.
*/
@Nullable
diff --git a/telephony/java/android/telephony/ModemActivityInfo.java b/telephony/java/android/telephony/ModemActivityInfo.java
index ec6c25d..730a9d1 100644
--- a/telephony/java/android/telephony/ModemActivityInfo.java
+++ b/telephony/java/android/telephony/ModemActivityInfo.java
@@ -25,6 +25,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
+import android.telephony.ServiceState.FrequencyRange;
import android.util.Range;
import java.lang.annotation.Retention;
@@ -94,8 +95,10 @@
private long mTimestamp;
private int mSleepTimeMs;
private int mIdleTimeMs;
- private int[] mTxTimeMs;
- private int mRxTimeMs;
+ private int[] mTotalTxTimeMs;
+ private int mTotalRxTimeMs;
+ private int mSizeOfSpecificInfo;
+ private ActivityStatsTechSpecificInfo[] mActivityStatsTechSpecificInfo;
/**
* @hide
@@ -110,8 +113,17 @@
mTimestamp = timestamp;
mSleepTimeMs = sleepTimeMs;
mIdleTimeMs = idleTimeMs;
- mTxTimeMs = txTimeMs;
- mRxTimeMs = rxTimeMs;
+ mTotalTxTimeMs = txTimeMs;
+ mTotalRxTimeMs = rxTimeMs;
+
+ mActivityStatsTechSpecificInfo = new ActivityStatsTechSpecificInfo[1];
+ mSizeOfSpecificInfo = mActivityStatsTechSpecificInfo.length;
+ mActivityStatsTechSpecificInfo[0] =
+ new ActivityStatsTechSpecificInfo(
+ AccessNetworkConstants.AccessNetworkType.UNKNOWN,
+ ServiceState.FREQUENCY_RANGE_UNKNOWN,
+ txTimeMs,
+ rxTimeMs);
}
/**
@@ -124,14 +136,49 @@
this(timestamp, (int) sleepTimeMs, (int) idleTimeMs, txTimeMs, (int) rxTimeMs);
}
+ /** @hide */
+ public ModemActivityInfo(long timestamp, int sleepTimeMs, int idleTimeMs,
+ @NonNull ActivityStatsTechSpecificInfo[] activityStatsTechSpecificInfo) {
+ mTimestamp = timestamp;
+ mSleepTimeMs = sleepTimeMs;
+ mIdleTimeMs = idleTimeMs;
+ mActivityStatsTechSpecificInfo = activityStatsTechSpecificInfo;
+ mSizeOfSpecificInfo = mActivityStatsTechSpecificInfo.length;
+ mTotalTxTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
+ for (int i = 0; i < getNumTxPowerLevels(); i++) {
+ for (int j = 0; j < getSpecificInfoLength(); j++) {
+ mTotalTxTimeMs[i] = mTotalTxTimeMs[i]
+ + (int) mActivityStatsTechSpecificInfo[j].getTransmitTimeMillis(i);
+ }
+ }
+ mTotalRxTimeMs = 0;
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ mTotalRxTimeMs =
+ mTotalRxTimeMs + (int) mActivityStatsTechSpecificInfo[i].getReceiveTimeMillis();
+ }
+ }
+
+ /**
+ * Provided for convenience in manipulation since the API exposes long values but internal
+ * representations are ints.
+ * @hide
+ */
+ public ModemActivityInfo(long timestamp, long sleepTimeMs, long idleTimeMs,
+ @NonNull ActivityStatsTechSpecificInfo[] activityStatsTechSpecificInfo) {
+ this(timestamp, (int) sleepTimeMs, (int) idleTimeMs, activityStatsTechSpecificInfo);
+ }
+
@Override
public String toString() {
return "ModemActivityInfo{"
- + " mTimestamp=" + mTimestamp
- + " mSleepTimeMs=" + mSleepTimeMs
- + " mIdleTimeMs=" + mIdleTimeMs
- + " mTxTimeMs[]=" + Arrays.toString(mTxTimeMs)
- + " mRxTimeMs=" + mRxTimeMs
+ + " mTimestamp="
+ + mTimestamp
+ + " mSleepTimeMs="
+ + mSleepTimeMs
+ + " mIdleTimeMs="
+ + mIdleTimeMs
+ + " mActivityStatsTechSpecificInfo="
+ + Arrays.toString(mActivityStatsTechSpecificInfo)
+ "}";
}
@@ -145,11 +192,17 @@
long timestamp = in.readLong();
int sleepTimeMs = in.readInt();
int idleTimeMs = in.readInt();
- int[] txTimeMs = new int[TX_POWER_LEVELS];
- in.readIntArray(txTimeMs);
- int rxTimeMs = in.readInt();
- return new ModemActivityInfo(timestamp, sleepTimeMs, idleTimeMs,
- txTimeMs, rxTimeMs);
+ Parcelable[] tempSpecifiers =
+ in.createTypedArray(ActivityStatsTechSpecificInfo.CREATOR);
+ ActivityStatsTechSpecificInfo[] activityStatsTechSpecificInfo;
+ activityStatsTechSpecificInfo =
+ new ActivityStatsTechSpecificInfo[tempSpecifiers.length];
+ for (int i = 0; i < tempSpecifiers.length; i++) {
+ activityStatsTechSpecificInfo[i] =
+ (ActivityStatsTechSpecificInfo) tempSpecifiers[i];
+ }
+ return new ModemActivityInfo(
+ timestamp, sleepTimeMs, idleTimeMs, activityStatsTechSpecificInfo);
}
public ModemActivityInfo[] newArray(int size) {
@@ -165,15 +218,14 @@
dest.writeLong(mTimestamp);
dest.writeInt(mSleepTimeMs);
dest.writeInt(mIdleTimeMs);
- dest.writeIntArray(mTxTimeMs);
- dest.writeInt(mRxTimeMs);
+ dest.writeTypedArray(mActivityStatsTechSpecificInfo, flags);
}
/**
* Gets the timestamp at which this modem activity info was recorded.
*
- * @return The timestamp, as returned by {@link SystemClock#elapsedRealtime()}, when this
- * {@link ModemActivityInfo} was recorded.
+ * @return The timestamp, as returned by {@link SystemClock#elapsedRealtime()}, when this {@link
+ * ModemActivityInfo} was recorded.
*/
public @ElapsedRealtimeLong long getTimestampMillis() {
return mTimestamp;
@@ -188,14 +240,41 @@
* Gets the amount of time the modem spent transmitting at a certain power level.
*
* @param powerLevel The power level to query.
- * @return The amount of time, in milliseconds, that the modem spent transmitting at the
- * given power level.
+ * @return The amount of time, in milliseconds, that the modem spent transmitting at the given
+ * power level.
*/
public @DurationMillisLong long getTransmitDurationMillisAtPowerLevel(
@TxPowerLevel int powerLevel) {
- return mTxTimeMs[powerLevel];
+ long txTimeMsAtPowerLevel = 0;
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ txTimeMsAtPowerLevel +=
+ mActivityStatsTechSpecificInfo[i].getTransmitTimeMillis(powerLevel);
+ }
+ return txTimeMsAtPowerLevel;
}
+ /** @hide */
+ public @DurationMillisLong long getTransmitDurationMillisAtPowerLevel(
+ @TxPowerLevel int powerLevel, int rat) {
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat) {
+ return mActivityStatsTechSpecificInfo[i].getTransmitTimeMillis(powerLevel);
+ }
+ }
+ return 0;
+ }
+
+ /** @hide */
+ public @DurationMillisLong long getTransmitDurationMillisAtPowerLevel(
+ @TxPowerLevel int powerLevel, int rat, @FrequencyRange int freq) {
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat
+ && mActivityStatsTechSpecificInfo[i].getFrequencyRange() == freq) {
+ return mActivityStatsTechSpecificInfo[i].getTransmitTimeMillis(powerLevel);
+ }
+ }
+ return 0;
+ }
/**
* Gets the range of transmit powers corresponding to a certain power level.
*
@@ -208,17 +287,64 @@
}
/** @hide */
- public void setTransmitTimeMillis(int[] txTimeMs) {
- mTxTimeMs = Arrays.copyOf(txTimeMs, TX_POWER_LEVELS);
+ public int getSpecificInfoRat(int index) {
+ return mActivityStatsTechSpecificInfo[index].getRat();
}
+ /** @hide */
+ public int getSpecificInfoFrequencyRange(int index) {
+ return mActivityStatsTechSpecificInfo[index].getFrequencyRange();
+ }
+ /** @hide */
+ public void setTransmitTimeMillis(int[] txTimeMs) {
+ mTotalTxTimeMs = Arrays.copyOf(txTimeMs, TX_POWER_LEVELS);
+ }
+ /** @hide */
+ public void setTransmitTimeMillis(int rat, int[] txTimeMs) {
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat) {
+ mActivityStatsTechSpecificInfo[i].setTransmitTimeMillis(txTimeMs);
+ }
+ }
+ }
+ /** @hide */
+ public void setTransmitTimeMillis(int rat, int freq, int[] txTimeMs) {
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat
+ && mActivityStatsTechSpecificInfo[i].getFrequencyRange() == freq) {
+ mActivityStatsTechSpecificInfo[i].setTransmitTimeMillis(txTimeMs);
+ }
+ }
+ }
/**
* @return The raw array of transmit power durations
* @hide
*/
@NonNull
public int[] getTransmitTimeMillis() {
- return mTxTimeMs;
+ return mTotalTxTimeMs;
+ }
+
+ /** @hide */
+ public int[] getTransmitTimeMillis(@AccessNetworkConstants.RadioAccessNetworkType int rat) {
+ for (int i = 0; i < mActivityStatsTechSpecificInfo.length; i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat) {
+ return mActivityStatsTechSpecificInfo[i].getTransmitTimeMillis();
+ }
+ }
+ return new int[5];
+ }
+
+ /** @hide */
+ public int[] getTransmitTimeMillis(
+ @AccessNetworkConstants.RadioAccessNetworkType int rat, @FrequencyRange int freq) {
+ for (int i = 0; i < mActivityStatsTechSpecificInfo.length; i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat
+ && mActivityStatsTechSpecificInfo[i].getFrequencyRange() == freq) {
+ return mActivityStatsTechSpecificInfo[i].getTransmitTimeMillis();
+ }
+ }
+ return new int[5];
}
/**
@@ -238,6 +364,7 @@
/**
* Provided for convenience, since the API surface needs to return longs but internal
* representations are ints.
+ *
* @hide
*/
public void setSleepTimeMillis(long sleepTimeMillis) {
@@ -257,14 +384,63 @@
*/
public @NonNull ModemActivityInfo getDelta(@NonNull ModemActivityInfo other) {
int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
- for (int i = 0; i < ModemActivityInfo.TX_POWER_LEVELS; i++) {
- txTimeMs[i] = other.mTxTimeMs[i] - mTxTimeMs[i];
+
+ ActivityStatsTechSpecificInfo[] mDeltaSpecificInfo;
+ mDeltaSpecificInfo = new ActivityStatsTechSpecificInfo[other.getSpecificInfoLength()];
+
+ boolean matched;
+ for (int i = 0; i < other.getSpecificInfoLength(); i++) {
+ matched = false;
+ for (int j = 0; j < getSpecificInfoLength(); j++) {
+ int rat = mActivityStatsTechSpecificInfo[j].getRat();
+ if (rat == other.mActivityStatsTechSpecificInfo[i].getRat() && !matched) {
+ if (mActivityStatsTechSpecificInfo[j].getRat()
+ == AccessNetworkConstants.AccessNetworkType.NGRAN) {
+ if (other.mActivityStatsTechSpecificInfo[i].getFrequencyRange()
+ == mActivityStatsTechSpecificInfo[j].getFrequencyRange()) {
+ int freq = mActivityStatsTechSpecificInfo[j].getFrequencyRange();
+ for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
+ txTimeMs[lvl] =
+ (int) (other.getTransmitDurationMillisAtPowerLevel(
+ lvl, rat, freq)
+ - getTransmitDurationMillisAtPowerLevel(
+ lvl, rat, freq));
+ }
+ matched = true;
+ mDeltaSpecificInfo[i] =
+ new ActivityStatsTechSpecificInfo(
+ rat,
+ freq,
+ txTimeMs,
+ (int) (other.getReceiveTimeMillis(rat, freq)
+ - getReceiveTimeMillis(rat, freq)));
+ }
+ } else {
+ for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
+ txTimeMs[lvl] =
+ (int) (other.getTransmitDurationMillisAtPowerLevel(lvl, rat)
+ - getTransmitDurationMillisAtPowerLevel(lvl, rat));
+ }
+ matched = true;
+ mDeltaSpecificInfo[i] =
+ new ActivityStatsTechSpecificInfo(
+ rat,
+ ServiceState.FREQUENCY_RANGE_UNKNOWN,
+ txTimeMs,
+ (int) (other.getReceiveTimeMillis(rat)
+ - getReceiveTimeMillis(rat)));
+ }
+ }
+ }
+ if (!matched) {
+ mDeltaSpecificInfo[i] = other.mActivityStatsTechSpecificInfo[i];
+ }
}
- return new ModemActivityInfo(other.getTimestampMillis(),
+ return new ModemActivityInfo(
+ other.getTimestampMillis(),
other.getSleepTimeMillis() - getSleepTimeMillis(),
other.getIdleTimeMillis() - getIdleTimeMillis(),
- txTimeMs,
- other.getReceiveTimeMillis() - getReceiveTimeMillis());
+ mDeltaSpecificInfo);
}
/**
@@ -285,6 +461,7 @@
/**
* Provided for convenience, since the API surface needs to return longs but internal
* representations are ints.
+ *
* @hide
*/
public void setIdleTimeMillis(long idleTimeMillis) {
@@ -297,21 +474,66 @@
* @return Time in milliseconds.
*/
public @DurationMillisLong long getReceiveTimeMillis() {
- return mRxTimeMs;
+ return mTotalRxTimeMs;
+ }
+
+ /** @hide */
+ public @DurationMillisLong long getReceiveTimeMillis(int rat) {
+ for (int i = 0; i < mActivityStatsTechSpecificInfo.length; i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat) {
+ return mActivityStatsTechSpecificInfo[i].getReceiveTimeMillis();
+ }
+ }
+ return 0;
+ }
+ /** @hide */
+ public @DurationMillisLong long getReceiveTimeMillis(int rat, int freq) {
+ for (int i = 0; i < mActivityStatsTechSpecificInfo.length; i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat
+ && mActivityStatsTechSpecificInfo[i].getFrequencyRange() == freq) {
+ return mActivityStatsTechSpecificInfo[i].getReceiveTimeMillis();
+ }
+ }
+ return 0;
}
/** @hide */
public void setReceiveTimeMillis(int rxTimeMillis) {
- mRxTimeMs = rxTimeMillis;
+ mTotalRxTimeMs = rxTimeMillis;
}
/**
* Provided for convenience, since the API surface needs to return longs but internal
* representations are ints.
+ *
* @hide
*/
public void setReceiveTimeMillis(long receiveTimeMillis) {
- mRxTimeMs = (int) receiveTimeMillis;
+ mTotalRxTimeMs = (int) receiveTimeMillis;
+ }
+
+ /** @hide */
+ public void setReceiveTimeMillis(int rat, long receiveTimeMillis) {
+ for (int i = 0; i < mActivityStatsTechSpecificInfo.length; i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat) {
+ mActivityStatsTechSpecificInfo[i].setReceiveTimeMillis(receiveTimeMillis);
+ }
+ }
+ }
+
+ /** @hide */
+ public void setReceiveTimeMillis(int rat, int freq, long receiveTimeMillis) {
+ for (int i = 0; i < mActivityStatsTechSpecificInfo.length; i++) {
+ if (mActivityStatsTechSpecificInfo[i].getRat() == rat
+ && mActivityStatsTechSpecificInfo[i].getFrequencyRange() == freq) {
+ mActivityStatsTechSpecificInfo[i].setReceiveTimeMillis(receiveTimeMillis);
+ }
+ }
+ }
+
+ /** @hide */
+ public int getSpecificInfoLength() {
+ return mSizeOfSpecificInfo;
}
/**
@@ -323,23 +545,42 @@
*/
@TestApi
public boolean isValid() {
- boolean isTxPowerValid = Arrays.stream(mTxTimeMs).allMatch((i) -> i >= 0);
-
- return isTxPowerValid && ((getIdleTimeMillis() >= 0) && (getSleepTimeMillis() >= 0)
- && (getReceiveTimeMillis() >= 0) && !isEmpty());
+ if (mActivityStatsTechSpecificInfo == null) {
+ return false;
+ } else {
+ boolean isTxPowerValid = true;
+ boolean isRxPowerValid = true;
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ if (!mActivityStatsTechSpecificInfo[i].isTxPowerValid()) {
+ isTxPowerValid = false;
+ }
+ if (!mActivityStatsTechSpecificInfo[i].isRxPowerValid()) {
+ isRxPowerValid = false;
+ }
+ }
+ return isTxPowerValid
+ && isRxPowerValid
+ && ((getIdleTimeMillis() >= 0) && (getSleepTimeMillis() >= 0) && !isEmpty());
+ }
}
/** @hide */
@TestApi
public boolean isEmpty() {
- boolean isTxPowerEmpty = mTxTimeMs == null || mTxTimeMs.length == 0
- || Arrays.stream(mTxTimeMs).allMatch((i) -> i == 0);
-
- return isTxPowerEmpty && ((getIdleTimeMillis() == 0) && (getSleepTimeMillis() == 0)
- && (getReceiveTimeMillis() == 0));
+ boolean isTxPowerEmpty = false;
+ boolean isRxPowerEmpty = false;
+ for (int i = 0; i < getSpecificInfoLength(); i++) {
+ if (mActivityStatsTechSpecificInfo[i].isTxPowerEmpty()) {
+ isTxPowerEmpty = true;
+ }
+ if (mActivityStatsTechSpecificInfo[i].isRxPowerEmpty()) {
+ isRxPowerEmpty = true;
+ }
+ }
+ return isTxPowerEmpty
+ && ((getIdleTimeMillis() == 0) && (getSleepTimeMillis() == 0) && isRxPowerEmpty);
}
-
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -348,14 +589,15 @@
return mTimestamp == that.mTimestamp
&& mSleepTimeMs == that.mSleepTimeMs
&& mIdleTimeMs == that.mIdleTimeMs
- && mRxTimeMs == that.mRxTimeMs
- && Arrays.equals(mTxTimeMs, that.mTxTimeMs);
+ && mSizeOfSpecificInfo == that.mSizeOfSpecificInfo
+ && Arrays.equals(
+ mActivityStatsTechSpecificInfo, that.mActivityStatsTechSpecificInfo);
}
@Override
public int hashCode() {
- int result = Objects.hash(mTimestamp, mSleepTimeMs, mIdleTimeMs, mRxTimeMs);
- result = 31 * result + Arrays.hashCode(mTxTimeMs);
+ int result = Objects.hash(mTimestamp, mSleepTimeMs, mIdleTimeMs, mTotalRxTimeMs);
+ result = 31 * result + Arrays.hashCode(mTotalTxTimeMs);
return result;
}
}
diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java
index c18443e..c701e44 100644
--- a/telephony/java/android/telephony/NetworkRegistrationInfo.java
+++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java
@@ -242,13 +242,16 @@
* @param cellIdentity The identity representing a unique cell or wifi AP. Set to null if the
* information is not available.
* @param rplmn the registered plmn or the last plmn for attempted registration if reg failed.
+ * @param voiceSpecificInfo Voice specific registration information.
+ * @param dataSpecificInfo Data specific registration information.
*/
private NetworkRegistrationInfo(@Domain int domain, @TransportType int transportType,
- @RegistrationState int registrationState,
- @NetworkType int accessNetworkTechnology, int rejectCause,
- boolean emergencyOnly,
- @Nullable @ServiceType List<Integer> availableServices,
- @Nullable CellIdentity cellIdentity, @Nullable String rplmn) {
+ @RegistrationState int registrationState,
+ @NetworkType int accessNetworkTechnology, int rejectCause,
+ boolean emergencyOnly, @Nullable @ServiceType List<Integer> availableServices,
+ @Nullable CellIdentity cellIdentity, @Nullable String rplmn,
+ @Nullable VoiceSpecificRegistrationInfo voiceSpecificInfo,
+ @Nullable DataSpecificRegistrationInfo dataSpecificInfo) {
mDomain = domain;
mTransportType = transportType;
mRegistrationState = registrationState;
@@ -262,6 +265,10 @@
mEmergencyOnly = emergencyOnly;
mNrState = NR_STATE_NONE;
mRplmn = rplmn;
+ mVoiceSpecificInfo = voiceSpecificInfo;
+ mDataSpecificInfo = dataSpecificInfo;
+
+ updateNrState();
}
/**
@@ -276,10 +283,9 @@
boolean cssSupported, int roamingIndicator, int systemIsInPrl,
int defaultRoamingIndicator) {
this(domain, transportType, registrationState, accessNetworkTechnology, rejectCause,
- emergencyOnly, availableServices, cellIdentity, rplmn);
-
- mVoiceSpecificInfo = new VoiceSpecificRegistrationInfo(cssSupported, roamingIndicator,
- systemIsInPrl, defaultRoamingIndicator);
+ emergencyOnly, availableServices, cellIdentity, rplmn,
+ new VoiceSpecificRegistrationInfo(cssSupported, roamingIndicator,
+ systemIsInPrl, defaultRoamingIndicator), null);
}
/**
@@ -295,11 +301,9 @@
boolean isNrAvailable, boolean isEndcAvailable,
@Nullable VopsSupportInfo vopsSupportInfo) {
this(domain, transportType, registrationState, accessNetworkTechnology, rejectCause,
- emergencyOnly, availableServices, cellIdentity, rplmn);
- mDataSpecificInfo = new DataSpecificRegistrationInfo(
- maxDataCalls, isDcNrRestricted, isNrAvailable,
- isEndcAvailable, vopsSupportInfo);
- updateNrState();
+ emergencyOnly, availableServices, cellIdentity, rplmn, null,
+ new DataSpecificRegistrationInfo(maxDataCalls, isDcNrRestricted, isNrAvailable,
+ isEndcAvailable, vopsSupportInfo));
}
private NetworkRegistrationInfo(Parcel source) {
@@ -804,6 +808,12 @@
@NonNull
private String mRplmn = "";
+ @Nullable
+ private DataSpecificRegistrationInfo mDataSpecificRegistrationInfo;
+
+ @Nullable
+ private VoiceSpecificRegistrationInfo mVoiceSpecificRegistrationInfo;
+
/**
* Default constructor for Builder.
*/
@@ -930,6 +940,30 @@
}
/**
+ * Set voice specific registration information.
+ *
+ * @param info The voice specific registration information.
+ * @return The builder.
+ * @hide
+ */
+ public @NonNull Builder setVoiceSpecificInfo(@NonNull VoiceSpecificRegistrationInfo info) {
+ mVoiceSpecificRegistrationInfo = info;
+ return this;
+ }
+
+ /**
+ * Set data specific registration information.
+ *
+ * @param info The data specific registration information.
+ * @return The builder.
+ * @hide
+ */
+ public @NonNull Builder setDataSpecificInfo(@NonNull DataSpecificRegistrationInfo info) {
+ mDataSpecificRegistrationInfo = info;
+ return this;
+ }
+
+ /**
* Build the NetworkRegistrationInfo.
* @return the NetworkRegistrationInfo object.
* @hide
@@ -938,7 +972,8 @@
public @NonNull NetworkRegistrationInfo build() {
return new NetworkRegistrationInfo(mDomain, mTransportType, mRegistrationState,
mAccessNetworkTechnology, mRejectCause, mEmergencyOnly, mAvailableServices,
- mCellIdentity, mRplmn);
+ mCellIdentity, mRplmn, mVoiceSpecificRegistrationInfo,
+ mDataSpecificRegistrationInfo);
}
}
}
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 70da9b9..6fe9bf9 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -19,6 +19,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
@@ -767,6 +768,10 @@
*
* @return long name of operator, null if unregistered or unknown
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
public String getOperatorAlphaLong() {
return mOperatorAlphaLong;
}
@@ -782,6 +787,10 @@
* @return long name of operator
* @hide
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q,
publicAlternatives = "Use {@link #getOperatorAlphaLong} instead.")
public String getVoiceOperatorAlphaLong() {
@@ -800,6 +809,10 @@
*
* @return short name of operator, null if unregistered or unknown
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
public String getOperatorAlphaShort() {
return mOperatorAlphaShort;
}
@@ -815,6 +828,10 @@
* @return short name of operator, null if unregistered or unknown
* @hide
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q,
publicAlternatives = "Use {@link #getOperatorAlphaShort} instead.")
public String getVoiceOperatorAlphaShort() {
@@ -832,6 +849,10 @@
* @return short name of operator, null if unregistered or unknown
* @hide
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q,
publicAlternatives = "Use {@link #getOperatorAlphaShort} instead.")
public String getDataOperatorAlphaShort() {
@@ -853,6 +874,10 @@
* @return name of operator, null if unregistered or unknown
* @hide
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
public String getOperatorAlpha() {
if (TextUtils.isEmpty(mOperatorAlphaLong)) {
return mOperatorAlphaShort;
@@ -878,6 +903,10 @@
* The country code can be decoded using
* {@link com.android.internal.telephony.MccTable#countryCodeForMcc(int)}.
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
public String getOperatorNumeric() {
return mOperatorNumeric;
}
@@ -893,6 +922,10 @@
* @return numeric format of operator, null if unregistered or unknown
* @hide
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public String getVoiceOperatorNumeric() {
return mOperatorNumeric;
@@ -909,6 +942,10 @@
* @return numeric format of operator, null if unregistered or unknown
* @hide
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q,
publicAlternatives = "Use {@link #getOperatorNumeric} instead.")
public String getDataOperatorNumeric() {
@@ -1168,7 +1205,15 @@
}
}
- private void init() {
+ /**
+ * Initialize the service state. Set everything to the default value.
+ *
+ * @param legacyMode {@code true} if the device is on IWLAN legacy mode, where IWLAN is
+ * considered as a RAT on WWAN {@link NetworkRegistrationInfo}. {@code false} if the device
+ * is on AP-assisted mode, where IWLAN should be reported through WLAN.
+ * {@link NetworkRegistrationInfo}.
+ */
+ private void init(boolean legacyMode) {
if (DBG) Rlog.d(LOG_TAG, "init");
mVoiceRegState = STATE_OUT_OF_SERVICE;
mDataRegState = STATE_OUT_OF_SERVICE;
@@ -1200,6 +1245,13 @@
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN)
.build());
+ if (!legacyMode) {
+ addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
+ .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
+ .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)
+ .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN)
+ .build());
+ }
}
mOperatorAlphaLongRaw = null;
mOperatorAlphaShortRaw = null;
@@ -1208,15 +1260,32 @@
}
public void setStateOutOfService() {
- init();
+ init(true);
}
public void setStateOff() {
- init();
+ init(true);
mVoiceRegState = STATE_POWER_OFF;
mDataRegState = STATE_POWER_OFF;
}
+ /**
+ * Set the service state to out-of-service
+ *
+ * @param legacyMode {@code true} if the device is on IWLAN legacy mode, where IWLAN is
+ * considered as a RAT on WWAN {@link NetworkRegistrationInfo}. {@code false} if the device
+ * is on AP-assisted mode, where IWLAN should be reported through WLAN.
+ * @param powerOff {@code true} if this is a power off case (i.e. Airplane mode on).
+ * @hide
+ */
+ public void setOutOfService(boolean legacyMode, boolean powerOff) {
+ init(legacyMode);
+ if (powerOff) {
+ mVoiceRegState = STATE_POWER_OFF;
+ mDataRegState = STATE_POWER_OFF;
+ }
+ }
+
public void setState(int state) {
setVoiceRegState(state);
if (DBG) Rlog.e(LOG_TAG, "[ServiceState] setState deprecated use setVoiceRegState()");
@@ -1747,8 +1816,17 @@
/**
* Get the CDMA NID (Network Identification Number), a number uniquely identifying a network
* within a wireless system. (Defined in 3GPP2 C.S0023 3.4.8)
+ *
+ * <p>Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return
+ * {@link #UNKNOWN_ID}.
+ *
* @return The CDMA NID or {@link #UNKNOWN_ID} if not available.
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
public int getCdmaNetworkId() {
return this.mNetworkId;
}
@@ -1756,8 +1834,17 @@
/**
* Get the CDMA SID (System Identification Number), a number uniquely identifying a wireless
* system. (Defined in 3GPP2 C.S0023 3.4.8)
+ *
+ * <p>Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return
+ * {@link #UNKNOWN_ID}.
+ *
* @return The CDMA SID or {@link #UNKNOWN_ID} if not available.
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION
+ })
public int getCdmaSystemId() {
return this.mSystemId;
}
@@ -2058,6 +2145,8 @@
state.mOperatorAlphaLong = null;
state.mOperatorAlphaShort = null;
state.mOperatorNumeric = null;
+ state.mSystemId = UNKNOWN_ID;
+ state.mNetworkId = UNKNOWN_ID;
return state;
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 613b0a6..f57c32c 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -6967,6 +6967,11 @@
*
* Input parameters equivalent to TS 27.007 AT+CCHO command.
*
+ * It is strongly recommended that callers of this should firstly create a new TelephonyManager
+ * instance by calling {@link TelephonyManager#createForSubscriptionId(int)}. Failure to do so
+ * can result in unpredictable and detrimental behavior like callers can end up talking to the
+ * wrong SIM card.
+ *
* <p>Requires Permission:
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
* app has carrier privileges (see {@link #hasCarrierPrivileges}).
@@ -7060,6 +7065,8 @@
}
} catch (RemoteException ex) {
} catch (NullPointerException ex) {
+ } catch (IllegalStateException ex) {
+ Rlog.e(TAG, "iccCloseLogicalChannel IllegalStateException", ex);
}
return false;
}
@@ -7107,6 +7114,10 @@
* Closes a previously opened logical channel to the ICC card.
*
* Input parameters equivalent to TS 27.007 AT+CCHC command.
+ * It is strongly recommended that callers of this API should firstly create
+ * new TelephonyManager instance by calling
+ * {@link TelephonyManager#createForSubscriptionId(int)}. Failure to do so can result in
+ * unpredictable and detrimental behavior like callers can end up talking to the wrong SIM card.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
@@ -7115,6 +7126,7 @@
* @param channel is the channel id to be closed as returned by a successful
* iccOpenLogicalChannel.
* @return true if the channel was closed successfully.
+ * @throws IllegalArgumentException if input parameters are wrong. e.g., invalid channel
*/
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
public boolean iccCloseLogicalChannel(int channel) {
@@ -7122,8 +7134,6 @@
return iccCloseLogicalChannel(getSubId(), channel);
} catch (IllegalStateException ex) {
Rlog.e(TAG, "iccCloseLogicalChannel IllegalStateException", ex);
- } catch (IllegalArgumentException ex) {
- Rlog.e(TAG, "iccCloseLogicalChannel IllegalArgumentException", ex);
}
return false;
}
@@ -7154,6 +7164,8 @@
}
} catch (RemoteException ex) {
} catch (NullPointerException ex) {
+ } catch (IllegalStateException ex) {
+ Rlog.e(TAG, "iccCloseLogicalChannel IllegalStateException", ex);
}
return false;
}
@@ -7255,6 +7267,11 @@
*
* Input parameters equivalent to TS 27.007 AT+CGLA command.
*
+ * It is strongly recommended that callers of this API should firstly create a new
+ * TelephonyManager instance by calling
+ * {@link TelephonyManager#createForSubscriptionId(int)}. Failure to do so can result in
+ * unpredictable and detrimental behavior like callers can end up talking to the wrong SIM card.
+ *
* <p>Requires Permission:
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
* app has carrier privileges (see {@link #hasCarrierPrivileges}).
diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java
index a49a61b5..b6ae530 100644
--- a/telephony/java/android/telephony/euicc/EuiccManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccManager.java
@@ -25,15 +25,20 @@
import android.annotation.SystemApi;
import android.app.Activity;
import android.app.PendingIntent;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;
+import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccCardManager.ResetOption;
+import android.util.Log;
import com.android.internal.telephony.euicc.IEuiccController;
@@ -57,6 +62,7 @@
*/
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_EUICC)
public class EuiccManager {
+ private static final String TAG = "EuiccManager";
/**
* Intent action to launch the embedded SIM (eUICC) management settings screen.
@@ -811,6 +817,14 @@
*/
public static final int ERROR_INVALID_PORT = 10017;
+ /**
+ * Apps targeting on Android T and beyond will get exception whenever switchToSubscription
+ * without portIndex is called for disable subscription.
+ * @hide
+ */
+ @ChangeId
+ @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
+ public static final long SWITCH_WITHOUT_PORT_INDEX_EXCEPTION_ON_DISABLE = 218393363L;
private final Context mContext;
private int mCardId;
@@ -1127,7 +1141,7 @@
* intent to prompt the user to accept the download. The caller should also be authorized to
* manage the subscription to be enabled.
*
- * <p> From Android T, devices might support MEP(Multiple Enabled Profile), the subscription
+ * <p> From Android T, devices might support MEP(Multiple Enabled Profiles), the subscription
* can be installed on different port from the eUICC. Calling apps with carrier privilege
* (see {@link TelephonyManager#hasCarrierPrivileges}) over the currently active subscriptions
* can use {@link #switchToSubscription(int, int, PendingIntent)} to specify which port to
@@ -1138,10 +1152,12 @@
*
* @param subscriptionId the ID of the subscription to enable. May be
* {@link android.telephony.SubscriptionManager#INVALID_SUBSCRIPTION_ID} to deactivate the
- * current profile without activating another profile to replace it. If it's a disable
- * operation, requires the {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS}
- * permission, or the calling app must be authorized to manage the active subscription on
- * the target eUICC.
+ * current profile without activating another profile to replace it. Calling apps targeting
+ * on android T must use {@link #switchToSubscription(int, int, PendingIntent)} API for
+ * disable profile, port index can be found from {@link SubscriptionInfo#getPortIndex()}.
+ * If it's a disable operation, requires the
+ * {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission, or the
+ * calling app must be authorized to manage the active subscription on the target eUICC.
* @param callbackIntent a PendingIntent to launch when the operation completes.
*/
@RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
@@ -1151,6 +1167,18 @@
return;
}
try {
+ // TODO: Uncomment below compat change code once callers are ported to use
+ // switchToSubscription with portIndex for disable operation.
+ // if (subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ // && getIEuiccController().isCompatChangeEnabled(mContext.getOpPackageName(),
+ // SWITCH_WITHOUT_PORT_INDEX_EXCEPTION_ON_DISABLE)) {
+ // // Apps targeting on Android T and beyond will get exception whenever
+ // // switchToSubscription without portIndex is called with INVALID_SUBSCRIPTION_ID.
+ // Log.e(TAG, "switchToSubscription without portIndex is not allowed for"
+ // + " disable operation");
+ // throw new IllegalArgumentException("Must use switchToSubscription with portIndex"
+ // + " API for disable operation");
+ // }
getIEuiccController().switchToSubscription(mCardId,
subscriptionId, mContext.getOpPackageName(), callbackIntent);
} catch (RemoteException e) {
@@ -1180,7 +1208,10 @@
* current profile without activating another profile to replace it. If it's a disable
* operation, requires the {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS}
* permission, or the calling app must be authorized to manage the active subscription on
- * the target eUICC.
+ * the target eUICC. From Android T, multiple enabled profiles is supported. Calling apps
+ * targeting on android T must use {@link #switchToSubscription(int, int, PendingIntent)}
+ * API for disable profile, port index can be found from
+ * {@link SubscriptionInfo#getPortIndex()}.
* @param portIndex the index of the port to target for the enabled subscription
* @param callbackIntent a PendingIntent to launch when the operation completes.
*/
@@ -1192,6 +1223,17 @@
return;
}
try {
+ boolean canWriteEmbeddedSubscriptions = mContext.checkCallingOrSelfPermission(
+ Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
+ == PackageManager.PERMISSION_GRANTED;
+ // If the caller is not privileged caller and does not have the carrier privilege over
+ // any active subscription, do not continue.
+ if (!canWriteEmbeddedSubscriptions && !getIEuiccController()
+ .hasCarrierPrivilegesForPackageOnAnyPhone(mContext.getOpPackageName())) {
+ Log.e(TAG, "Not permitted to use switchToSubscription with portIndex");
+ throw new SecurityException(
+ "Must have carrier privileges to use switchToSubscription with portIndex");
+ }
getIEuiccController().switchToSubscriptionWithPort(mCardId,
subscriptionId, portIndex, mContext.getOpPackageName(), callbackIntent);
} catch (RemoteException e) {
diff --git a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
index dda95b1..19f1a5b 100644
--- a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
+++ b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
@@ -55,4 +55,6 @@
List<String> getSupportedCountries(boolean isSupported);
boolean isSupportedCountry(String countryIso);
boolean isSimPortAvailable(int cardId, int portIndex, String callingPackage);
+ boolean hasCarrierPrivilegesForPackageOnAnyPhone(String callingPackage);
+ boolean isCompatChangeEnabled(String callingPackage, long changeId);
}
diff --git a/tests/FlickerTests/AndroidTest.xml b/tests/FlickerTests/AndroidTest.xml
index 98d13e8..566c725 100644
--- a/tests/FlickerTests/AndroidTest.xml
+++ b/tests/FlickerTests/AndroidTest.xml
@@ -26,16 +26,8 @@
<option name="shell-timeout" value="6600s" />
<option name="test-timeout" value="6600s" />
<option name="hidden-api-checks" value="false" />
- <option name="device-listeners"
- value="com.android.server.wm.flicker.TraceFileReadyListener" />
</test>
<metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
- <option name="pull-pattern-keys" value="(\w)+\.winscope" />
- <option name="pull-pattern-keys" value="(\w)+\.mp4" />
- <option name="collect-on-run-ended-only" value="false" />
- <option name="clean-up" value="true" />
- </metrics_collector>
- <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
<option name="directory-keys" value="/sdcard/flicker" />
<option name="collect-on-run-ended-only" value="true" />
<option name="clean-up" value="true" />
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeAndDialogThemeAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeAndDialogThemeAppTest.kt
index 429541c..71e576a 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeAndDialogThemeAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeAndDialogThemeAppTest.kt
@@ -44,6 +44,7 @@
@RunWith(Parameterized::class)
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@FlakyTest(bugId = 219749605)
class LaunchAppShowImeAndDialogThemeAppTest(private val testSpec: FlickerTestParameter) {
private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
private val testApp = ImeAppAutoFocusHelper(instrumentation, testSpec.startRotation)
@@ -119,4 +120,4 @@
)
}
}
-}
\ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
index 5f0176e..ba5698c 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
@@ -61,6 +61,7 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group2
+@FlakyTest(bugId = 219757170)
class ReOpenImeWindowTest(private val testSpec: FlickerTestParameter) {
private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
private val testApp = ImeAppAutoFocusHelper(instrumentation, testSpec.startRotation)
@@ -87,7 +88,7 @@
}
transitions {
device.reopenAppFromOverview(wmHelper)
- wmHelper.waitImeShown()
+ require(wmHelper.waitImeShown()) { "IME didn't show in time" }
}
teardown {
test {
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
index 065b1c2..f834820 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
@@ -16,16 +16,19 @@
package com.android.server.wm.flicker.launch
-import android.platform.test.annotations.Presubmit
import androidx.test.filters.FlakyTest
-import androidx.test.filters.RequiresDevice
+import android.platform.test.annotations.Presubmit
+import android.platform.test.annotations.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group1
-import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.rules.RemoveAllTasksButHomeRule.Companion.removeAllTasksButHome
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -54,7 +57,13 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppFromLauncherTransition(testSpec) {
+open class OpenAppColdTest(testSpec: FlickerTestParameter)
+ : OpenAppFromLauncherTransition(testSpec) {
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
/**
* Defines the transition used to run the test
*/
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest_ShellTransit.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest_ShellTransit.kt
new file mode 100644
index 0000000..0d2869c
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest_ShellTransit.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.launch
+
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group1
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test cold launching an app from launcher
+ *
+ * To run this test: `atest FlickerTests:OpenAppColdTest`
+ *
+ * Actions:
+ * Make sure no apps are running on the device
+ * Launch an app [testApp] and wait animation to complete
+ *
+ * Notes:
+ * 1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ * are inherited [OpenAppTransition]
+ * 2. Part of the test setup occurs automatically via
+ * [com.android.server.wm.flicker.TransitionRunnerWithRules],
+ * including configuring navigation mode, initial orientation and ensuring no
+ * apps are running before setup
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group1
+@FlakyTest(bugId = 219688533)
+class OpenAppColdTest_ShellTransit(testSpec: FlickerTestParameter) : OpenAppColdTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
index 797919b..00fee82 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
@@ -16,22 +16,22 @@
package com.android.server.wm.flicker.launch
-import android.platform.test.annotations.Presubmit
-import android.view.Display
import androidx.test.filters.FlakyTest
-import androidx.test.filters.RequiresDevice
+import android.platform.test.annotations.Presubmit
+import android.platform.test.annotations.RequiresDevice
+import android.view.Display
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.LAUNCHER_COMPONENT
import com.android.server.wm.flicker.annotation.Group1
-import com.android.server.wm.flicker.helpers.reopenAppFromOverview
-import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import com.android.server.wm.flicker.helpers.reopenAppFromOverview
+import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.traces.common.WindowManagerConditionsFactory
import org.junit.Assume.assumeFalse
-import org.junit.Assume.assumeTrue
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -62,8 +62,13 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppFromOverviewTest(testSpec: FlickerTestParameter)
+open class OpenAppFromOverviewTest(testSpec: FlickerTestParameter)
: OpenAppFromLauncherTransition(testSpec) {
+ @Before
+ open fun before() {
+ assumeFalse(isShellTransitionsEnabled)
+ }
+
/**
* Defines the transition used to run the test
*/
@@ -134,37 +139,6 @@
@Test
override fun appWindowBecomesVisible() = super.appWindowBecomesVisible_warmStart()
- /** {@inheritDoc} */
- @Presubmit
- @Test
- override fun appWindowReplacesLauncherAsTopWindow() {
- assumeFalse(isShellTransitionsEnabled)
- super.appWindowReplacesLauncherAsTopWindow()
- }
-
- @FlakyTest(bugId = 216266712)
- @Test
- fun appWindowReplacesLauncherAsTopWindow_shellTransit() {
- assumeTrue(isShellTransitionsEnabled)
- super.appWindowReplacesLauncherAsTopWindow()
- }
-
- /** {@inheritDoc} */
- @Presubmit
- @Test
- override fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
- assumeFalse(isShellTransitionsEnabled)
- super.visibleWindowsShownMoreThanOneConsecutiveEntry()
- }
-
- /** {@inheritDoc} */
- @FlakyTest(bugId = 218470989)
- @Test
- fun visibleWindowsShownMoreThanOneConsecutiveEntry_shellTransit() {
- assumeTrue(isShellTransitionsEnabled)
- super.visibleWindowsShownMoreThanOneConsecutiveEntry()
- }
-
companion object {
/**
* Creates the test configurations.
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest_ShellTransit.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest_ShellTransit.kt
new file mode 100644
index 0000000..1c06495
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest_ShellTransit.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.launch
+
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group1
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test launching an app from the recents app view (the overview)
+ *
+ * To run this test: `atest FlickerTests:OpenAppFromOverviewTest`
+ *
+ * Actions:
+ * Launch [testApp]
+ * Press recents
+ * Relaunch an app [testApp] by selecting it in the overview screen, and wait animation to
+ * complete (only this action is traced)
+ *
+ * Notes:
+ * 1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ * are inherited [OpenAppTransition]
+ * 2. Part of the test setup occurs automatically via
+ * [com.android.server.wm.flicker.TransitionRunnerWithRules],
+ * including configuring navigation mode, initial orientation and ensuring no
+ * apps are running before setup
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group1
+@FlakyTest(bugId = 219688533)
+class OpenAppFromOverviewTest_ShellTransit(testSpec: FlickerTestParameter)
+ : OpenAppFromOverviewTest(testSpec) {
+ @Before
+ override fun before() {
+ assumeTrue(isShellTransitionsEnabled)
+ }
+
+ /** {@inheritDoc} */
+ @FlakyTest(bugId = 216266712)
+ @Test
+ override fun appWindowReplacesLauncherAsTopWindow() =
+ super.appWindowReplacesLauncherAsTopWindow()
+
+ /** {@inheritDoc} */
+ @FlakyTest(bugId = 218470989)
+ @Test
+ override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
+ super.visibleWindowsShownMoreThanOneConsecutiveEntry()
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
index f75c50e..b0e53e9 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
@@ -16,19 +16,22 @@
package com.android.server.wm.flicker.launch
+import androidx.test.filters.FlakyTest
import android.platform.test.annotations.Postsubmit
import android.platform.test.annotations.Presubmit
+import android.platform.test.annotations.RequiresDevice
import android.view.Surface
import android.view.WindowManagerPolicyConstants
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group1
import com.android.server.wm.flicker.helpers.NonResizeableAppHelper
import com.android.server.wm.flicker.helpers.WindowUtils
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.traces.common.FlickerComponentName
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -57,11 +60,16 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppNonResizeableTest(testSpec: FlickerTestParameter)
+open class OpenAppNonResizeableTest(testSpec: FlickerTestParameter)
: OpenAppFromLockTransition(testSpec) {
override val testApp = NonResizeableAppHelper(instrumentation)
private val colorFadComponent = FlickerComponentName("", "ColorFade BLAST#")
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
/**
* Checks that the nav bar layer starts invisible, becomes visible during unlocking animation
* and remains visible at the end
@@ -148,6 +156,11 @@
@Test
override fun entireScreenCovered() = super.entireScreenCovered()
+ @FlakyTest(bugId = 218470989)
+ @Test
+ override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
+ super.visibleWindowsShownMoreThanOneConsecutiveEntry()
+
companion object {
/**
* Creates the test configurations.
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest_ShellTransit.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest_ShellTransit.kt
new file mode 100644
index 0000000..8a08d07
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest_ShellTransit.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.server.wm.flicker.launch
+
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group1
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test launching an app while the device is locked
+ *
+ * To run this test: `atest FlickerTests:OpenAppNonResizeableTest`
+ *
+ * Actions:
+ * Lock the device.
+ * Launch an app on top of the lock screen [testApp] and wait animation to complete
+ *
+ * Notes:
+ * 1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ * are inherited [OpenAppTransition]
+ * 2. Part of the test setup occurs automatically via
+ * [com.android.server.wm.flicker.TransitionRunnerWithRules],
+ * including configuring navigation mode, initial orientation and ensuring no
+ * apps are running before setup
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group1
+@FlakyTest(bugId = 219688533)
+class OpenAppNonResizeableTest_ShellTransit(testSpec: FlickerTestParameter)
+ : OpenAppNonResizeableTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt
index d2f6c7f1..53560cc 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt
@@ -17,7 +17,7 @@
package com.android.server.wm.flicker.launch
import android.app.Instrumentation
-import android.platform.test.annotations.FlakyTest
+import androidx.test.filters.FlakyTest
import android.platform.test.annotations.Presubmit
import androidx.test.platform.app.InstrumentationRegistry
import com.android.server.wm.flicker.FlickerBuilderProvider
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
index 3159bf1..2562098 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
@@ -17,14 +17,17 @@
package com.android.server.wm.flicker.launch
import android.platform.test.annotations.Presubmit
+import android.platform.test.annotations.RequiresDevice
import androidx.test.filters.FlakyTest
-import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group1
-import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import com.android.server.wm.flicker.helpers.setRotation
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -54,8 +57,13 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppWarmTest(testSpec: FlickerTestParameter)
+open class OpenAppWarmTest(testSpec: FlickerTestParameter)
: OpenAppFromLauncherTransition(testSpec) {
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
/**
* Defines the transition used to run the test
*/
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest_ShellTransit.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest_ShellTransit.kt
new file mode 100644
index 0000000..3958dd2
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest_ShellTransit.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.launch
+
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group1
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test warm launching an app from launcher
+ *
+ * To run this test: `atest FlickerTests:OpenAppWarmTest`
+ *
+ * Actions:
+ * Launch [testApp]
+ * Press home
+ * Relaunch an app [testApp] and wait animation to complete (only this action is traced)
+ *
+ * Notes:
+ * 1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ * are inherited [OpenAppTransition]
+ * 2. Part of the test setup occurs automatically via
+ * [com.android.server.wm.flicker.TransitionRunnerWithRules],
+ * including configuring navigation mode, initial orientation and ensuring no
+ * apps are running before setup
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group1
+@FlakyTest(bugId = 219688533)
+class OpenAppWarmTest_ShellTransit(testSpec: FlickerTestParameter)
+ : OpenAppWarmTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
index 5301e02..f21b1d6 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
@@ -33,12 +33,15 @@
import com.android.server.wm.flicker.helpers.NonResizeableAppHelper
import com.android.server.wm.flicker.helpers.SimpleAppHelper
import com.android.server.wm.flicker.helpers.WindowUtils
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.navBarLayerIsVisible
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.navBarWindowIsVisible
import com.android.server.wm.flicker.statusBarLayerIsVisible
import com.android.server.wm.flicker.statusBarWindowIsVisible
import com.android.server.wm.traces.common.FlickerComponentName
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -61,7 +64,7 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class QuickSwitchBetweenTwoAppsBackTest(private val testSpec: FlickerTestParameter) {
+open class QuickSwitchBetweenTwoAppsBackTest(private val testSpec: FlickerTestParameter) {
private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
private val testApp1 = SimpleAppHelper(instrumentation)
@@ -69,6 +72,11 @@
private val startDisplayBounds = WindowUtils.getDisplayBounds(testSpec.startRotation)
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
@FlickerBuilderProvider
fun buildFlicker(): FlickerBuilder {
return FlickerBuilder(instrumentation).apply {
@@ -326,4 +334,4 @@
)
}
}
-}
\ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest_ShellTransit.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest_ShellTransit.kt
new file mode 100644
index 0000000..cffed81
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest_ShellTransit.kt
@@ -0,0 +1,55 @@
+/*
+ * 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.server.wm.flicker.quickswitch
+
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group1
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test quick switching back to previous app from last opened app
+ *
+ * To run this test: `atest FlickerTests:QuickSwitchBetweenTwoAppsBackTest`
+ *
+ * Actions:
+ * Launch an app [testApp1]
+ * Launch another app [testApp2]
+ * Swipe right from the bottom of the screen to quick switch back to the first app [testApp1]
+ *
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group1
+@FlakyTest(bugId = 219690120)
+class QuickSwitchBetweenTwoAppsBackTest_ShellTransit(testSpec: FlickerTestParameter)
+ : QuickSwitchBetweenTwoAppsBackTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
index f603f6e..2b944c6 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
@@ -112,10 +112,7 @@
* Checks that the [FlickerComponentName.ROTATION] layer appears during the transition,
* doesn't flicker, and disappears before the transition is complete
*/
- @Presubmit
- @Test
- fun rotationLayerAppearsAndVanishes() {
- Assume.assumeFalse(isShellTransitionsEnabled)
+ fun rotationLayerAppearsAndVanishesAssertion() {
testSpec.assertLayers {
this.isVisible(testApp.component)
.then()
@@ -126,11 +123,26 @@
}
}
+ /**
+ * Checks that the [FlickerComponentName.ROTATION] layer appears during the transition,
+ * doesn't flicker, and disappears before the transition is complete
+ */
+ @Presubmit
+ @Test
+ fun rotationLayerAppearsAndVanishes() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ rotationLayerAppearsAndVanishesAssertion()
+ }
+
+ /**
+ * Checks that the [FlickerComponentName.ROTATION] layer appears during the transition,
+ * doesn't flicker, and disappears before the transition is complete
+ */
@FlakyTest(bugId = 218484127)
@Test
fun rotationLayerAppearsAndVanishes_shellTransit() {
Assume.assumeTrue(isShellTransitionsEnabled)
- rotationLayerAppearsAndVanishes()
+ rotationLayerAppearsAndVanishesAssertion()
}
/**
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt
index d1bdeed..0becadf 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt
@@ -153,4 +153,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
index 3ae484b..15fd5e1 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
@@ -17,17 +17,20 @@
package com.android.server.wm.flicker.rotation
import android.platform.test.annotations.Presubmit
+import android.platform.test.annotations.RequiresDevice
import android.view.WindowManager
import androidx.test.filters.FlakyTest
-import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.helpers.SeamlessRotationAppHelper
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.testapp.ActivityOptions
import com.android.server.wm.traces.common.FlickerComponentName
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -76,11 +79,16 @@
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group3
-class SeamlessAppRotationTest(
+open class SeamlessAppRotationTest(
testSpec: FlickerTestParameter
) : RotationTransition(testSpec) {
override val testApp = SeamlessRotationAppHelper(instrumentation)
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
override val transition: FlickerBuilder.() -> Unit
get() = {
super.transition(this)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest_ShellTransit.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest_ShellTransit.kt
new file mode 100644
index 0000000..d397d59
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest_ShellTransit.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.rotation
+
+import androidx.test.filters.FlakyTest
+import android.platform.test.annotations.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group3
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test opening an app and cycling through app rotations using seamless rotations
+ *
+ * Currently runs:
+ * 0 -> 90 degrees
+ * 0 -> 90 degrees (with starved UI thread)
+ * 90 -> 0 degrees
+ * 90 -> 0 degrees (with starved UI thread)
+ *
+ * Actions:
+ * Launch an app in fullscreen and supporting seamless rotation (via intent)
+ * Set initial device orientation
+ * Start tracing
+ * Change device orientation
+ * Stop tracing
+ *
+ * To run this test: `atest FlickerTests:SeamlessAppRotationTest`
+ *
+ * To run only the presubmit assertions add: `--
+ * --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
+ * --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Presubmit`
+ *
+ * To run only the postsubmit assertions add: `--
+ * --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
+ * --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Postsubmit`
+ *
+ * To run only the flaky assertions add: `--
+ * --module-arg FlickerTests:include-annotation:androidx.test.filters.FlakyTest`
+ *
+ * Notes:
+ * 1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ * are inherited [RotationTransition]
+ * 2. Part of the test setup occurs automatically via
+ * [com.android.server.wm.flicker.TransitionRunnerWithRules],
+ * including configuring navigation mode, initial orientation and ensuring no
+ * apps are running before setup
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group3
+@FlakyTest(bugId = 219689723)
+class SeamlessAppRotationTest_ShellTransit(
+ testSpec: FlickerTestParameter
+) : SeamlessAppRotationTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/tests/Internal/src/com/android/internal/util/UserIconsTest.java b/tests/Internal/src/com/android/internal/util/UserIconsTest.java
new file mode 100644
index 0000000..cc7b20b
--- /dev/null
+++ b/tests/Internal/src/com/android/internal/util/UserIconsTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.internal.util;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+
+import androidx.test.InstrumentationRegistry;
+
+import com.android.internal.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class UserIconsTest {
+
+ @Test
+ public void convertToBitmapAtUserIconSize_sizeIsCorrect() {
+ Resources res = InstrumentationRegistry.getTargetContext().getResources();
+ Drawable icon = UserIcons.getDefaultUserIcon(res, 0, true);
+ Bitmap bitmap = UserIcons.convertToBitmapAtUserIconSize(res, icon);
+ int expectedSize = res.getDimensionPixelSize(R.dimen.user_icon_size);
+
+ assertThat(bitmap.getWidth()).isEqualTo(expectedSize);
+ assertThat(bitmap.getHeight()).isEqualTo(expectedSize);
+ }
+
+}
diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp
index 7906f09..cce0dde 100644
--- a/tests/StagedInstallTest/Android.bp
+++ b/tests/StagedInstallTest/Android.bp
@@ -62,6 +62,7 @@
":TestAppAv1",
":test.rebootless_apex_v1",
":test.rebootless_apex_v2",
+ ":test_com.android.server",
],
test_suites: ["general-tests"],
test_config: "StagedInstallInternalTest.xml",
diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
index e9300da..7490d3f 100644
--- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
@@ -34,6 +34,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.StagedApexInfo;
import android.os.IBinder;
import android.os.ServiceManager;
@@ -79,6 +80,8 @@
TEST_APEX_PACKAGE_NAME, 1, /*isApex=*/true,
"apex.apexd_test_classpath.apex");
+ private static final String TEST_APEX_SYSTEM_SERVER_PACKAGE_NAME = "test_com.android.server";
+
private File mTestStateFile = new File(
InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(),
"stagedinstall_state");
@@ -480,6 +483,16 @@
InstallUtils.openPackageInstallerSession(sessionId).abandon();
}
+ @Test
+ public void testGetAppInfo_flagTestOnlyIsSet() throws Exception {
+ final PackageManager pm =
+ InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
+ final ApplicationInfo info = pm.getApplicationInfo(TEST_APEX_SYSTEM_SERVER_PACKAGE_NAME,
+ ApplicationInfoFlags.of(PackageManager.MATCH_APEX));
+ assertThat(info).isNotNull();
+ assertThat((info.flags & ApplicationInfo.FLAG_TEST_ONLY) != 0).isTrue();
+ }
+
public static class MockStagedApexObserver extends IStagedApexObserver.Stub {
@Override
public void onApexStaged(ApexStagedEvent event) {
diff --git a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
index f06fa81e..f60b4d6 100644
--- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
@@ -62,6 +62,7 @@
private static final String APK_A = "TestAppAv1.apk";
private static final String APK_IN_APEX_TESTAPEX_NAME = "com.android.apex.apkrollback.test";
private static final String APEXD_TEST_APEX = "apex.apexd_test.apex";
+ private static final String FAKE_APEX_SYSTEM_SERVER_APEX = "test_com.android.server.apex";
private static final String TEST_VENDOR_APEX_ALLOW_LIST =
"/vendor/etc/sysconfig/test-vendor-apex-allow-list.xml";
@@ -513,6 +514,18 @@
}
@Test
+ @LargeTest
+ public void testGetAppInfo_flagTestOnlyIsSet() throws Exception {
+ assumeTrue("Device does not support updating APEX",
+ mHostUtils.isApexUpdateSupported());
+
+ pushTestApex(FAKE_APEX_SYSTEM_SERVER_APEX);
+ getDevice().reboot();
+
+ runPhase("testGetAppInfo_flagTestOnlyIsSet");
+ }
+
+ @Test
public void testStagedApexObserver() throws Exception {
assumeTrue("Device does not support updating APEX",
mHostUtils.isApexUpdateSupported());
diff --git a/tests/UpdatableSystemFontTest/Android.bp b/tests/UpdatableSystemFontTest/Android.bp
index c59a41e..9a9e42b 100644
--- a/tests/UpdatableSystemFontTest/Android.bp
+++ b/tests/UpdatableSystemFontTest/Android.bp
@@ -37,8 +37,6 @@
"vts",
],
data: [
- ":NotoSerif-Regular.ttf",
- ":NotoSerif-Bold.ttf",
":UpdatableSystemFontTestCertDer",
":UpdatableSystemFontTest_NotoColorEmoji.ttf",
":UpdatableSystemFontTest_NotoColorEmoji.sig",
@@ -48,7 +46,9 @@
":UpdatableSystemFontTest_NotoColorEmojiVPlus1.sig",
":UpdatableSystemFontTest_NotoColorEmojiVPlus2.ttf",
":UpdatableSystemFontTest_NotoColorEmojiVPlus2.sig",
+ ":UpdatableSystemFontTest_NotoSerif-Regular.ttf",
":UpdatableSystemFontTest_NotoSerif-Regular.sig",
+ ":UpdatableSystemFontTest_NotoSerif-Bold.ttf",
":UpdatableSystemFontTest_NotoSerif-Bold.sig",
],
sdk_version: "test_current",
diff --git a/tests/UpdatableSystemFontTest/AndroidTest.xml b/tests/UpdatableSystemFontTest/AndroidTest.xml
index 6effa7b..9e2a4b6 100644
--- a/tests/UpdatableSystemFontTest/AndroidTest.xml
+++ b/tests/UpdatableSystemFontTest/AndroidTest.xml
@@ -28,11 +28,7 @@
<target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
<option name="cleanup" value="true" />
<option name="push" value="UpdatableSystemFontTestCert.der->/data/local/tmp/UpdatableSystemFontTestCert.der" />
- <option name="push" value="NotoColorEmoji.ttf->/data/local/tmp/NotoColorEmoji.ttf" />
- <option name="push" value="NotoSerif-Regular.ttf->/data/local/tmp/NotoSerif-Regular.ttf" />
- <option name="push" value="NotoSerif-Bold.ttf->/data/local/tmp/NotoSerif-Bold.ttf" />
- <option name="push" value="UpdatableSystemFontTest_NotoSerif-Regular.sig->/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Regular.sig" />
- <option name="push" value="UpdatableSystemFontTest_NotoSerif-Bold.sig->/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Bold.sig" />
+ <option name="push" value="UpdatableSystemFontTest_NotoColorEmoji.ttf->/data/local/tmp/UpdatableSystemFontTest_NotoColorEmoji.ttf" />
<option name="push" value="UpdatableSystemFontTest_NotoColorEmoji.sig->/data/local/tmp/UpdatableSystemFontTest_NotoColorEmoji.sig" />
<option name="push" value="UpdatableSystemFontTest_NotoColorEmojiV0.ttf->/data/local/tmp/UpdatableSystemFontTest_NotoColorEmojiV0.ttf" />
<option name="push" value="UpdatableSystemFontTest_NotoColorEmojiV0.sig->/data/local/tmp/UpdatableSystemFontTest_NotoColorEmojiV0.sig" />
@@ -40,6 +36,10 @@
<option name="push" value="UpdatableSystemFontTest_NotoColorEmojiVPlus1.sig->/data/local/tmp/UpdatableSystemFontTest_NotoColorEmojiVPlus1.sig" />
<option name="push" value="UpdatableSystemFontTest_NotoColorEmojiVPlus2.ttf->/data/local/tmp/UpdatableSystemFontTest_NotoColorEmojiVPlus2.ttf" />
<option name="push" value="UpdatableSystemFontTest_NotoColorEmojiVPlus2.sig->/data/local/tmp/UpdatableSystemFontTest_NotoColorEmojiVPlus2.sig" />
+ <option name="push" value="UpdatableSystemFontTest_NotoSerif-Regular.ttf->/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Regular.ttf" />
+ <option name="push" value="UpdatableSystemFontTest_NotoSerif-Regular.sig->/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Regular.sig" />
+ <option name="push" value="UpdatableSystemFontTest_NotoSerif-Bold.sig->/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Bold.sig" />
+ <option name="push" value="UpdatableSystemFontTest_NotoSerif-Bold.ttf->/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Bold.ttf" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
diff --git a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
index 87fda0d..cbe13d9 100644
--- a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
+++ b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
@@ -84,7 +84,7 @@
private static final String NOTO_COLOR_EMOJI_POSTSCRIPT_NAME = "NotoColorEmoji";
private static final String NOTO_COLOR_EMOJI_TTF =
- "/data/local/tmp/NotoColorEmoji.ttf";
+ "/data/local/tmp/UpdatableSystemFontTest_NotoColorEmoji.ttf";
private static final String NOTO_COLOR_EMOJI_SIG =
"/data/local/tmp/UpdatableSystemFontTest_NotoColorEmoji.sig";
// A font with revision == 0.
@@ -105,13 +105,13 @@
private static final String NOTO_SERIF_REGULAR_POSTSCRIPT_NAME = "NotoSerif";
private static final String NOTO_SERIF_REGULAR_TTF =
- "/data/local/tmp/NotoSerif-Regular.ttf";
+ "/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Regular.ttf";
private static final String NOTO_SERIF_REGULAR_SIG =
"/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Regular.sig";
private static final String NOTO_SERIF_BOLD_POSTSCRIPT_NAME = "NotoSerif-Bold";
private static final String NOTO_SERIF_BOLD_TTF =
- "/data/local/tmp/NotoSerif-Bold.ttf";
+ "/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Bold.ttf";
private static final String NOTO_SERIF_BOLD_SIG =
"/data/local/tmp/UpdatableSystemFontTest_NotoSerif-Bold.sig";
diff --git a/tests/UpdatableSystemFontTest/testdata/Android.bp b/tests/UpdatableSystemFontTest/testdata/Android.bp
index 64b698d..0bdb3a8 100644
--- a/tests/UpdatableSystemFontTest/testdata/Android.bp
+++ b/tests/UpdatableSystemFontTest/testdata/Android.bp
@@ -21,11 +21,19 @@
default_applicable_licenses: ["frameworks_base_license"],
}
-// An existing module name is reused to avoid merge conflicts.
-// TODO: fix the font file name.
filegroup {
name: "UpdatableSystemFontTest_NotoColorEmoji.ttf",
- srcs: ["NotoColorEmoji.ttf"],
+ srcs: ["UpdatableSystemFontTest_NotoColorEmoji.ttf"],
+}
+
+filegroup {
+ name: "UpdatableSystemFontTest_NotoSerif-Regular.ttf",
+ srcs: ["UpdatableSystemFontTest_NotoSerif-Regular.ttf"],
+}
+
+filegroup {
+ name: "UpdatableSystemFontTest_NotoSerif-Bold.ttf",
+ srcs: ["UpdatableSystemFontTest_NotoSerif-Bold.ttf"],
}
filegroup {
@@ -43,10 +51,6 @@
srcs: ["UpdatableSystemFontTestCert.der"],
}
-genrule_defaults {
- name: "updatable_system_font_increment_font_revision_default",
-}
-
genrule {
name: "UpdatableSystemFontTest_NotoColorEmojiV0.ttf",
srcs: [":UpdatableSystemFontTest_NotoColorEmoji.ttf"],
@@ -124,13 +128,13 @@
genrule {
name: "UpdatableSystemFontTest_NotoSerif-Regular.sig",
defaults: ["updatable_system_font_sig_gen_default"],
- srcs: [":NotoSerif-Regular.ttf"],
+ srcs: ["UpdatableSystemFontTest_NotoSerif-Regular.ttf"],
out: ["UpdatableSystemFontTest_NotoSerif-Regular.sig"],
}
genrule {
name: "UpdatableSystemFontTest_NotoSerif-Bold.sig",
defaults: ["updatable_system_font_sig_gen_default"],
- srcs: [":NotoSerif-Bold.ttf"],
+ srcs: ["UpdatableSystemFontTest_NotoSerif-Bold.ttf"],
out: ["UpdatableSystemFontTest_NotoSerif-Bold.sig"],
}
diff --git a/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttf b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoColorEmoji.ttf
similarity index 100%
rename from tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttf
rename to tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoColorEmoji.ttf
Binary files differ
diff --git a/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttx b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoColorEmoji.ttx
similarity index 100%
rename from tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttx
rename to tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoColorEmoji.ttx
diff --git a/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Bold.ttf b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Bold.ttf
new file mode 100644
index 0000000..66c1bd2
--- /dev/null
+++ b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Bold.ttf
Binary files differ
diff --git a/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Bold.ttx b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Bold.ttx
new file mode 100644
index 0000000..8c4215e
--- /dev/null
+++ b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Bold.ttx
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="a"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <!-- Currently NotoSerif-Bold.ttf's fontRevision is 1.xx.
+ 100.0 will be sufficiently larger than that. -->
+ <fontRevision value="100.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Wed Feb 16 12:00:00 2022"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="a" width="3000" lsb="93"/> <!-- 3em -->
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <!-- length will be calculated by the compiler. -->
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="0" language="0" nGroups="1">
+ <!-- The font must support at least one of the characters used
+ in OtfFontFileParser to validate the font. -->
+ <map code="0x61" name="a" />
+ </cmap_format_12>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="a" xMin="0" yMin="0" xMax="300" yMax="300">
+ <contour>
+ <pt x="0" y="0" on="1" />
+ <pt x="0" y="300" on="1" />
+ <pt x="300" y="300" on="1" />
+ <pt x="300" y="0" on="1" />
+ </contour>
+ <instructions />
+ </TTGlyph>
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2022 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Bold
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ <!-- Android identifies the target font to be updated by PostScript name.
+ To test updating NotoSerif-Bold.ttf, the PostScript needs to be
+ the same as NotoSerif-Bold.ttf here. -->
+ NotoSerif-Bold
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Regular.ttf b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Regular.ttf
new file mode 100644
index 0000000..707ae28
--- /dev/null
+++ b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Regular.ttf
Binary files differ
diff --git a/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Regular.ttx b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Regular.ttx
new file mode 100644
index 0000000..754eae3
--- /dev/null
+++ b/tests/UpdatableSystemFontTest/testdata/UpdatableSystemFontTest_NotoSerif-Regular.ttx
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="a"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <!-- Currently NotoSerif-Regular.ttf's fontRevision is 1.xx.
+ 100.0 will be sufficiently larger than that. -->
+ <fontRevision value="100.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Wed Feb 16 12:00:00 2022"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="a" width="3000" lsb="93"/> <!-- 3em -->
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <!-- length will be calculated by the compiler. -->
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="0" language="0" nGroups="1">
+ <!-- The font must support at least one of the characters used
+ in OtfFontFileParser to validate the font. -->
+ <map code="0x61" name="a" />
+ </cmap_format_12>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="a" xMin="0" yMin="0" xMax="300" yMax="300">
+ <contour>
+ <pt x="0" y="0" on="1" />
+ <pt x="0" y="300" on="1" />
+ <pt x="300" y="300" on="1" />
+ <pt x="300" y="0" on="1" />
+ </contour>
+ <instructions />
+ </TTGlyph>
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2022 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ <!-- Android identifies the target font to be updated by PostScript name.
+ To test updating NotoSerif-Regular.ttf, the PostScript needs to be
+ the same as NotoSerif-Regular.ttf here. -->
+ NotoSerif
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
index 978bf3e..7b1f7a5 100644
--- a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
+++ b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
@@ -174,7 +174,7 @@
private IntentFilter getIntentFilter() {
final ArgumentCaptor<IntentFilter> captor = ArgumentCaptor.forClass(IntentFilter.class);
- verify(mContext).registerReceiver(any(), captor.capture(), any(), any());
+ verify(mContext).registerReceiver(any(), captor.capture(), any(), any(), anyInt());
return captor.getValue();
}
@@ -258,7 +258,8 @@
eq(mTelephonySubscriptionTracker),
any(IntentFilter.class),
any(),
- eq(mHandler));
+ eq(mHandler),
+ eq(Context.RECEIVER_NOT_EXPORTED));
final IntentFilter filter = getIntentFilter();
assertEquals(2, filter.countActions());
assertTrue(filter.hasAction(ACTION_CARRIER_CONFIG_CHANGED));
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
index e547400..4cfa93b 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
@@ -307,7 +307,10 @@
ncCaptor.capture(),
lpCaptor.capture(),
any(),
- argThat(nac -> nac.getLegacyType() == ConnectivityManager.TYPE_MOBILE),
+ // Subtype integer/name and extras do not have getters; cannot be tested.
+ argThat(nac -> nac.getLegacyType() == ConnectivityManager.TYPE_MOBILE
+ && nac.getLegacyTypeName().equals(
+ VcnGatewayConnection.NETWORK_INFO_NETWORK_TYPE_STRING)),
any(),
any(),
any());